3. spring mvc 拦截器
3.1 概述
- spring mvc拦截器相当于 java web filter
- 在处理器执行过程中,进行拦截或处理
preHandler 拦截器处理前方法,如果返回true继续执行,如果返回false,表示被拦截。
postHandler 拦截器处理方式,controller执行完成后,将执行处理方法。
afterCompletion 完成方法,视图渲染完成触发。
3.2 入门案例
-
环境:项目、jar包、配置类
-
测试程序:controller、jsp
-
编写拦截器,对流程进行校验
-
编写配置文件
-
环境:项目、jar包、配置类
-
测试程序:controller、jsp
package com.czxy.inter.controller; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; /** * @author 桐叔 * @email liangtong@itcast.cn */ @Controller @RequestMapping("/user") public class UserController { @RequestMapping("/selectAll") public String selectAll() { System.out.println("2 controller-->selectAll"); return "list"; } }
<%@ page contentType="text/html;charset=UTF-8" language="java" %> <html> <head> <title>Title</title> </head> <body> 查询结果 <% System.out.println("4 jsp 输出"); %> </body> </html>
- 编写拦截器,对流程进行校验
package com.czxy.inter.interceptor; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * @author 桐叔 * @email liangtong@itcast.cn */ @Component public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println("1 拦截前"); //放行 return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println("3 执行中"); } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println("5 最后完成"); } }
- 编写配置文件,spring mvc 配置类,需要实现 WebMvcConfigurer 接口,重新 addInterceptors方法
package com.czxy.inter.config; import com.czxy.inter.interceptor.MyInterceptor; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.ComponentScan; import org.springframework.context.annotation.Configuration; import org.springframework.http.converter.StringHttpMessageConverter; import org.springframework.web.servlet.config.annotation.*; import org.springframework.web.servlet.view.InternalResourceViewResolver; import javax.annotation.Resource; import java.nio.charset.Charset; /** * @author 桐叔 * @email liangtong@itcast.cn */ @Configuration //配置类 @ComponentScan(basePackages = {"com.czxy.inter.controller","com.czxy.inter.interceptor"}) @EnableWebMvc public class SpringMVCConfig implements WebMvcConfigurer { @Resource private MyInterceptor myInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { InterceptorRegistration interceptorRegistration1 = registry.addInterceptor(myInterceptor); interceptorRegistration1.addPathPatterns("/**"); } /** * 视图解析器 * @return */ @Bean public InternalResourceViewResolver viewResolver() { InternalResourceViewResolver viewResolver = new InternalResourceViewResolver(); // 前缀 viewResolver.setPrefix("/WEB-INF/pages/"); // 后缀 viewResolver.setSuffix(".jsp"); return viewResolver; } }
-
3.3 多拦截器
-
执行流程
-
多拦截器拦截的顺序,就是在配置类中配置的顺序。