Springboot通过过滤器实现对请求头的修改
之前在⼀个项⽬中有⼀个API服务需要重构,尤其是接⼝的⽤户⾝份校验,原先的实现是将⽤户token放在URL请求参数中,然后通过AOP进⾏校验,现在要统⼀将token放在header中,但是这样修改会让⽤户也相应的修改他们的客户端,为了使版本发布后不⾄于对⽤户的服务产⽣太⼤影响,所以我们不仅能通过header进⾏token校验,也要能通过URL参数进⾏token校验。
那么对于这个问题我们可以直接修改AOP,在⾥⾯增加获取URL参数的实现,但是这样做修改改了原有代码,我们本⾝初衷是给⽤户⼀个过渡的阶段,⼀旦⽤户对⾃⼰的服务做了修改,那么我们也就不需要在⽀持以前的形式了,所以我们可以写⼀个过滤器重写请求头的获取的实现,就可以解决这个问题了,当⽤户⾃⼰的服务都修改好之后,我们只需要删掉过滤器就可以了。
⾸先,我们要实现⼀个过滤器,并通过⼀个匿名类重写HttpServletRequestWrapper的 getHeader⽅法,代码如下:
import org.apachemons.lang3.StringUtils;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper; import java.io.IOException;
/**
* Created by yangy-r on 2019/3/1. */
@WebFilter
public class AuthHeaderSettingFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException { }
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException
{
HttpServletRequestWrapper requestWrapper = new
HttpServletRequestWrapper((HttpServletRequest) request) {
/**
* 当调⽤Header("token")时,则获取请求参数中token值并当做Header的值返回 * @param name
* @return
*/
@Override
public String getHeader(String name) {
// 先从原本的Request中获取头,如果为空且名字为token,则从参数中查并返回
String superHeader = Header(name);
if("Authorization".equals(name) && StringUtils.isEmpty(superHeader)){
String token = Parameter("token");
if (StringUtils.isNotEmpty(token)) {
return token ;
}
}
return superHeader;
}
};
chain.doFilter(requestWrapper,response);
}
@Override
public void destroy() { }
}
我们重写的getHeader⽅法的逻辑就是:
1、先获取指定的header;
2、如果是取的Authorization并且没有取到对应的数据,那么从URL的参数中获取token。
最后别忘了加⼊过滤器的配置类:
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean modifyParametersFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean();
springboot原理pdfregistration.setFilter(new AuthHeaderSettingFilter());
registration.addUrlPatterns("/*");
registration.setName("authHeaderSettingFilter");
registration.setOrder(1);
return registration;
}
}

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。