新增注解类
@Documented
@Inherited
@Target({ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
public @interface Session {String value() default "";
}
那如何使用呢?
@RequestMapping({"/logout"})@ResponseBodypublic 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);@Resourceprivate 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 {@ResourceSessionArgumentsResolver sessionArgumentsResolver;@Overridepublic void addArgumentResolvers(List<HandlerMethodArgumentResolver> argumentResolvers) {argumentResolvers.add(sessionArgumentsResolver);}}
如果是springmvc是直接就可以用 ,springboot就需要实现WebMvcConfigurer了。