Spring MVC过滤器获取自定义jquery ajax标头

Posted

技术标签:

【中文标题】Spring MVC过滤器获取自定义jquery ajax标头【英文标题】:Spring MVC filter get custom jquery ajax header 【发布时间】:2014-08-23 15:01:01 【问题描述】:

这是交易,任何帮助将不胜感激,因为到目前为止我不知所措。

我在我的 jQuery.ajax 中设置自定义标题,如下所示:

$.ajax(
type:'GET',
url: url,
dataType: 'json',
headers: 
'customHeader': 'value',
, etc...

我正在使用带有自定义过滤器的 spring mvc 和 spring security 并获取如下标题:

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
        ServletException 
    HttpServletResponse httpResponse = (HttpServletResponse) response;
    HttpServletRequest httpRequest = (HttpServletRequest) request;
    httpResponse.setHeader("Access-Control-Allow-Origin", "*");
    String header = httpRequest.getHeader('customHeader');

不幸的是,标头始终为空,我尝试过在 ajax 调用中使用 beforeSend 之类的方法,效果仍然相同。任何人都可以请她对此有所了解吗?

Remote Address:127.0.0.1:8080 Request URL:http://localhost:8080/ecom/ws/session Request Method:OPTIONS Status Code:401 Unauthorized Request Headersview parsed OPTIONS /ecom/ws/session HTTP/1.1 Host: localhost:8080 Connection: keep-alive Access-Control-Request-Method: GET Origin: null User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/537.36 (Khtml, like Gecko) Chrome/35.0.1916.114 Safari/537.36 Access-Control-Request-Headers: accept, ecom_string_s3c, ecom_client_uuid, content-type Accept: */* Accept-Encoding: gzip,deflate,sdch Accept-Language: en-US,en;q=0.8,es;q=0.6 Response Headersview parsed HTTP/1.1 401 Unauthorized Date: Wed, 02 Jul 2014 18:15:03 GMT Access-Control-Allow-Origin: * Access-Control-Allow-Headers: ecom_string_s3c, ecom_client_uuid, content-type Content-Length: 0 Server: Jetty(6.1.26)

【问题讨论】:

为什么不在 ajax 调用中使用 data 而不是标头......不要重新发明*** :) 我基本上是在推出自己的 rest 身份验证实现,我需要将身份验证信息存储在标头中,并与 post 数据分开。 ***.com/questions/10093053/… 我看了好几次答案很模糊 基本上我需要知道如何从 httpServletRequest 访问我的 java 过滤器中的标头 【参考方案1】:

对于遇到同样问题的人,这是解决此问题的一个选项。

问题出在飞行前请求 (OPTIONS) 上。在您的自定义安全过滤器中,您不想检查这一点,因为自定义标头将与 OPTIONS 请求一起发送。 OPTION 请求仅用于检查允许哪些方法、来源、标头等。

在您的令牌授权自定义过滤器中,您可以过滤掉这些请求。一个快速的解决方案可能如下所示:

 if (methode.equals("OPTIONS")) 
        log.info("OPTIONS REQUEST NO FILTER");
        chain.doFilter(req, res);
     else 
      //Your filter
   

这样它会跳过您对 OPTION 请求的过滤器,并且您的真实请求将与您的 CORS 过滤器允许的标头一起发送。

祝你好运。

【讨论】:

是的,我找到解决方案后忘记回答这个问题了。你所建议的正是我所做的 这里的methode 是什么以及如何获取请求标头的方法来检查这种情况?

以上是关于Spring MVC过滤器获取自定义jquery ajax标头的主要内容,如果未能解决你的问题,请参考以下文章

MVC 自定义过滤器(Filter)实现路由控制异常处理授权处理(获取客户端信息)

jQuery数据表自定义排序和过滤

Spring mvc 拦截器 怎么会进去两次

Spring webSecurity.ignoring() 不会忽略自定义过滤器

Spring MVC框架 学习笔记总结

2 个自定义组合框,在 DataTables 中过滤结果,获取 2 个组合框来过滤结果的问题 - JavaScript、jQuery