Angularjs Post没有向Spring JWT发送头文件

我有一个由AngularJs构建的Web应用程序和一个由Spring构建的后端应用程序,我正在使用JWT来保护我的应用程序。 使用Get方法一切正常,在后端级别我获得了我期待的持有者令牌,因此我可以返回私人信息。 但是使用POST方法,不会发送承载令牌。 我不知道这是来自后端或前端层的问题。 在这里你有我的代码:

AngularJS

$http({ method: 'POST', url: SessionService.apiUrl + '/category/create', headers: { 'Accept': 'application/json','Content-Type': 'application/json; charset=UTF-8;', 'Authorization': 'Bearer ' + SessionService.getToken() }, data: params }) 

对于GET方法,我有完全相同(没有参数和方法GET),它正在工作。

在后端:

 @RequestMapping(value = "/category/create", method = RequestMethod.POST) public @ResponseBody Response add(@RequestBody CategoryBO request) { ... } 

要获取Authorization标头,我将以下列方式使用io.jsonwebtoken库:

 protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException { String authorizationHeader = request.getHeader("authorization"); 

使用Postman后端运行良好,但是angularjs不是。

GET – 请求标题:

 Accept:application/json, text/plain, */* Accept-Encoding:gzip, deflate, sdch Accept-Language:es-ES,es;q=0.8,en;q=0.6,pt;q=0.4 Authorization:Bearer eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJmYWJpYW4uYW5nZWxvbmkiLCJyb2xlcyI6IkFETUlOIiwiaWF0IjoxNDU5MDE5MTg0fQ.QAPZDbyavambfdK9LJUQWyzSRAuELvg_IGTjFdsm6cc Connection:keep-alive Host:localhost:8080 Origin:http://localhost:3000 Referer:http://localhost:3000/ User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36 

POST – Resquest Header

 Accept:*/* Accept-Encoding:gzip, deflate, sdch Accept-Language:es-ES,es;q=0.8,en;q=0.6,pt;q=0.4 Access-Control-Request-Headers:accept, authorization, content-type Access-Control-Request-Method:POST Connection:keep-alive Host:localhost:8080 Origin:http://localhost:3000 Referer:http://localhost:3000/ User-Agent:Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/49.0.2623.87 Safari/537.36 

我有一个类似的问题然后我意识到前端在实际执行HTTP.OPTIONS请求之前触发了预检请求。 更多信息在这里

这样的请求将没有授权令牌,因此对控制器的访问将失败。最自然的解决方案是通过让所有OPTIONS请求通过来设置应用程序的安全性。

这可以做到

  • 正如您在此处所见 ,设置配置
  • 正如您在此处所见,设置您的应用程序肯定会拥有的CorsFilter

希望能帮助到你

感谢@ user2858970的解释。 我发现它非常清晰。

要解决问题,您基本上需要使用两个东西:

  1. 在您的服务器中启用CORS,因为您的服务器必须知道它正在从不同域中的客户端获取请求。
  2. 在Spring Security级别启用CORS,以允许它利用Spring MVC级别定义的配置。

我已经将解释与代码一起解决了使用spring-boot和angularjs无效的CORS 。