拦截器与过滤器
1:过滤器
过滤器主要作用在请求到达Servlet之前,对请求进行预处理,可以对HTTP请求进行过滤、修改。过滤器通常用于日志记录、字符编码转换、权限检查等任务。过滤器是基于回调函数实现的,重写doFilter()方法实现过滤逻辑,过滤器来自Servlet
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import java.io.IOException;public class CustomFilter implements Filter {@Overridepublic void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)throws IOException, ServletException {// 这里可以执行预处理操作chain.doFilter(request, response); // 调用下一个过滤器或目标资源// 这里可以执行后处理操作}@Overridepublic void init(FilterConfig filterConfig) throws ServletException {// 初始化操作}@Overridepublic void destroy() {// 销毁操作}
}
2:拦截器
拦截器主要作用在请求到达Controller之前或之后,对请求进行拦截,防止非法请求到达Controller,或者在请求到达Controller之后,对返回结果进行加工处理。在Java Web应用中,可以通过定义拦截器(Interceptor)来实现对请求和响应的拦截和处理。拦截器可以在请求被处理前、后或异常时执行相应的操作,比如权限验证、日志记录、性能监控等,拦截器来自Spring
public class CustomInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {// 在处理程序执行之前调用// 添加您要执行的自定义逻辑response.getWriter().write("Your custom response message");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,ModelAndView modelAndView) throws Exception {// 在处理程序执行后调用}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,Exception ex) throws Exception {// 在请求完成后调用}
}
2-1:在Spring Boot中,可以通过实现HandlerInterceptor接口来定义拦截器,并且使用@Configuration注解和WebMvcConfigurer接口的addInterceptors方法来注册拦截器,示例代码如下:
@Configuration
public class WebConfig implements WebMvcConfigurer {@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(new CustomInterceptor()).addPathPatterns("/**") // 拦截所有路径.excludePathPatterns("/login"); // 不拦截登录请求}
}
3:监听器,用于监控应用程序事件,例如应用启动和销毁、会话创建和销毁
import org.springframework.context.ApplicationListener;
import org.springframework.context.event.ContextRefreshedEvent;public class SampleListener implements ApplicationListener<ContextRefreshedEvent> {@Overridepublic void onApplicationEvent(ContextRefreshedEvent event) {// 当应用程序上下文初始化完成时执行}
}