过滤器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 {…}
二、通过过滤器注册配置类使用过滤器
@Configurationpublic class WebComponent2Config { @Bean public FilterRegistrationBean someFilterRegistration1() { //新建过滤器注册类 FilterRegistrationBean registration = new FilterRegistrationBean(); // 添加我们写好的过滤器 registration.setFilter( new LoginFilter()); // 设置过滤器的URL模式 registration.addUrlPatterns(“/*”); return registration; }
}
扩展
当有多个过滤器需要按顺序执行时怎么办?使用注解的配置方法不能配置顺序,但是可以通过过滤器名字的字典顺序实现顺序过滤(比如AFilter就会在BFilter前执行),显然这种方法看起来不怎么正经。 但是我们可以使用第二种配置方法.
通过给注册类设置order,order越小,执行优先级越高 @Beanpublic FilterRegistrationBean someFilterRegistration1() { //新建过滤器注册类 FilterRegistrationBean registration = new FilterRegistrationBean(); // 添加我们写好的过滤器 registration.setFilter( new LoginFilter()); // 设置过滤器的URL模式 registration.addUrlPatterns(“/*”); //设置过滤器顺序 registration.setOrder(1);** return registration;
}
💬 评论