springboot2.2x 作为高级架构师你不得不知道的 元注解使用方式 @Session 元注解

新增注解类

@Documented
@Inherited
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Session {
   String value() default "";
}

那如何使用呢?


   @RequestMapping({"/logout"})
   @ResponseBody
   public void logout(@Session Long adminId, HttpServletRequest request, HttpServletResponse response) throws Exception {
      this.adminService.logout(adminId);
      HttpUtil.removeCookie(request, response, "admin_token");
   }

这时候adminId值是空的,还需要重新session


/**
 * 后期将token换成jwt 不查数据库
 */
@Service
public class SessionArgumentsResolver implements HandlerMethodArgumentResolver {
   private static Logger logger = LoggerFactory.getLogger(SessionArgumentsResolver.class);

   @Resource
   private AdminService adminService;

   public boolean supportsParameter(MethodParameter parameter) {
      return parameter.getParameterAnnotation(Session.class) != null;
   }

   public Object resolveArgument(MethodParameter parameter, ModelAndViewContainer mavContainer, NativeWebRequest webRequest, WebDataBinderFactory binderFactory) throws Exception {
      HttpServletRequest request = webRequest.getNativeRequest(HttpServletRequest.class);
      HttpServletResponse response = webRequest.getNativeResponse(HttpServletResponse.class);
      Class<?> paramType = parameter.getParameterType();
      Session sessionAnnotation = parameter.getParameterAnnotation(Session.class);
      if (sessionAnnotation != null) {
         Long adminId = this.getAdminId(request, response);
         if (adminId == null) {
            return null;
         }

         Admin admin = this.adminService.get(adminId);
         if (admin == null) {
            return null;
         }

         if (Admin.class == paramType) {
            return admin;
         }

         String parameterName = sessionAnnotation.value();
         if (StringUtils.isEmpty(parameterName)) {
            parameterName = parameter.getParameterName();
         }
         assert parameterName != null;
         if (parameterName.equals("adminId")) {
            return admin.getId();
         }

         Field field = FieldUtils.getDeclaredField(Admin.class, parameterName, true);
         if (field != null) {
            return field.get(admin);
         }
         logger.error("错误的参数名称:" + parameterName + ",请查看" + Admin.class);
      }

      return null;
   }

   private Long getAdminId(HttpServletRequest request, HttpServletResponse response) {
      String token = TokenManager.getAdminRequestToken(request);
      if (StringUtil.isBlank(token)) {
         return null;
      } else {
         try {
            Long uid = TokenManager.getUidByToken(token);
            if (uid == null) {
               return null;
            } else {
               TokenInfo tokenInfo = this.adminService.getTokenInfo(uid);
               if (tokenInfo == null) {
                  return null;
               } else {
                  return !tokenInfo.getToken().equals(token) ? null : tokenInfo.getUid();
               }
            }
         } catch (Exception var6) {
            HttpUtil.removeCookie(request, response, "token");
            LogUtil.error("SessionArgumentsResolver, adminUid error", var6);
            return null;
         }
      }
   }
}
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
 
    @Resource
    SessionArgumentsResolver sessionArgumentsResolver;

 

    @Override
    public void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {
        argumentResolvers.add(sessionArgumentsResolver);
    }

}

如果是springmvc是直接就可以用  ,springboot就需要实现WebMvcConfigurer了。

发布了35 篇原创文章 · 获赞 1 · 访问量 1万+

猜你喜欢

转载自blog.csdn.net/u010494101/article/details/104609993
今日推荐