SpringBoot实现登录拦截器
SpringBoot拦截器可以做什么
可以对URL路径进行拦截,可以用于权限验证、解决乱码、操作日志记录、性能监控、异常处理等。
我们通过实现HandlerInterceptor接口,进行登录拦截,话不多说,上代码
public class LoginConfig implements HandlerInterceptor {
@Autowired
private RedisTemplate<Object,Object> redisTemplate;
/**
* 在请求处理之前进行调用(Controller方法调用之前)
*/
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("进入拦截器!");
String token=request.getHeader("token");//在请求体中拿到token令牌
token=token==null?"":token;
System.out.println("token......---:"+token);
Long expire=0L;
try {
expire=redisTemplate.getExpire(token);//通过token获取存在redis数据库中的user对象的过期时间
System.out.println("运行..");
}catch (Exception e){
e.printStackTrace();
System.out.println("catch");
}
if(expire > 0){//判断对象过期时间是否小于0,小于0就代表过期,没有过期就放行
//放行之前确保用户在使用过程中登录状态不会过期
//每次请求的时候,重置过期时间
redisTemplate.expire(token,30, TimeUnit.MINUTES);
System.out.println("放行");
return true;
}else {//数据过期,跳转登录界面,重新登录
System.out.println("拦截------数据过期,跳转登录界面,重新登录");
return false;
}
}
/**
* 请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
*/
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
}
/**
* 在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
*/
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
}
}
这是基于token认证,实现的登录拦截 ,不了解token的话,可以点此连接简单了解token
通过继承WebMvcConfigurerAdapter类扩展mvc业务
/**
* 继承WebMvcConfigurerAdapter抽象类,扩展mvc功能
*/
@Configuration
public class WebMvcConfig extends WebMvcConfigurerAdapter {
@Bean
public LoginConfig getSessionInterceptor() {
return new LoginConfig();
}
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(getSessionInterceptor()).addPathPatterns("/**")//拦截所有请求
.excludePathPatterns("/user/login").//不拦截的请求
excludePathPatterns("/home");
}
}
Controller类,校验账号密码,并生成token,服务端保存至redis数据库,key:token------value:user信息,将token发送到前端
@RestController
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private RedisTemplate<Object,Object> redisTemplate;
@PostMapping("/login")//登录
public Result login(@RequestParam(value = "userName",defaultValue = "abel") String userName,
@RequestParam(value = "password",defaultValue = "123456") String password,
HttpServletRequest request){
System.out.println("登录");
String token=UUID.randomUUID()+"";//生成唯一不重复的字符串,代替登陆
User user=userService.login(userName,password);
if(user != null){//用户不等于空,登录成功
redisTemplate.opsForValue().set(token,user, Duration.ofMinutes(30L));
//request.getSession().setAttribute("user",user);
return Result.success(200,"请求成功!",token);
}else{
return Result.error(400,"登录失败!");
}
}
}