服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Java教程 - Redis + Java拦截器实现用户匿名和非匿名访问

Redis + Java拦截器实现用户匿名和非匿名访问

2023-02-24 14:50步尔斯特 Java教程

本文主要介绍了Redis + Java拦截器实现用户匿名和非匿名访问,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

该篇文章以《Redis实现短信验证码登录》这篇文章为基础,以Redis和Java拦截器为核心,对登录功能展开研究和应用。

 

需求

  • 对所有的接口按需分类
  • 一些接口可以匿名访问
  • 一些接口必须登录才可以访问
  • 刷新token

 

实现截图

获取验证码

Redis + Java拦截器实现用户匿名和非匿名访问

用验证码完成登录,并获取token

Redis + Java拦截器实现用户匿名和非匿名访问

用token实现访问非匿名访问接口

Redis + Java拦截器实现用户匿名和非匿名访问

 

核心代码

WebMvcConfigurer

/**
* @author issavior
*/
@Configuration
public class MyWebMvcConfigurer implements WebMvcConfigurer {

  @Autowired
  private RedisTemplate<String, Object> redisTemplate;

  @Override
  public void addInterceptors(InterceptorRegistry registry) {
      registry.addInterceptor(new RefreshTokenInterceptor(redisTemplate))
              .addPathPatterns("/**").order(0);
      registry.addInterceptor(new MyHandlerInterceptor()).addPathPatterns("/user/pay").order(1);
  }
}

HandlerInterceptor

刷新token、添加和移除用户信息到Threadlocal、

/**
* @author issavior
*/
@Slf4j
public class RefreshTokenInterceptor implements HandlerInterceptor {

  private final RedisTemplate<String, Object> redisTemplate;

  public RefreshTokenInterceptor(RedisTemplate<String, Object> redisTemplate) {
      this.redisTemplate = redisTemplate;
  }

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)  {

      String token = request.getHeader("authToken");
      if (StrUtil.isBlank(token)) {
          return true;
      }

      String key = "token:"+token;

      Issa issa = (Issa)redisTemplate.opsForValue().get(key);
      if (issa == null) {
          return true;
      }

      UserHolder.saveUser(issa);

      redisTemplate.expire(key, 60, TimeUnit.SECONDS);

      return true;
  }

  @Override
  public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {

      log.info("postHandle");
  }

  @Override
  public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
      UserHolder.removeUser();
  }
}

判断用户是否有权限

/**
* @author issavior
*/
public class MyHandlerInterceptor implements HandlerInterceptor {

  @Override
  public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
      // 1.判断是否需要拦截(ThreadLocal中是否有用户)
      if (UserHolder.getUser() == null) {
          // 没有,需要拦截,设置状态码
          response.setStatus(401);
          // 拦截
          return false;
      }
      // 有用户,则放行
      return true;
  }
}

ThreadLocal

/**
* @author issavior
*/
public class UserHolder {

  private static final ThreadLocal<Issa> tl = new ThreadLocal<>();

  public static void saveUser(Issa user){
      tl.set(user);
  }

  public static Issa getUser(){
      return tl.get();
  }

  public static void removeUser(){
      tl.remove();
  }

}

到此这篇关于Redis + Java拦截器实现用户匿名和非匿名访问的文章就介绍到这了,更多相关Redis Java用户匿名和非匿名访问内容请搜索服务器之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持服务器之家!

原文链接:https://blog.csdn.net/CSDN_SAVIOR/article/details/125109250

延伸 · 阅读

精彩推荐