Java中过滤器和拦截器区别

1. 过滤器(Filters)

过滤器是Servlet规范中的一部分,它用于在请求进入Web应用程序时预处理请求,或在响应离开应用程序前进行处理。过滤器可以作用于请求内容、请求头、响应内容等。过滤器在Servlet容器中运行,并且与Servlet无关。主要用途包括字符编码转换、身份验证、请求包装等。

实现过滤器

实现过滤器一般需要以下步骤:

  • 创建一个实现了javax.servlet.Filter接口的过滤器类。
  • 实现接口中的doFilter方法,在其中编写过滤逻辑。
  • 在web.xml或使用注解(如@WebFilter)中进行过滤器的配置。

实现过滤器(Filter)

typescript 复制代码
import javax.servlet.*;
import java.io.IOException;

public class CharacterEncodingFilter implements Filter {

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");
        chain.doFilter(request, response);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化相关操作
    }

    @Override
    public void destroy() {
        // 销毁相关操作
    }
}

配置过滤器

在web.xml中配置过滤器

typescript 复制代码
<filter>
    <filter-name>CharacterEncodingFilter</filter-name>
    <filter-class>com.example.CharacterEncodingFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>CharacterEncodingFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

使用@WebFilter注解配置过滤器

typescript 复制代码
import javax.servlet.annotation.WebFilter;
import javax.servlet.annotation.WebInitParam;
import javax.servlet.*;
import java.io.IOException;

@WebFilter(urlPatterns = "/*", initParams = {
        @WebInitParam(name = "encoding", value = "UTF-8")
})
public class CharacterEncodingFilter implements Filter {
    // 省略其他方法
}

2. 拦截器(Interceptors)

在Java中,拦截器通常与框架一起使用,例如Spring框架中的拦截器。拦截器主要用于对请求进行预处理和后处理,通常应用在MVC框架中,用于拦截处理器方法的调用。拦截器可以在请求前(preHandle)、请求后(postHandle)和视图渲染后(afterCompletion)执行相关操作。主要用途包括日志记录、身份验证、性能监控等。

实现拦截器

在Spring框架中,实现自定义拦截器一般需要以下步骤:

  • 创建一个实现了HandlerInterceptor接口的拦截器类。
  • 实现接口中的preHandle、postHandle和afterCompletion方法,根据需要进行相应的处理。
  • 在Spring配置文件中(如XML或Java Config)注册拦截器,并配置拦截的路径。

实现拦截器(Interceptor)

typescript 复制代码
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

public class LoggingInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在处理器方法执行之前被调用
        // 可以进行日志记录、身份验证等操作
        return true; // 如果返回false,则中断请求
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 在处理器方法执行之后、视图渲染之前被调用
        // 可以修改ModelAndView等
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 在DispatcherServlet完全处理完请求后被调用
        // 可以进行资源清理等操作
    }
}

配置拦截器

typescript 复制代码
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new LoggingInterceptor()).addPathPatterns("/**");
    }
}

3. 区别

用途:

  • 拦截器主要用于对请求的处理进行拦截、预处理和后处理,在框架中使用较多。
  • 过滤器主要用于对请求和响应进行过滤处理,属于Servlet规范的一部分。

范围:

  • 拦截器是在框架层面上进行处理,例如Spring中的MVC拦截器。
  • 过滤器是在Servlet容器内的Web应用程序层面上进行处理。

依赖:

  • 拦截器通常依赖于特定的框架,如Spring MVC。
  • 过滤器是Servlet容器的一部分,不依赖于具体的框架。
相关推荐
架构文摘JGWZ34 分钟前
Java 23 的12 个新特性!!
java·开发语言·学习
拾光师1 小时前
spring获取当前request
java·后端·spring
aPurpleBerry2 小时前
neo4j安装启动教程+对应的jdk配置
java·neo4j
我是苏苏2 小时前
Web开发:ABP框架2——入门级别的增删改查Demo
java·开发语言
xujinwei_gingko2 小时前
Spring IOC容器Bean对象管理-Java Config方式
java·spring
2301_789985942 小时前
Java语言程序设计基础篇_编程练习题*18.29(某个目录下的文件数目)
java·开发语言·学习
IT学长编程2 小时前
计算机毕业设计 教师科研信息管理系统的设计与实现 Java实战项目 附源码+文档+视频讲解
java·毕业设计·springboot·毕业论文·计算机毕业设计选题·计算机毕业设计开题报告·教师科研管理系统
m0_571957582 小时前
Java | Leetcode Java题解之第406题根据身高重建队列
java·leetcode·题解
程序猿小D2 小时前
第二百三十五节 JPA教程 - JPA Lob列示例
java·数据库·windows·oracle·jdk·jpa
Zd083 小时前
14.其他流(下篇)
java·前端·数据库