package com.happy.interceptor; import com.alibaba.fastjson.JSONObject; import com.happy.Model.Login; import com.happy.Until.ResultUtil; import com.happy.Until.TokenUtil; import com.happy.annotation.PassToken; import com.happy.annotation.UserLoginToken; import com.happy.constant.ResultStatusCode; import com.happy.service.UserService; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.method.HandlerMethod; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.lang.reflect.Method; import java.time.LocalDateTime; import java.util.List; public class AuthenticationInterceptor implements HandlerInterceptor { @Autowired UserService userService; @Override public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object object) throws Exception { String access_token = TokenUtil.getRequestToken(httpServletRequest); // 如果不是映射到方法直接通过 if(!(object instanceof HandlerMethod)){ return true; } HandlerMethod handlerMethod=(HandlerMethod)object; Method method=handlerMethod.getMethod(); //检查是否有passtoken注释,有则跳过认证 if (method.isAnnotationPresent(PassToken.class)) { PassToken passToken = method.getAnnotation(PassToken.class); if (passToken.required()) { return true; } } //检查有没有需要用户权限的注解 if (method.isAnnotationPresent(UserLoginToken.class)) { UserLoginToken userLoginToken = method.getAnnotation(UserLoginToken.class); if (userLoginToken.required()) { // 执行认证 if (access_token == null) { throw new RuntimeException(JSONObject.toJSONString(ResultUtil.build(ResultStatusCode.SHIRO_ERROR))); } //1. 根据token,查询用户信息 List logins = userService.findByToken(access_token); //2. 若用户不存在, if (logins.isEmpty()) { throw new RuntimeException(JSONObject.toJSONString(ResultUtil.build(ResultStatusCode.LOGINED_IN2))); } //3. token失效 LocalDateTime tie = LocalDateTime.parse(logins.get(0).getAccess_token()); if (tie.isBefore(LocalDateTime.now())) { throw new RuntimeException(JSONObject.toJSONString(ResultUtil.build(ResultStatusCode.LOGINED_IN3))); } return true; } } return true; } @Override public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception { } @Override public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception { } }