PS:本文重点在如何在Spring-Boot中使用拦截器,关于拦截器的原理请大家查阅资料了解。
实现自定义拦截器只需要3步:
1、创建我们自己的拦截器类并实现 HandlerInterceptor 接口。
2、创建一个Java类继承WebMvcConfigurerAdapter,并重写 addInterceptors 方法。
2、实例化我们自定义的拦截器,然后将对像手动添加到拦截器链中。
先来自定义一个MyInterceptor拦截器;
拦截器一般需要继承HandlerInterceptor接口,并需要实现以下三个接口方法:
1 package com.beilin.interceptor; 2 3 4 5 6 import org.springframework.web.servlet.HandlerInterceptor; 7 8 9 import javax.servlet.http.HttpServletRequest; 10 import javax.servlet.http.HttpServletResponse; 11 import java.util.Date; 12 13 /** 14 * 拦截器 15 */ 16 public class MyInterceptor implements HandlerInterceptor { 17 18 19 20 @Override 21 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { 22 //获取登录时保存到session的用户信息 23 SysUser user = (SysUser) request.getSession().getAttribute("user"); 24 if (user == null) { 25 //拦截未登录请求,跳转到登录页面 26 request.getRequestDispatcher("/login").forward(request, response); 27 return false; 28 } 29 return true; 30 } 31 32 @Override 33 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { 34 35 } 36 37 @Override 38 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { 39 } 40 41 42 }
拦截器定义完成后,还需要将拦截器注册才能生效,并指定该拦截器所拦截的场景。
创建MyWebMvcConfig继承WebMvcConfigurerAdapter,并重写 addInterceptors 方法
package com.beilin.interceptor;
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;
@Configuration
public class MyWebMvcConfig implements WebMvcConfigurer {
/**
* 将自定义拦截器作为bean写入配置
* @return
*/
@Bean
public MyInterceptor myInterceptor(){
return new MyInterceptor();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
//拦截处理操作的匹配路径
//放开静态拦截
registry.addInterceptor(myInterceptor())
.addPathPatterns("/**") //拦截所有路径
.excludePathPatterns("/login", "/", "/exit", "/get_cpacha")//排除路径
.excludePathPatterns("/xadmin/**");//排除静态资源拦截
}
}
跟拦截器相关的执行流程如下:
测试--直接访问主页,拦截器自动拦截所有请求,判断用户是否登录,否--跳转到登录页面