package com.yanzhen.framework.mvc; // 定义包名 import com.yanzhen.entity.Student; // 导入Student类 import com.yanzhen.entity.User; // 导入User类 import com.yanzhen.framework.exception.MyException; // 导入自定义异常类MyException import com.yanzhen.framework.jwt.JWTUtil; // 导入JWT工具类JWTUtil import org.springframework.web.servlet.HandlerInterceptor; // 导入Spring MVC的HandlerInterceptor接口 import org.springframework.web.servlet.ModelAndView; // 导入Spring MVC的ModelAndView类 import javax.servlet.http.HttpServletRequest; // 导入HttpServletRequest类 import javax.servlet.http.HttpServletResponse; // 导入HttpServletResponse类 public class TokenInterceptor implements HandlerInterceptor { // 定义TokenInterceptor类并实现HandlerInterceptor接口 @Override // 重写preHandle方法,在请求处理之前进行调用 public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader(JWTUtil.token); // 从请求头中获取token String type = JWTUtil.getType(token); // 根据token获取类型 if("USER".equals(type)){ // 如果类型是USER //根据token获取user对象 User user = JWTUtil.getUser(token); // 通过JWT工具类获取User对象 if(user == null){ // 如果User对象为空 throw new MyException("超时或不合法的token"); // 抛出自定义异常 } String newToken = JWTUtil.sign(user); // 重新生成新的token response.setHeader(JWTUtil.token,newToken); // 将新token设置到响应头中 response.setHeader("Access-Control-Expose-Headers", JWTUtil.token); // 设置允许暴露的响应头 request.setAttribute("user",user); // 将User对象设置到请求属性中 }else if("STUDENT".equals(type)){ // 如果类型是STUDENT //根据token获取user对象 Student student = JWTUtil.getStudent(token); // 通过JWT工具类获取Student对象 if(student == null){ // 如果Student对象为空 throw new MyException("超时或不合法的token"); // 抛出自定义异常 } String newToken = JWTUtil.signForStudent(student); // 重新生成新的token response.setHeader(JWTUtil.token,newToken); // 将新token设置到响应头中 response.setHeader("Access-Control-Expose-Headers", JWTUtil.token); // 设置允许暴露的响应头 request.setAttribute("student",student); // 将Student对象设置到请求属性中 } return true; // 返回true表示继续执行后续的拦截器和处理器 } @Override // 重写postHandle方法,在请求处理之后但在视图渲染之前进行调用 public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { } @Override // 重写afterCompletion方法,在整个请求结束之后进行调用 public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { } }