package com.javaweb.app.common.interceptor; import java.lang.reflect.Method; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; 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 com.javaweb.app.common.annotation.PassToken; import com.javaweb.app.common.exception.UnauthorizedException; import com.javaweb.app.common.util.JwtUtil; import com.javaweb.app.controller.sys.entity.AppUser; import com.javaweb.app.controller.sys.service.impl.UserService; public class AuthenticationInterceptor implements HandlerInterceptor { public static final String USER_KEY = "userId"; @Autowired UserService userService; @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object object) throws Exception { String token = request.getHeader("token");// 从 http 请求头中取出 // token // 如果不是映射到方法直接通过 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 (token == null) { throw new RuntimeException("无token,请重新登录"); } String username = JwtUtil.getUsername(token); if (username == null) { throw new RuntimeException("token invalid"); } AppUser appUser = userService.findByUsername(username); if (appUser == null) { throw new RuntimeException("用户不存在,请重新登录"); } // 验证 token if (!JwtUtil.verify(token, appUser.getUsername(), appUser.getPassword())) { throw new UnauthorizedException(); } // 设置userId到request里,后续根据userId,获取用户信息 request.setAttribute(USER_KEY, appUser.getId()); 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 { } }