在SpringBoot中要想实现权限的控制有可以用框架,有shrio,Spring Security,或者就是去数据库设计权限访问字段,通过字段去限制,今天我要给大家分享的是通过注解+拦截器进行用户访问权限的控制。直接上代码进行讲解
1.创建LoginInterceptor类并且实现HandlerInterceptor接口,主要实现里面的两个方法分别是:preHandle和afterCompletion
public class LoginInterceptor implements HandlerInterceptor {
//前置拦截器
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//1.获取session
HttpSession session = request.getSession();
//2.获取session中的用户
Object user = session.getAttribute("user");
//3.判断用户是否存在
if (user == null) {
//4.不存在,拦截
response.setStatus(401);
return false;
} else {
//5.存在,保存用户信息到ThreadLocal
UserHolder.saveUser((UserDTO) user);
}
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
UserHolder.removeUser();
}
}
preHandle方法
调用时间:Controller方法处理之前
执行顺序:链式Intercepter情况下,Intercepter按照声明的顺序一个接一个执行
若返回false,则中断执行,注意:不会进入afterCompletion
afterCompletion方法
调用前提:preHandle返回true
调用时间:DispatcherServlet进行视图的渲染之后
多用于清理资源
到这里权限配置并没有完成,需要再去创建一个配置类去添加这个拦截器
@Configuration
public class MvcConfig implements WebMvcConfigurer {
//添加拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new LoginInterceptor())
//排除哪些路径不需要进行拦截
.excludePathPatterns("user/code",
"user/login",
"/blog/hot",
"shop/**",
"/shop-type/**",
"/upload/**",
"/voucher/**");
}
}
最后里面的UserHolder是处理ThreadLocal的一个工具类,用户保存用户信息
public class UserHolder {
private static final ThreadLocal<UserDTO> tl = new ThreadLocal<>();
public static void saveUser(UserDTO user){
tl.set(user);
}
public static UserDTO getUser(){
return tl.get();
}
public static void removeUser(){
tl.remove();
}
}