springboot使用filter获取自定义请求头的实现代码

 更新时间:2019年05月24日 14:56:09   作者:你都如何回忆我  
这篇文章主要介绍了springboot使用filter获取自定义请求头的实例代码,代码简单易懂,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下

有个钱包项目,本来用的是微服务这一套,后来感觉没必要,重构成了简单的springboot项目,但是token校验重构完之后出问题了,之前写filter走的是springgateway,基于GatewayFilter实现,重构了之后基于filter,然后当请求进入过滤器的时候,发现不能获取到请求的自定义请求头。

String token = request.getHeader("token"); // null
String id = request.getHeader("id"); // null
String role = request.getHeader("role"); // null

原因

我在进入断点的时候查看了一下servletRequest,发现请求方法是options。 我知道get post delete put。还真不了解options,百度了下。主要参考这篇文章。原来是浏览器的同源策略问题,也就是cors,可我一想,我配置了cors啊

@Configuration
public class CorsConfig {
  private CorsConfiguration buildConfig() {
    CorsConfiguration corsConfiguration = new CorsConfiguration();
    corsConfiguration.addAllowedOrigin("*"); // 1
    corsConfiguration.addAllowedHeader("*"); // 2
    corsConfiguration.addAllowedMethod("*"); // 3
    return corsConfiguration;
  }

  @Bean
  public CorsFilter corsFilter() {
    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource();
    source.registerCorsConfiguration("/**", buildConfig()); // 4
    return new CorsFilter(source);
  }
}

怎么还报跨域的问题呢,想起来了我的tokenFilter里因为拿不到请求头token,我抛出了参数异常,然后@RestControllerAdvice跟@ExceptionHandle处理不了filter中抛出的异常,导致程序报500错误,然后过滤器是类似于切面的 么,这里断了导致返回头也没加上。

处理

怎么处理浏览器发过来的预处理 options请求呢,太懒了,直接这样写了

HttpServletRequest request= (HttpServletRequest)servletRequest;
    HttpServletResponse res = (HttpServletResponse) servletResponse;
    String method=request.getMethod();
    if(HttpMethod.OPTIONS.toString().equals(method)){
      res.setStatus(HttpStatus.NO_CONTENT.value());
    }else {
      String token = request.getHeader("token");
      String id = request.getHeader("id");
      String role = request.getHeader("role");
      ~~~~~~~

回想

我记得我上个项目也没处理options请求啊,怎么没报cors问题啊,对了我记得我在nginx处理过了

if ($request_method = 'OPTIONS') {
 return 204;
}
add_header Access-Control-Allow-Origin * always;
add_header Access-Control-Allow-Headers "Content-Type, Authorization" always;
add_header Access-Control-Allow-Methods "GET, POST, OPTIONS, PUT, PATCH, DELETE, HEAD" always;
add_header Access-Control-Max-Age 86400 always;

原来自己又写前端,也写后端,怎么这些问题还能碰到呢,:relieved:,前辈们都写好了,自己还没遇到问题也没深入过,还有springcloud里面的corsWebFilter怎么就跟springboot里面的corsFilter不一样呢。

@Configuration
public class CorsConfig {
  @Bean
  public CorsWebFilter corsFilter() {
    CorsConfiguration config = new CorsConfiguration();
    config.addAllowedMethod("*");
    config.addAllowedOrigin("*");
    config.addAllowedHeader("*");

    UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(new PathPatternParser());
    source.registerCorsConfiguration("/**", config);

    return new CorsWebFilter(source);
  }
}

还是得多看源码啊,我这个crudboy

总结

以上所述是小编给大家介绍的springboot使用filter获取自定义请求头的实现代码,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对脚本之家网站的支持!

相关文章

  • Java常量池详解

    Java常量池详解

    下面小编就为大家带来一篇浅谈java常量池。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2021-09-09
  • Java Swing窗体关闭事件的调用关系

    Java Swing窗体关闭事件的调用关系

    这篇文章主要为大家详细介绍了Java Swing窗体关闭事件的调用关系,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2019-07-07
  • Java快速排序的实现详细代码及通俗解释

    Java快速排序的实现详细代码及通俗解释

    这篇文章主要介绍了Java快速排序实现的相关资料,快速排序是一种高效的排序算法,通过选择一个基准值将数组分成两部分,左边的元素比基准值小,右边的元素比基准值大,然后递归地对这两部分进行排序,需要的朋友可以参考下
    2025-02-02
  • 通过一个命令轻松切换Java的版本

    通过一个命令轻松切换Java的版本

    这篇文章主要给大家介绍了如何通过一个命令轻松实现切换Java的版本,通过本文介绍的方法,大家就可以将jdk版本之间轻松切换,需要的朋友可以参考学习,下面跟着小编一起来看看吧。
    2017-05-05
  • Maven安装与配置图文教程

    Maven安装与配置图文教程

    这篇文章主要为大家详细介绍了Maven安装与配置图文教程,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-10-10
  • Spring Boot详解各类请求和响应的处理方法

    Spring Boot详解各类请求和响应的处理方法

    平时只是在用SpringBoot框架,但并没有详细研究过请求和响应执行的一个具体过程,所以本文主要来梳理一下SpringBoot请求和响应的处理过程
    2022-07-07
  • springboot整合redis之消息队列

    springboot整合redis之消息队列

    本文主要介绍了springboot整合redis之消息队列,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2022-06-06
  • 了解java中的session

    了解java中的session

    这篇文章主要介绍了了解java中的session的相关问题,什么是session,session怎么用等,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • Java唯一订单编号生成代码例子

    Java唯一订单编号生成代码例子

    在项目中,我们经常遇到需要生成订单编号、字典编号等唯一值场景,下面这篇文章主要给大家介绍了关于Java唯一订单编号生成的相关资料,文中通过代码介绍的非常详细,需要的朋友可以参考下
    2024-07-07
  • spring boot+自定义 AOP 实现全局校验的实例代码

    spring boot+自定义 AOP 实现全局校验的实例代码

    最近公司重构项目,重构为最热的微服务框架 spring boot, 重构的时候遇到几个可以统一处理的问题。这篇文章主要介绍了spring boot+自定义 AOP 实现全局校验 ,需要的朋友可以参考下
    2019-04-04

最新评论