Spring Boot 中的 JWT 跨域问题


主要问题

前后端分离后,前端使用 Ajax 进行请求,存在一些跨域的问题。

基于 Spring Boot 的后端通过给 Controlle类或其中的方法添加 @CrossOrigin 注解来解决跨域问题:

@CrossOrigin
@RequestMapping("/user/")
public class UserController {
    ...
}

添加该注解之后,可以通过匿名访问的接口都没有跨域问题了,而需要通过 JWT 验证的接口仍然存在跨域问题。

其中,解决问题的关键在于,浏览器会在发送 Ajax 请求之前发送一个预请求,确认当前的接口是不是有效的接口,此时的请求方式是 OPTIONS 的请求方式。

因此,JWT 的过滤器需要先判断该请求是否为预请求,如果是则需要给返回的响应头中添加跨域相关的信息;如果不是,则按照一般接口进行 JWT 验证。

public class AuthFilter extends OncePerRequestFilter {

      ......

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException {

        // 处理浏览器的预请求
        if (request.getMethod().equals("OPTIONS")) {
            response.setHeader("Access-Control-Allow-Origin", "*");
            response.setHeader("Access-Control-Allow-Methods", "POST,GET,PUT,OPTIONS,DELETE");
            response.setHeader("Access-Control-Max-Age", "3600");
            response.setHeader("Access-Control-Allow-Headers", "Origin,X-Requested-With,Content-Type,Accept,Authorization,token");
            return;
        }

        // 验证 JWT
        ......
    }
}

文章作者: 吴鑫康
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 吴鑫康 !
评论
 上一篇
删除 <none>:<none> 镜像 删除 <none>:<none> 镜像
坏的 none:none 镜像docker build 或是 pull 命令会产生临时镜像。如果我们用 Dockerfile 创建一个 HelloWorld 镜像后,因为版本更新需要重新创建,那么以前那个版本的镜像就会成为临时镜像。这个是需
2020-06-06
下一篇 
微服务容器化系列(1):服务编排前奏 微服务容器化系列(1):服务编排前奏
服务 Docker 化修改项目配置由于镜像运行时 MySQL 数据库所在的主机地址是动态的,所以将项目中的 MySQL 数据库地址和 Zookeeper 注册中心地址配置为动态变量: spring: dubbo:
2020-06-04
  目录