java实现自定义免登录注解@LoginNotRequired,可加在controller或接口方法(需要登录也同理)
2022/1/2 20:07:29
本文主要是介绍java实现自定义免登录注解@LoginNotRequired,可加在controller或接口方法(需要登录也同理),对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
如何实现给接口或Controller加上我自己的注解就能让他必须登录或者不需要登录就能访问呢?
@RequestMapping("/test2") @LoginNotRequired public String test2() { return "test2"; }
@RestController @RequestMapping("user") @LoginNotRequired public class UserController { }
第一步-定义注解
/** * 该接口无需登录 * 加该注解不影响对已登录用户的读取和@UserId、@LoginedUser注入 * * @author : humorchen * @date 2021/12/5 */ @Retention(RetentionPolicy.RUNTIME) @Target({ElementType.TYPE, ElementType.METHOD}) public @interface LoginNotRequired { }
第二步-拦截掉所有请求并鉴权放行
我们实现可能有所不同,但是道理是一样的,就是定义一个intercepto( implements HandlerInterceptor)拦截掉所有请求,在请求被处理器执行之前(preHandle)就去执行我们的鉴权操作
/** * 用户登录拦截器 * * @author :humorchen * @date 2022/1/1 21:53 */ @Component @Slf4j public class UserLoginInterceptor implements HandlerInterceptor { @Autowired private IUserAuthUtil userAuthUtil; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { boolean loginNotRequired = false; if (handler instanceof HandlerMethod) { //转换对象 HandlerMethod handlerMethod = (HandlerMethod) handler; //controller类 Class controllerClass = handlerMethod.getBean().getClass(); //类上有没有免登录注解 boolean controllerHasLoginNotRequired = controllerClass.isAnnotationPresent(LoginNotRequired.class); if (controllerHasLoginNotRequired) { loginNotRequired = true; } //方法上有没有免登录注解 boolean methodHasLoginNotRequired = handlerMethod.hasMethodAnnotation(LoginNotRequired.class); if (methodHasLoginNotRequired) { loginNotRequired = true; } //检验登录的token String token = request.getHeader(IUserAuthUtil.HEADER_NAME); if (!StringUtils.isEmpty(token)) { //有token //token格式不对 BusinessAssert.isTrue(userAuthUtil.checkTokenFormat(token), CommonErrorEnums.LOGIN_INVALID); //检查token Long userId = userAuthUtil.checkToken(token); //没登录(免登录) BusinessAssert.isTrue(loginNotRequired || !(userId == IUserAuthUtil.NOT_LOGIN), CommonErrorEnums.NEED_LOGIN); //登录失效 BusinessAssert.isTrue(!(userId == IUserAuthUtil.LOGIN_INVALID), CommonErrorEnums.LOGIN_INVALID); if (userId > 0) { //获取用户信息 User user = userAuthUtil.getUserFromRedis(userId); //设置到request attribute里 request.setAttribute(IUserAuthUtil.LOGINED_USER, user); } } else { //没有token又没有免登录就打回 BusinessAssert.isTrue(loginNotRequired, CommonErrorEnums.NEED_LOGIN); } } return true; } }
第三步-注册拦截器
/** * spring mvc web 配置 * * @author :humorchen * @date 2022/1/1 22:14 */ @Configuration public class WebMvcConfiguration implements WebMvcConfigurer { @Autowired private UserLoginInterceptor userLoginInterceptor; @Override public void addInterceptors(InterceptorRegistry registry) { //拦截所有请求做登录检查 registry.addInterceptor(userLoginInterceptor).addPathPatterns("/**"); } }
使用截图
这篇关于java实现自定义免登录注解@LoginNotRequired,可加在controller或接口方法(需要登录也同理)的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-10-06小米11i印度快充版ROM合集:极致体验,超越期待
- 2024-10-06【ROM下载】小米11i 5G 印度版系统, 疾速跃迁,定义新速度
- 2024-10-06【ROM下载】小米 11 青春活力版,青春无极限,活力全开
- 2024-10-05小米13T Pro系统合集:性能与摄影的极致融合,值得你升级的系统ROM
- 2024-10-01基于Python+Vue开发的医院门诊预约挂号系统
- 2024-10-01基于Python+Vue开发的旅游景区管理系统
- 2024-10-01RestfulAPI入门指南:打造简单易懂的API接口
- 2024-10-01初学者指南:了解和使用Server Action
- 2024-10-01Server Component入门指南:搭建与配置详解
- 2024-10-01React 中使用 useRequest 实现数据请求