1. 项目中的登录过滤器在包里面封装 , 没有办法改原有的登录过滤器 , 现在有一个接口不需要校验登录 , 因此需要在进入登录过滤器之前 , 要进入我自己的过滤器 , 将登录过滤器需要的东西放入到request , 从而骗过登录过滤器.
1. 过滤器代码
package cn.com.baidu.message.filter;
import org.springframework.stereotype.Component;
import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
@WebFilter(urlPatterns = "/app/send/*", filterName = "sendFilter")
@Component
public class SendFilter implements Filter {
public SendFilter() {
}
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest)request;
MutableHttpServletRequest mutableRequest = new MutableHttpServletRequest(req);
// 业务操作
if(req.getHeader("token") == null) {
mutableRequest.putHeader("token", "XXX");
}
chain.doFilter(mutableRequest, response);
}
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("----sendFilter过滤器初始化----");
}
public void destroy() {
System.out.println("----sendFilter过滤器销毁----");
}
}
2. 过滤器的顺序修改与过滤指定路径绑定
package cn.com.baidu.message.filter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig{
@Bean
public FilterRegistrationBean sendFilter(){
FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean();
filterRegistrationBean.setFilter(new SendFilter());//设置过滤器对象
filterRegistrationBean.addUrlPatterns("/app/send/*");//配置过滤规则
filterRegistrationBean.setOrder(0); //order的数值越小 则优先级越高
filterRegistrationBean.setName("sendFilter");//配置名称
return filterRegistrationBean;
}
}
3. 因为HttpServletRequest没有办法修改Header里面的值 , 所以要对它进行修改
package cn.com.baidu.message.filter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.util.*;
class MutableHttpServletRequest extends HttpServletRequestWrapper {
private final Map<String, String> customHeaders;
public MutableHttpServletRequest(HttpServletRequest request){
super(request);
this.customHeaders = new HashMap<String, String>();
}
public void putHeader(String name, String value){
this.customHeaders.put(name, value);
}
public String getHeader(String name) {
String headerValue = customHeaders.get(name);
if (headerValue != null){
return headerValue;
}
return ((HttpServletRequest) getRequest()).getHeader(name);
}
public Enumeration<String> getHeaderNames() {
Set<String> set = new HashSet<String>(customHeaders.keySet());
Enumeration<String> e = ((HttpServletRequest) getRequest()).getHeaderNames();
while (e.hasMoreElements()) {
String n = e.nextElement();
set.add(n);
}
return Collections.enumeration(set);
}
}