Spring Boot过滤器
Web项目中,控制器可以处理具体的业务请求,公共功能的处理则可以利用AOP的思想,通过过滤器或拦截器实现。过滤器和拦截器都属于面向切面编程的具体实现。而两者的主要区别包括以下几个方面:
- Filter是依赖于Servlet容器,属于Servlet规范的一部分,而拦截器则是独立存在的,可以在任何情况下使用。
- Filter的执行由Servlet容器回调完成,而拦截器通常通过动态代理的方式来执行。
- Filter的生命周期由Servlet容器管理,而拦截器则可以通过IoC容器来管理,因此可以通过注入等方式来获取其他Bean的实例,因此使用会更方便
Filter
自定义 Filter 有两种实现方式,第一种是使用 @WebFilter,第二种是使用 FilterRegistrationBean,经过实践之后发现使用 @WebFilter 自定义的过滤器优先级顺序不能生效(只能根据Filter类名的字母顺序倒序排列,且优先级都高于FilterRegistrationBean配置的过滤器),因此推荐使用第二个方案。
LoginFilter
package com.webapp.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebFilter("/news/*")//过滤的路径 controller
public class LoginFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest,
ServletResponse servletResponse,
FilterChain filterChain) throws IOException, ServletException {
//从session中获取用户的信息,判断该用户是否为空,如果没有登录,先登录,否则放行
//强转为HttpServletRequest
HttpServletRequest req=(HttpServletRequest)servletRequest;
//强转为HttpServletResponse
HttpServletResponse resp=(HttpServletResponse)servletResponse;
HttpSession session = req.getSession();
Object loginUser = session.getAttribute("loginUser");
if (loginUser==null) {
resp.sendRedirect("/login");
}
//放行
// 继续执行一下一个过滤器
filterChain.doFilter(servletRequest, servletResponse);
}
}
主启动类用@ServletComponentScan注解来扫描拦截器注解@WebFilter
@SpringBootApplication
@ServletComponentScan
public class WebApplication {
public static void main(String[] args) {
SpringApplication.run(WebApplication.class, args);
}
}