1、定义拦截器
建立MyInterceptor类,实现HandlerInterceptor接口
import org.springframework.web.servlet.HandlerInterceptor;
public class MyInterceptor implements HandlerInterceptor{
}
ALT+SHIFT+S 重写父类方法(我使用的是eclipse)
![](https://img.haomeiwen.com/i20816836/3f522a3336a4ba80.png)
1.1 实现HandlerInterceptor接口会重写三个方法:
1.1.1 preHandle方法
该方法的执行时机是,当某个 URL 已经匹配到对应的 Controller 中的某个方法,且在这个方法执行之前。所以 preHandle(……) 方法可以决定是否将请求放行,这是通过返回值来决定的,返回 true 则放行,返回 false 则不会向后执行。
1.1.2 postHandle方法
该方法的执行时机是,当某个 URL 已经匹配到对应的 Controller 中的某个方法,且在执行完了该方法,但是在 DispatcherServlet 视图渲染之前。所以在这个方法中有个 ModelAndView 参数,可以在此做一些修改动作。
1.1.3 afterCompletion方法
该方法是在整个请求处理完成后(包括视图渲染)执行,这时做一些资源的清理工作,这个方法只有在 preHandle(……) 被成功执行后并且返回 true 才会被执行。
import java.lang.reflect.Method;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;
public class MyInterceptor implements HandlerInterceptor{
/**
* 目标方法执行前
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
HandlerMethod handlerMethod = (HandlerMethod) handler;
Method method = handlerMethod.getMethod();
String methodName = method.getName();
System.out.println("====拦截到了方法:" + methodName + ",在该方法执行之前执行====");
// 返回 true 才会继续执行,返回 false 则取消当前请求
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("执行完方法之后进执行(Controller方法调用之后),但是此时还没进行视图渲染");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("整个请求都处理完咯");
}
}
}
2、配置拦截器
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.gongj.handler.MyInterceptor;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor()) //指定拦截器类
.addPathPatterns("/**") // /** 代表拦截所有请求
.excludePathPatterns("/login"); // 添加不拦截的请求
}
//配置bean
@Bean
MyInterceptor myInterceptor() {
return new MyInterceptor();
}
}
3、实验
3.1 建立controller
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;
@RestController
public class helloController {
//该方法会被拦截
@GetMapping("/get")
public String get() {
System.out.println("进入get方法");
return "hello Spinrg Boot==>get";
}
//该方法会被放行
@GetMapping("/login")
public String login() {
System.out.println("进入login方法");
return "hello Spinrg Boot==>login";
}
}
浏览器访问:http://localhost:1998/get
![](https://img.haomeiwen.com/i20816836/6ae6afcc167ac4fd.png)
后台控制台打印:
![](https://img.haomeiwen.com/i20816836/54aa6b2164e21071.png)
浏览器访问:http://localhost:1998/login
![](https://img.haomeiwen.com/i20816836/a22a983ec9bc8761.png)
后台控制台打印:
![](https://img.haomeiwen.com/i20816836/eb24e643e61b6643.png)
SpringBoot 2.x 自定义拦截器静态资源访问被拦截问题
如果项目中还有静态资源,由于我们实现了拦截器是不能直接进行访问的。
在项目中加入静态资源
![](https://img.haomeiwen.com/i20816836/3ce822af016b171e.png)
浏览器访问:http://localhost:1998/1.png
后台报错:
![](https://img.haomeiwen.com/i20816836/141fcb93b8ef514f.png)
页面报错:
![](https://img.haomeiwen.com/i20816836/57a457fac24ec6b5.png)
所以需要修改一下之前写代码:
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import com.gongj.handler.MyInterceptor;
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor()) //指定拦截器类
.addPathPatterns("/**") // /** 代表拦截所有请求
.excludePathPatterns("/login") // login 添加不拦截的请求
.excludePathPatterns("/static/**"); //不拦截静态资源
}
@Bean
MyInterceptor myInterceptor() {
return new MyInterceptor();
}
/**
* 添加静态资源文件,外部可以直接访问地址
*/
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//addResourceHandler方法是设置访问路径前缀
//addResourceLocations方法设置资源路径
registry.addResourceHandler("/static/**").addResourceLocations("classpath:/static/");
}
浏览器访问:http://localhost:1998/static/1.png
![](https://img.haomeiwen.com/i20816836/fe7785980d1c52e3.png)
网友评论