您好,登录后才能下订单哦!
密码登录
登录注册
点击 登录注册 即表示同意《亿速云用户服务条款》
在Spring框架中,拦截器(Interceptor)是一种强大的机制,用于在处理请求之前或之后执行特定的逻辑。拦截器通常用于实现横切关注点(cross-cutting concerns),例如日志记录、性能监控、安全检查等。Spring提供了多种方式来实现拦截器,其中最常用的是基于HandlerInterceptor接口的实现。
以下是拦截器在Spring框架中的一些应用:
preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
:在请求处理之前调用。postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView)
:在请求处理之后,但在视图渲染之前调用。afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex)
:在请求处理完成之后调用,无论是否有异常发生。拦截器可以通过Java配置或XML配置来注册。
@Configuration
public class WebConfig implements WebMvcConfigurer {
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(new MyInterceptor())
.addPathPatterns("/api/**") // 拦截/api/**路径下的所有请求
.excludePathPatterns("/api/login", "/api/register"); // 排除某些路径
}
}
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/api/**"/>
<mvc:exclude-mapping path="/api/login"/>
<mvc:exclude-mapping path="/api/register"/>
<bean class="com.example.MyInterceptor"/>
</mvc:interceptor>
</mvc:interceptors>
在请求处理之前和之后记录日志,便于跟踪请求的处理过程。
public class LoggingInterceptor implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(LoggingInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
logger.info("Request URL: {}", request.getRequestURL());
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
logger.info("Request completed: {}", request.getRequestURL());
}
}
在请求处理前后记录时间戳,计算请求的处理时间。
public class PerformanceInterceptor implements HandlerInterceptor {
private static final Logger logger = LoggerFactory.getLogger(PerformanceInterceptor.class);
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
request.setAttribute("startTime", System.currentTimeMillis());
return true;
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
long startTime = (Long) request.getAttribute("startTime");
long endTime = System.currentTimeMillis();
logger.info("Request took {} ms: {}", endTime - startTime, request.getRequestURL());
}
}
在请求处理之前进行身份验证和授权检查。
public class SecurityInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Authentication authentication = SecurityContextHolder.getContext().getAuthentication();
if (authentication == null || !authentication.isAuthenticated()) {
response.sendRedirect("/login");
return false;
}
return true;
}
}
addPathPatterns
和excludePathPatterns
方法的顺序来控制。preHandle
方法的返回值决定了请求是否继续处理。如果返回false
,请求将被中断,不会进入控制器方法。afterCompletion
方法中可以处理请求过程中抛出的异常。通过合理使用拦截器,可以有效地实现横切关注点,提高代码的可维护性和可扩展性。
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。