Springboot通过过滤器实现对请求头的修改
之前在一个项目中有一个API服务需要重构,尤其是接口的用户身份校验,原先的实现是将用户token放在URL请求参数中,然后通过AOP进行校验,现在要统一将token放在header中,但是这样修改会让用户也相应的修改他们的客户端,为了使版本发布后不至于对用户的服务产生太大影响,所以我们不仅能通过header进行token校验,也要能通过URL参数进行token校验。
那么对于这个问题我们可以直接修改AOP,在里面增加获取URL参数的实现,但是这样做修改改了原有代码,我们本身初衷是给用户一个过渡的阶段,一旦用户对自己的服务做了修改,那么我们也就不需要在支持以前的形式了,所以我们可以写一个过滤器重写请求头的获取的实现,就可以解决这个问题了,当用户自己的服务都修改好之后,我们只需要删掉过滤器就可以了。
首先,我们要实现一个过滤器,并通过一个匿名类重写HttpServletRequestWrapper的 getHeader方法,代码如下:
import org.apache.commons.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) { /** * 当调用request.getHeader("token")时,则获取请求参数中token值并当做Header的值返回 * @param name * @return */ @Override public String getHeader(String name) { // 先从原本的Request中获取头,如果为空且名字为token,则从参数中查找并返回 String superHeader = super.getHeader(name); if("Authorization".equals(name) && StringUtils.isEmpty(superHeader)){ String token = request.getParameter("token");
if (StringUtils.isNotEmpty(token)) { return token ;
} } return superHeader;
} }; chain.doFilter(requestWrapper,response);
}
@Override public void destroy() { } }
我们重写的getHeader方法的逻辑就是:
1、先获取指定的header;
1、先获取指定的header;
2、如果是取的Authorization并且没有取到对应的数据,那么从URL的参数中获取token。
最后别忘了加入过滤器的配置类:
@Configuration public class FilterConfig { @Bean public FilterRegistrationBean modifyParametersFilter() { FilterRegistrationBean registration = new FilterRegistrationBean(); registration.setFilter(new AuthHeaderSettingFilter()); registration.addUrlPatterns("/*"); registration.setName("authHeaderSettingFilter"); registration.setOrder(1); return registration; } }