进入请求的前后,做一些事情。比如打印日志,或者校验数据合法等等。
可以使用三种方式:
一、使用filter
filter类代码
package com.ganlong.filter;
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.http.HttpServletRequest;
import org.springframework.stereotype.Component;
@Component
public class TimeFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化filter");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) request;
String requestURI = req.getRequestURI();
if (requestURI.contains("favicon.ico")) {
return;
}
System.out.println("Filter开始");
//进入下一个filter没有filter了则放行请求
chain.doFilter(request, response);
System.out.println("Filter结束");
}
@Override
public void destroy() {
System.out.println("filter销毁");
}
}
总结:非常简单只需要实现一个filter接口实现三个方法,然后使用@Component方法注入spring容器即可
上面是自己定义的filter,假如是第三方的库中的filter怎么假如过滤器链呢?可以使用@bean注入到容器中
@Configuration
public class WebConfig {
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean filterRegistrationBean=new FilterRegistrationBean();
//加入过滤器
filterRegistrationBean.setFilter(new TimeFilter());
//定义过滤器路径
ArrayList<String> urlList=new ArrayList();
urlList.add("/*");
filterRegistrationBean.setUrlPatterns(urlList);
return filterRegistrationBean;
}
}
总结:注入一个FilterRegistrationBean ,将filter设置进filterRegistrationBean中然后可以设置过滤器的路径。
注意:
HttpServletRequest req = (HttpServletRequest) request;
String requestURI = req.getRequestURI();
if (requestURI.contains("favicon.ico")) {
return;
}
在浏览器中测试过滤器时发现进入了过滤器两次,因为浏览器自己主动的又请求了一次图标静态资源,所以过滤器又拦截了一次。
所以判断了一下请求图标静态资源时直接返回。
网友评论