过滤器配置详解
- 拦截路径配置和拦截方式配置
![在这里插入图片描述](https://img-blog.csdnimg.cn/3c72cc33bc964ab39fd4e6fbc335facd.png)
- 注解示例
配置拦截访问方式
![在这里插入图片描述](https://img-blog.csdnimg.cn/1f01abc5c4e44ee0bbe6d2b873fe0966.png)
配置多个拦截访问方式
![在这里插入图片描述](https://img-blog.csdnimg.cn/539e1ca737fd4e8f95683b6829e9fa99.png)
过滤器链
- 执行顺序
- 过滤器先后顺序问题
- 注解配置:按照类名的字符串比较顺序规则比较,值小的先执行(字典序顺序)
- web.xml配置:谁定义在上边,谁先执行
过滤器实现敏感词替换
@WebFilter("/*")
public class MyFilter implements Filter {
private List<String> list = new ArrayList<>();
@Override
public void init(FilterConfig filterConfig) throws ServletException {
try {
String realPath = filterConfig.getServletContext().getRealPath("/敏感词汇.txt");
BufferedReader br = new BufferedReader(new FileReader(realPath));
String line = null;
while((line = br.readLine()) != null){
list.add(line);
}
br.close();
}catch (Exception e){
e.printStackTrace();
}
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {
request.setCharacterEncoding("utf-8");
ServletRequest proxy_request = (ServletRequest)Proxy.newProxyInstance(request.getClass().getClassLoader(), request.getClass().getInterfaces(), new InvocationHandler() {
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(method.getName().equals("getParameter")){
String value = (String)method.invoke(request, args);
if(value != null){
for(String str : list){
if(value.contains(str)){
value = value.replaceAll(str,"***");
}
}
}
return value;
}
return method.invoke(request,args);
}
});
filterChain.doFilter(request,response);
}
@Override
public void destroy() {
}
}