【发布时间】:2016-07-14 09:10:34
【问题描述】:
我有一个由 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) {
...
}
为了获得授权标头,我通过以下方式使用 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 - 请求标头
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
【问题讨论】:
-
检查浏览器开发工具网络中的实际请求以及检查控制台是否有错误。我怀疑你有 CORS 问题,需要确保它在服务器 api 端点上实现
-
在我的 spring 控制器中,我有“@CrossOrigin(origins = "localhost:3000")",当我调试时,我可以看到调用了 JWT 方法,并且我可以看到 Authorization 标头即将到来在 POST 方法中为 NULL,在 GET 中具有正确的值。我需要做些什么特别的事情吗?
-
并没有说明上述请求中实际发送的内容。或者,如果您正在处理 OPTIONS 预检请求并在其上设置了标头,或者如果您遇到 CORS 错误您的浏览器是首选的调试工具
-
@charlietfl 我在评论中添加了 Request 标头,您可以在其中看到它们如何根据它是 GET 还是 POST 进行更改。我想两者应该相同,也许这就是问题......而且我认为如果我可以在服务器上调试是因为它不是 CORS 问题,而且对于 GET 和 POST 请求也应该是相同的,对吧?
-
可能会尝试设置
withCredentials..see docs。不确定请求标头如何设置任何Access-Control...这些通常是响应标头
标签: javascript java angularjs spring jwt