做一个简单的springboot拦截器,登录校验。首先需要有一个用来判断是否拦截的根据,那么既然是登录消炎,就用登陆成功后存入session域的loginUser,
@RequestMapping(value="/login",method = RequestMethod.POST)
public String login(Model model,User user){
User loginUser = userservice.login(user);
session.setAttribute("loginUser",loginUser);
return "redirect:list";
}
创建login拦截器
@Component
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
//登录校验
//1.从session中或去loginUser, 判断是否登录过的依据-->loginUser
User loginUser = (User)request.getSession().getAttribute("loginUser");
//2.如果loginUser为null,跳转登录
if (loginUser == null){
//重定向到登录页面
response.sendRedirect("toLogin");
//种植请求处理
return false;
}
//3.说明登陆过,将请求交给controller处理
return true;
}
}
下面代码是config包下的MyWebMvcConfigurer : 配置拦截器
@Configuration //所有的配置类都要在config包下,并增加@Configuration注解
public class MyWebMvcConfigurer implements WebMvcConfigurer {
//对于springMvc的自定义的配置都需要通过WebMvcConfigurer接口实现
//配置拦截器需要
//1. 注入需要配置的拦截器对象
//2.实现addInterceptors方法,进行配置
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor) //指定需要配置的拦截器
.addPathPatterns("/**") //指定需要拦截的请求 /** 表示拦截所有
.excludePathPatterns("/list") //指定需要排除的请求
.excludePathPatterns("/login")
.excludePathPatterns("/toLogin")
.excludePathPatterns("/toRegister")
.excludePathPatterns("/*.html");
}
}
下面是使用自定义注解简化拦截器校验范围配置
在annotation包下的自定义注解配置
import java.lang.annotation.*;
@Documented
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface NeedLogin {
// 自定义 NeedLogin 注解,标识需要登录校验的方法
/**
* 自定义注解需要增加 @Target 和 @Retention 注解
* @Target 设置注解的使用范围
* TYPE 类
* FIELD 属性
* METHOD 方法
* PARAMETER 参数
*
* @Retention 设置注解的有效范围
* SOURCE 编码
* CLASS 编译
* RUNTIME 运行
*/
}
哪个方法需要拦截,就为其添加注解 @NeedLogin
@NeedLogin
@RequestMapping(value="/edit",method = RequestMethod.GET)
public String edit(Model model,Integer id){
User user = userservice.getById(id);
model.addAttribute("user",user);
return "edit";
}
MyWebMvcConfigurer类,只保留其中的拦截所有请求语句
@Configuration //所有的配置类都要在config包下,并增加@Configuration注解
public class MyWebMvcConfigurer implements WebMvcConfigurer {
//对于springMvc的自定义的配置都需要通过WebMvcConfigurer接口实现
//配置拦截器需要
//1. 注入需要配置的拦截器对象
//2.实现addInterceptors方法,进行配置
@Autowired
private LoginInterceptor loginInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(loginInterceptor) //指定需要配置的拦截器
.addPathPatterns("/**"); //指定需要拦截的请求 /** 表示拦截所有
// .excludePathPatterns("/list") //指定需要排除的请求
// .excludePathPatterns("/login")
// .excludePathPatterns("/toLogin")
// .excludePathPatterns("/toRegister")
// .excludePathPatterns("/*.html");
}
}
LoginInterceptor类添加语句判断有无 @NeedLogin 注解
@Component
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 根据hander 是否有 NeedLogin 注解来决定是否进行登录校验
if (handler instanceof HandlerMethod //先判断是不是controller中的方法
&&((HandlerMethod)handler).getMethodAnnotation(NeedLogin.class)== null){ //再判断是不是@NeedLogin的注解
//如果获取不到 NeedLogin注解,说明该方法没有被注解标识,说明不需要进行登录校验。
return true;
}
//登录校验
//1.从session中或去loginUser, 判断是否登录过的依据-->loginUser
User loginUser = (User)request.getSession().getAttribute("loginUser");
//2.如果loginUser为null,跳转登录
if (loginUser == null){
//重定向到登录页面
response.sendRedirect("toLogin");
//种植请求处理
return false;
}
//3.说明登陆过,将请求交给controller处理
return true;
}
}