当前位置: 首页 > 知识库问答 >
问题:

HTTP状态代码401,即使我在请求中发送凭据

杜阳炎
2023-03-14

最近,我将JWT身份验证引入了我的基于Springboot和Angualr2的应用程序。在那里,我试图通过在Angualr代码中传递如下所示的JWT令牌来执行POST请求

save(jobId: number, taskId: number, note: Note) {

   return this.http.post(environment.APIENDPOINT + '/jobs/' + jobId + '/tasks/' + taskId + '/notes', note, this.setHeaders()).map((response: Response) => response.json());

}
private setHeaders() {
        // create authorization header with jwt token
        let currentUser = JSON.parse(localStorage.getItem('currentUser'));
        console.log("Current token---"+ currentUser.token);
        if (currentUser && currentUser.token) {

  let headers = new Headers();
  headers.append('Content-Type', 'application/json');
  headers.append('authorization','Bearer '+ currentUser.token);
            
   let r = new RequestOptions({ headers: headers })
   return r;

        }
    }

但是,在服务器端,它返回状态代码401。问题在Springboot端,它检查授权头,如下所示,并返回null

String authToken = request.getHeader("authorization ");

然后,我查看了请求头,它在Access-Control-Request-Headers下有授权头,如下所示。但服务器端不可见。

@Bean
public CorsFilter corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    CorsConfiguration config = new CorsConfiguration();
    config.setAllowCredentials(true);
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");
    config.addExposedHeader("authorization");
    config.addAllowedMethod("OPTIONS");
    config.addAllowedMethod("GET");
    config.addAllowedMethod("POST");
    config.addAllowedMethod("PUT");
    config.addAllowedMethod("DELETE");

    //config.addExposedHeader("Content-Type");
    source.registerCorsConfiguration("/**", config);
    return new CorsFilter(source);
}

在阅读了SideShowBarker下面的评论后,我能够理解这个问题背后的基础。在我的项目中,我有一个JWT令牌过滤器,它总是检查授权头。然后我修改了如下,现在它按预期工作

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

    if ("OPTIONS".equalsIgnoreCase(request.getMethod())) {
        response.setStatus(HttpServletResponse.SC_OK);
    }else{
        String authToken = request.getHeader(this.tokenHeader);
        jWTTokenAuthenticationService.parseClaimsFromToken(authToken);
        --
    }
    chain.doFilter(request, response);
}Catch(AuthenticationException authEx){
    SecurityContextHolder.clearContext();
    if (entryPoint != null) {
        entryPoint.commence(request, response, authEx);
    }
}

}

共有1个答案

李利
2023-03-14

您需要将服务器配置为不需要对选项请求进行授权(即请求发送到的服务器,而不是为前端代码服务的服务器)。

那是因为正在发生的事情是这样的:

  1. 您的代码告诉您的浏览器它希望发送带有Authorization标头的请求。
  2. 您的浏览器表示,好吧,具有Authorization标头的请求需要我执行CORS预飞行选项以确保服务器允许具有Authorization标头的请求。
  3. 浏览器将options请求发送到服务器,而没有Authorization标头,因为options检查的全部目的是查看是否可以包含该标头。
  4. 您的服务器看到options请求,但它不是以指示它允许请求中的Authorization标头的方式响应它,而是以401拒绝它,因为它缺少标头。
  5. 您的浏览器期望CORS预飞行的响应为200或204,但得到的响应为401。因此,您的浏览器就停在那里,永远不会尝试来自代码的post请求。
    null
 类似资料:
  • 我希望根据响应对象错误动态返回HTTPStatus代码,如400、400、404等。我被提到这个问题--使用Spring3RESTful以编程方式更改http响应状态,但没有帮助。 我有一个带有方法的控制器类 是一个类,其中有上面使用的两个方法(和)。 我不想签入if条件并相应地返回响应代码,有没有其他更好的方法来做到这一点?

  • 问题内容: 我正在尝试使用node.js将http请求发送到neo4j数据库。这是我正在使用的代码: 我检查数据库是否正在运行(我已连接到管理网页,并且一切正常。)恐怕问题不在数据库方面,而在node.js方面。 我希望有人可以对此问题有所启发。我想学习如何在node.js中发送http请求,答案不必特定于neo4j问题。 提前致谢 问题答案: 如果是简单的GET请求,则应使用 否则,需要关闭。

  • 很多时候我们需要在页面打开的时候,读取远程的内容,然后在当前页面显示. 这就需要用到 http请求了. vue页面调用http请求 vuejs 内置了对发送http请求的支持. 只需要在对应页面的script 标签内加上对应的代码就好. 例如: 我们新增一个页面,叫 "博客列表页" : src/components/BlogList.vue, 内容如下: <template> <div >

  • 本文向大家介绍Golang发送http GET请求的示例代码,包括了Golang发送http GET请求的示例代码的使用技巧和注意事项,需要的朋友参考一下 使用标准库http来实现 以上就是Golang发送http GET请求的示例代码的详细内容,更多关于Golang发送http GET请求的资料请关注呐喊教程其它相关文章!

  • 本文向大家介绍java发送http请求并获取状态码的简单实例,包括了java发送http请求并获取状态码的简单实例的使用技巧和注意事项,需要的朋友参考一下 目前做项目中有一个需求是这样的,需要通过java发送url请求,查看该url是否有效,这时我们可以通过获取状态码来判断。 通过uConnection.getResponseCode()可以获取状态码。进而判断该网站是否存在。下面是不同状态码代表

  • 问题内容: 我们正在使用AngularJS和Java Servlet开发RESTful Web服务。当用户登录时,我们的后端会向前端发送一个“ Set-Cookie”标头。在Angular中,我们通过(ngCookie-module)访问标头并进行设置。 现在,用户已登录,他可以例如删除一些东西。因此,前端将GET请求发送到后端。因为我们在不同的域上工作,所以我们需要设置一些CORS标头,并且An