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的解释。 我发现它非常清晰。
要解决问题,您基本上需要使用两个东西:
- 在您的服务器中启用CORS,因为您的服务器必须知道它正在从不同域中的客户端获取请求。
- 在Spring Security级别启用CORS,以允许它利用Spring MVC级别定义的配置。
我已经将解释与代码一起解决了使用spring-boot和angularjs无效的CORS 。
- 对于预检,响应具有无效的HTTP状态代码401,用于oauth / token
- 如何在angularjs中阅读pdf流
- 将文件从SFTP直接下载到HTTP响应,而不使用中间文件
- 带有spring MVC的JasperReport:在客户端打印报告而不显示它
- Spring文件上传 – 获得预期的MultipartHttpServletRequest:是否配置了MultipartResolver? 错误
- 为SPA前端配置Spring Boot
- 如何测试使用JavaScript开发的WebSocket
- 带有Spring Security的AngularJS Web应用程序
- AngularJS与Apache Tiles