过滤器Filter
过滤器是基于Servlet的拦截,是在Web容器进行拦截。常用的场景有登录、权限判断、tonken过滤等。当然使用拦截器也可以,拦截器是基于Spring的拦截,可以作用于Controller等的方法中。如果是Web的话,没有特别要求,还是使用过滤器吧(本人观点)
编写过滤器
新建过滤器 需要实现javax.servlet.Filter接口,并重新其中的方法
public class LoginFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
}
@Override
public void destroy() {
}
}
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
可以转换为我们平时使用的HttpServletRequest 和 HttpServletResponse
如果不需要过滤 直接调用
filterChain.doFilter(servletRequest, servletResponse);
如果需要过滤 根据自己的业务处理
例如:判断token、ip等,直接通过HttpServletResponse 返回异常处理
重定向跳转 response.sendRedirect(request.getContextPath()+”/*.html”);
界面返回response.getWriter().write(this.NO_LOGIN);
String requestType = request.getHeader(“X-Requested-With”);
//判断是否是ajax请求
if(requestType!=null && “XMLHttpRequest”.equals(requestType))
过滤器配置
配置方式有2中,一种是通过注解,一种是通过过滤器配置
一、注解方式配置
- 在过滤器上添加WebFilter注解
- 启动类上添加ServletComponentScan注解
filterName 为过滤器的名称,urlPatterns表示过滤的url的规则
@WebFilter(filterName = “loginFilter”,urlPatterns = {“/*”})
public class LoginFilter implements Filter {….}
@SpringBootApplication
@ServletComponentScan
public class FileUploadApplication {…}
二、通过过滤器注册配置类使用过滤器
>
>
@Configuration
public class WebComponent2Config {
@Bean
public FilterRegistrationBean someFilterRegistration1() {
//新建过滤器注册类
FilterRegistrationBean registration = new FilterRegistrationBean();
// 添加我们写好的过滤器
registration.setFilter( new LoginFilter());
// 设置过滤器的URL模式
registration.addUrlPatterns(“/*”);
return registration;
}}
扩展
当有多个过滤器需要按顺序执行时怎么办?
使用注解的配置方法不能配置顺序,但是可以通过过滤器名字的字典顺序实现顺序过滤(比如AFilter就会在BFilter前执行),显然这种方法看起来不怎么正经。
但是我们可以使用第二种配置方法.通过给注册类设置order,order越小,执行优先级越高
@Bean
public FilterRegistrationBean someFilterRegistration1() {
//新建过滤器注册类
FilterRegistrationBean registration = new FilterRegistrationBean();
// 添加我们写好的过滤器
registration.setFilter( new LoginFilter());
// 设置过滤器的URL模式
registration.addUrlPatterns(“/*”);
//设置过滤器顺序
registration.setOrder(1);
return registration;}