SpringBoot实现登录拦截器

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,"登录失败!");
        }
    }
}
  • 2
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值