登录拦截器

本文介绍了AOP中的拦截器概念,如何使用HandlerInterceptor接口实现预处理、后处理和清理资源。以微信授权登录为例,展示了如何在SpringMVC中配置自定义拦截器,处理token验证和用户信息获取。
摘要由CSDN通过智能技术生成

(1)什么是拦截器?

在AOP(Aspect-Oriented Programming)中用于在某个方法或字段被访问之前,进行拦截然后在之前或之后加入某些操作,拦截是AOP的一种实现策略

(2)如何用拦截器:

第一步,实现HandlerInterceptor接口或者它的实现子类:HandlerInterceptorAdapter

第二步,实现接口中的方法:

preHandle:在业务处理器处理请求之前被调用 ​ postHandle:在业务处理器处理请求执行完成后 ​ afterCompletion:在完全处理完请求后被调用,可用于清理资源等

第三步,创建配置类,配置拦截器需要拦截的路径

(3)使用场景

1、微信授权登录,调用后端接口wxLogin,接口生成token,登录用户信息存入Redis,返回token

2、前端接收到微信登录接口返回的token

3、每次发送请求时候,把token放到请求头里面

4、后端从请求头获取token,从token中获取userId,根据userId获取登录的用户信息

(4)添加登录拦截器

public class UserLoginInterceptor implements HandlerInterceptor {

    private RedisTemplate redisTemplate;

    public UserLoginInterceptor(RedisTemplate redisTemplate) {
        this.redisTemplate = redisTemplate;
    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        this.initUserLoginVo(request);
        return true;
    }

    private void initUserLoginVo(HttpServletRequest request){
        //从请求头获取token
        String token = request.getHeader("token");
        System.out.println(token);
        if (!StringUtils.isEmpty(token)) {
            Long userId = JwtHelper.getUserId(token);
            UserLoginVo userLoginVo = (UserLoginVo)redisTemplate.opsForValue().get(RedisConst.USER_LOGIN_KEY_PREFIX + userId);
            if(userLoginVo != null) {
                //将UserInfo放入上下文中
                AuthContextHolder.setUserId(userLoginVo.getUserId());
                AuthContextHolder.setWareId(userLoginVo.getWareId());
            }
        }
    }
}

(5)设置自定义拦截路径

@Configuration
public class LoginMvcConfigurerAdapter extends WebMvcConfigurationSupport {

    @Resource
    private RedisTemplate redisTemplate;

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        //添加自定义拦截器,设置路径
        registry.addInterceptor(
                new UserLoginInterceptor(redisTemplate))
                .addPathPatterns("/api/**")
                .excludePathPatterns("/api/user/weixin/wxLogin/*");
        super.addInterceptors(registry);
    }
}

注:addPathPatterns()方法为拦截的路径,excludePathPatterns()方法为放行的路径。

  • 6
    点赞
  • 7
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值