1 拦截器
- 实现HandlerInterceptor,写拦截器
- 实现WebMvcConfigurer,配置拦截器
// 拦截器
public class LoginInterceptor implements HandlerInterceptor {
/**
* 目标方法执行之前
*
* @param request
* @param response
* @param handler
* @return
* @throws Exception
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HttpSession session = request.getSession();
Object longinUser = session.getAttribute("loginUser");
if (longinUser != null) {
// 放行
return true;
}
// 拦截
response.sendRedirect("/");
// request.getRequestDispatcher("/").forward(request, response);
return false;
}
/**
* 目标方法执行之后,目标方法指拦截或放行后跳转的页面
*
* @param request
* @param response
* @param handler
* @param modelAndView
* @throws Exception
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
/**
* 页面渲染以后
* @param request
* @param response
* @param handler
* @param ex
* @throws Exception
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
// 配置拦截器
@Configuration
public class AdminWebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
.addPathPatterns("/**") // 拦截所有请求,包括静态资源
.excludePathPatterns("/", "/login", "/css/**"); // 放行
}
}
原理
- 顺序执行所有拦截器的preHandler 方法
- 如果当前拦截器preHandler 返回true,则执行下一个拦截器
- 如果当前拦截器preHandler 返回false,则倒序执行已执行拦截器的afterCompletion
- 所有拦截器的preHandler 都返回true,则执行目标方法,倒序执行 postHandler,倒序执行 afterCompletion
2 Filter
@WebFilter(urlPatterns = {"/css/*", "/images/*"})
public class MyFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("MyFilter初始化完成");
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
System.out.println("MyFilter工作");
filterChain.doFilter(servletRequest, servletResponse);
}
@Override
public void destroy() {
System.out.println("MyFilter销毁");
}
}
3 Servlet
@WebServlet(urlPatterns = "/my")
public class MyServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.getWriter().write("6666");
}
}
@ServletComponentScan(basePackages = "com.zhq.boot")
@SpringBootApplication
public class MainApplication {
public static void main(String[] args) {
SpringApplication.run(MainApplication.class, args);
}
}
4 Listener
@WebListener
public class MyServletContextListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent sce) {
System.out.println("项目启动");
}
}
5 使用RegistrationBean配置
@Configuration
public class MyRegistConfig {
@Bean
public ServletRegistrationBean myServlet() {
MyServlet myServlet = new MyServlet();
return new ServletRegistrationBean(myServlet, "/my");
}
@Bean
public FilterRegistrationBean myFilter() {
MyFilter myFilter = new MyFilter();
// 使用servlet的路径
return new FilterRegistrationBean(myFilter, myServlet());
// 自定义过滤路径
// FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean(myFilter);
// filterRegistrationBean.setUrlPatterns(Arrays.asList("/my"));
// return filterRegistrationBean;
}
@Bean
public ServletListenerRegistrationBean myListener() {
MyServletContextListener myServletContextListener = new MyServletContextListener();
return ServletListenerRegistrationBean(myServletContextListener);
}
}