1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60
| package com.example.demo.interceptor;
import jakarta.servlet.http.HttpServletRequest; import jakarta.servlet.http.HttpServletResponse; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.stereotype.Component; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView;
@Component public class DemoInterceptor implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(DemoInterceptor.class);
// 在Controller方法执行之前调用 @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { long startTime = System.currentTimeMillis(); request.setAttribute("startTime", startTime);
String requestURI = request.getRequestURI(); String clientIP = request.getRemoteAddr(); logger.info(">>> preHandle: Request URL=[{}], Client IP=[{}]", requestURI, clientIP);
// 认证检查示例(简单版) String token = request.getHeader("Authorization"); if (token == null || !token.startsWith("Bearer ")) { logger.warn("Access denied: Missing or invalid token"); response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); return false; // 中断请求,不再调用Controller } // 可以在这里解析Token并将用户信息放入request attribute,供Controller使用 // request.setAttribute("userInfo", parsedUserInfo);
return true; // 继续执行,调用下一个拦截器或Controller }
// 在Controller方法执行之后,视图渲染之前调用 @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { logger.info(">>> postHandle: Request handled successfully."); // 可以对ModelAndView进行修改 }
// 在整个请求完成之后调用(视图渲染完毕) @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { long startTime = (Long) request.getAttribute("startTime"); long endTime = System.currentTimeMillis(); long executeTime = endTime - startTime;
String requestURI = request.getRequestURI(); logger.info(">>> afterCompletion: Request URL=[{}], Time Taken=[{}ms]", requestURI, executeTime);
if (ex != null) { logger.error("Request processing failed with exception: ", ex); } } }
|