新增注解类
@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了。