拦截器与过滤器
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 {
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
// 这里可以执行预处理操作
chain.doFilter(request, response); // 调用下一个过滤器或目标资源
// 这里可以执行后处理操作
}
@Override
public void init(FilterConfig filterConfig) throws ServletException {
// 初始化操作
}
@Override
public void destroy() {
// 销毁操作
}
}
2:拦截器
拦截器主要作用在请求到达Controller之前或之后,对请求进行拦截,防止非法请求到达Controller,或者在请求到达Controller之后,对返回结果进行加工处理。在Java Web应用中,可以通过定义拦截器(Interceptor)来实现对请求和响应的拦截和处理。拦截器可以在请求被处理前、后或异常时执行相应的操作,比如权限验证、日志记录、性能监控等,拦截器来自Spring
public class CustomInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
// 在处理程序执行之前调用
// 添加您要执行的自定义逻辑
response.getWriter().write("Your custom response message");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {
// 在处理程序执行后调用
}
@Override
public 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 {
@Override
public 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> {
@Override
public void onApplicationEvent(ContextRefreshedEvent event) {
// 当应用程序上下文初始化完成时执行
}
}