欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

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

程序员文章站 2024-02-23 10:26:10
有个钱包项目,本来用的是微服务这一套,后来感觉没必要,重构成了简单的springboot项目,但是token校验重构完之后出问题了,之前写filter走的是springga...

有个钱包项目,本来用的是微服务这一套,后来感觉没必要,重构成了简单的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获取自定义请求头的实现代码,希望对大家有所帮助