美文网首页
jwt验证时预检请求处理

jwt验证时预检请求处理

作者: 创奇 | 来源:发表于2020-03-17 10:08 被阅读0次

jwt验证问题:拦截器进行验证时,没有得到token都会预检不通过。

预检请求不会带参数,因此拦截器获取请求头的jwt(token)时是为null的,所以预检请求都不会通过,浏览器得到预检不通过,就不会发送正式的请求。

解决方案:添加一个过滤器,在过滤器里处理预检请求(OPTIONS)
方案一:

public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException {
        // 预检请求处理
        if (req instanceof HttpServletRequest && res instanceof HttpServletResponse) {
            HttpServletRequest request = (HttpServletRequest)req;
            HttpServletResponse response = (HttpServletResponse) res;
            response.setHeader("Access-Control-Allow-Origin", "*");
            response.setHeader("Access-Control-Max-Age", "3600");
            response.setHeader("Access-Control-Allow-Methods", "POST, GET, OPTIONS, DELETE,JSONP");
            response.setHeader("Access-Control-Allow-Headers",
                    "Origin, X-Requested-With, Content-Type, Accept,Authorization,X-CSRF-TOKEN");

            // 是预检请求则设置响应状态并返回
            if(request.getMethod().equals(RequestMethod.OPTIONS.name())) {
                response.setStatus(HttpStatus.OK.value());
                return ;
            }
        }
        chain.doFilter(req, res);

    }

方案二:

@Component
public class MyFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
        // 预检请求处理
        HttpServletRequest httpRequest = (HttpServletRequest) request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        httpRequest.setCharacterEncoding("UTF-8");
        httpResponse.setCharacterEncoding("UTF-8");
        httpResponse.setHeader("Access-Control-Allow-Origin", "*");
        httpResponse.setHeader("Access-Control-Allow-Methods", "*");
        httpResponse.setHeader("Access-Control-Max-Age", "3600");
        httpResponse.setHeader("Access-Control-Allow-Headers", "x-requested-with");

        filterChain.doFilter(request, response);

    }
    
}


为什么会发送预检请求?

如前后端分离不安全(跨域),因此会发送预检请求来检查是否安全。
一般都是浏览检测到请求跨域时,会自动发起。

OPTIONS请求Access-Control-Max-Age 缓存机制,如下请求缓存生效吗?

  1. url变化会导致缓存失效,需要重新验证预检的返回值
  2. 预检不关心post data
  3. header变化,如果是去掉了自定义的header使得请求变成简单请求,不会发送预检。如果是增加其他的header,是会重新验证Access-Control-Allow-Headers的值。
  4. cookie变化,只要后端允许发送cookie,cookie值变化不会导致缓存失效。

springboot集成jwt和ssm(springmvc)集成jwt

相关文章

  • jwt验证时预检请求处理

    jwt验证问题:拦截器进行验证时,没有得到token都会预检不通过。 预检请求不会带参数,因此拦截器获取请求头的j...

  • Zuul处理预检请求

    在spring cloud的Zuul服务网关的过滤器中,项目中使用JWT权限验证,前端JS为了兼容跨域请求,使用A...

  • jwt学习

    jwt是如何验证的? jwt保存在客户端,每次请求时都将其放在header中,这样服务器接收到请求后,取出jwt进...

  • springboot 处理cors预检请求

    springboot自定义过滤器Filter进行JWT登陆令牌验证并设置响应头实现跨域失效是因为服务端未处理浏览器...

  • 预检请求

    问题:每次发起请求,同一条url有两条请求第一条请求Method是OPTIONS请求,第二条请求Method才是实...

  • 简单请求和非简单请求2

    简单请求和非简单请求2 1、OPTIONS预检命令操作 (1)后端服务增加预检命令缓存 如果每个postJson请...

  • 非简单跨越请求

    当浏览器发现请求是跨越的时候,会先进行预检请求,之后才会进行第二次请求来获取数据。 1. 预检"请求用的请求方法是...

  • options预检请求

    第一次看到这个词, 完全不知道是什么!如果你也和我一样,请继续往下看。当采用CORS(跨域资源共享)来解决跨域问题...

  • options预检请求

    起因  最近写项目的时候,发现前端中的请求发送了两遍,同时也看到了options请求。 前置知识 HTTP常见的请...

  • 关于浏览器预检(OPTIONS)请求

    浏览器在什么情况下会发起options预检请求? 在非简单请求且跨域的情况下,浏览器会发起options预检请求。...

网友评论

      本文标题:jwt验证时预检请求处理

      本文链接:https://www.haomeiwen.com/subject/rkyzehtx.html