【问题标题】:Spring MVC filter get custom jquery ajax headerSpring MVC过滤器获取自定义jquery ajax标头
【发布时间】: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 数据分开。
  • 我看了好几次答案很模糊
  • 基本上我需要知道如何从 httpServletRequest 访问我的 java 过滤器中的标头

标签: jquery ajax spring-mvc spring-security


【解决方案1】:

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

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

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

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

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

祝你好运。

【讨论】:

  • 是的,我找到解决方案后忘记回答这个问题了。你所建议的正是我所做的
  • 这里的methode 是什么以及如何获取请求标头的方法来检查这种情况?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-01-22
  • 2021-05-28
  • 2011-08-23
  • 2014-07-28
  • 1970-01-01
  • 2013-08-27
相关资源
最近更新 更多