昨天遇到一个问题,开发的系统中是有一个filter拦截请求,对请求参数进行加解密,现在的需求需要服务器内部转发请求之后,也就是forword之后,也要进入到拦截器
看了项目中filter的配置
是通过@Component注解注入到容器中的
filter的拦截范围是默认的request
@Component
public class EncryptFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException {
try {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String rawUri = request.getRequestURI();
//设置日志线程id
String versionId = request.getHeader("versionId");
filterChain.doFilter(request, response);
} finally {
MDC.clear();
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
}
然后我更换了filter的注入方式,通过@WebFilter注解方式注入
@WebFilter注解中可以配置dispatcherTypes来修改拦截的类型
@WebFilter(value = "/*", dispatcherTypes = {DispatcherType.REQUEST, DispatcherType.FORWARD})
public class EncryptFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws ServletException, IOException {
try {
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
String rawUri = request.getRequestURI();
//设置日志线程id
String versionId = request.getHeader("versionId");
filterChain.doFilter(request, response);
} finally {
MDC.clear();
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
}
可以看到dispatcherTypes默认是拦截request类型
但是他是一个数组,所以我们可以多配置一个forword类型 -> DispatcherType.FORWARD,使他支持拦截forword请求
其中可以配置的类型有这些