web开发中拦截器和过滤器的作用和区别-附上代码示例

Web开发中,拦截器(Interceptor)和过滤器(Filter)都是常用的组件,它们可以对HTTP请求进行预处理、后处理以及一些额外的操作。在这篇文章中,我们将详细讲述拦截器和过滤器的作用和区别,并使用Java代码举例说明它们的使用。

一、拦截器和过滤器的作用

  1. 拦截器的作用
    拦截器主要用于AOP(面向切面编程),即在方法执行前后进行相应的处理。典型的应用场景包括:
  • 身份验证:检查用户是否登录或者是否有权限访问某个资源。
  • 日志记录:记录请求参数、响应结果、请求时间等信息,方便后续的调试和分析。
  • 事务处理:在业务方法执行前后,启动或提交事务,保证数据的完整性和一致性。
  • 缓存控制:对请求进行缓存,提高系统性能和响应速度等。
  1. 过滤器的作用
    过滤器主要用于对用户请求进行过滤和修改,并将其发送到目标资源或者返回相应的错误响应。典型的应用场景包括:
  • 字符编码:将请求和响应的字符集转换成指定的编码方式,避免乱码问题。
  • 安全控制:检查请求参数是否合法,避免SQL注入等安全问题。
  • 错误处理:捕获异常并返回相应的错误信息,保证系统的稳定性和可靠性。
  • 日志记录:记录请求路径、请求参数、响应结果等信息,方便后续的分析和排查问题。

二、拦截器和过滤器的区别

  1. 范围不同
    拦截器是针对具体的某个请求进行的处理,比如处理SpringMVC框架下的请求。而过滤器则作用于整个应用程序,通过匹配URL路径来确定是否需要过滤该请求。

  2. 执行顺序不同
    拦截器的执行顺序是与调用链有关的,需要在方法调用前后进行处理。而过滤器的执行顺序则是固定的,以过滤器配置文件中的顺序为准。

  3. 功能略有不同
    拦截器主要用于业务处理的增强,比如日志记录、缓存控制、事务处理等方面。而过滤器主要用于对用户请求进行过滤和修改,并将其发送到目标资源或者返回相应的错误响应。

三、使用示例

3.1我们可以通过Java代码来演示拦截器和过滤器的使用。

这里给出一个使用Spring MVC中拦截器的例子:

(1). 创建一个拦截器

public class AuthenticationInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在这里对请求进行身份验证的操作
        // 如果验证成功,返回true;否则,返回false
        return true;
    }

    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
        // 在Handler执行完毕之后,在这里进行一些处理,比如日志记录等操作
    }

    @Override
    public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
        // 在整个请求结束之后,在这里进行一些清理工作,比如资源回收等操作
    }
}

上述代码中,我们定义了一个名为AuthenticationInterceptor的拦截器,并实现了HandlerInterceptor接口中的三个方法:preHandle、postHandle和afterCompletion。其中,preHandle方法用于在请求处理之前进行拦截,可以进行身份验证等操作;postHandle方法用于在请求处理之后进行拦截,可以记录一些日志等操作;afterCompletion方法用于在整个请求处理完成之后进行拦截,可以进行资源回收等操作。

(2). 配置拦截器

在Spring MVC的配置文件中,我们需要配置拦截器的相关信息,包括拦截器的类名和拦截路径等。示例如下:

<mvc:interceptors>
    <mvc:interceptor>
        <mvc:mapping path="/**"/>
        <mvc:exclude-mapping path="/login"/>
        <bean class="com.example.AuthenticationInterceptor"/>
    </mvc:interceptor>
</mvc:interceptors>

上述代码中,我们使用mvc:interceptor标签来定义一个拦截器,并指定了拦截路径为/**,即对所有请求进行拦截。同时,我们使用mvc:exclude-mapping标签来排除/login路径的请求,避免登录操作被重复拦截。最后,我们将AuthenticationInterceptor类作为拦截器的实现类进行配置。

(3). 使用拦截器

当我们访问应用程序中的某个页面时,拦截器会自动进行拦截和处理。如果拦截器的preHandle方法返回false,则请求不会继续往下执行,并且会返回相应的错误信息。如果preHandle方法返回true,则请求会继续执行,直到请求结束并调用afterCompletion方法。在这个过程中,拦截器可以进行一些额外的操作,比如日志记录、身份验证、资源回收等等。

3.2这里给出一个使用Java Web中过滤器的例子:

(1). 创建一个过滤器

public class AuthenticationFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 在这里进行一些初始化操作,比如读取配置文件等
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 在这里对请求进行身份验证的操作
        // 如果验证成功,调用chain.doFilter方法将请求传递到下一个过滤器或Servlet;否则,返回错误信息
        chain.doFilter(request, response);
    }

    @Override
    public void destroy() {
        // 在这里进行一些资源回收的操作,比如关闭数据库连接等
    }
}

上述代码中,我们定义了一个名为AuthenticationFilter的过滤器,并实现了Filter接口中的三个方法:init、doFilter和destroy。其中,init方法在过滤器被初始化时调用,可以进行一些初始化操作;doFilter方法用于处理请求,可以进行身份验证等操作,也可以通过调用chain.doFilter方法继续将请求传递到下一个过滤器或Servlet;destroy方法在过滤器被销毁时调用,可以进行一些资源回收等操作。

(2). 配置过滤器

在web.xml文件中,我们需要配置过滤器的相关信息,包括过滤器的类名和过滤路径等。示例如下:

<filter>
    <filter-name>AuthenticationFilter</filter-name>
    <filter-class>com.example.AuthenticationFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>AuthenticationFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

上述代码中,我们使用标签来定义一个过滤器,并指定了过滤器的类名为com.example.AuthenticationFilter。同时,我们使用标签来定义过滤器的映射路径,即对所有请求进行过滤。

(3). 使用过滤器

当我们访问Web应用程序中的某个页面时,过滤器会自动进行过滤和处理。如果请求与过滤器的映射路径匹配,则过滤器的doFilter方法将被调用,可以在该方法中进行一些额外的操作,比如身份验证、日志记录等等。如果过滤器需要继续将请求传递到下一个过滤器或Servlet,可以通过调用chain.doFilter方法实现。如果不希望将请求传递到下一个过滤器或Servlet,可以直接返回相应的错误信息。最后,在过滤器被销毁时,可以进行一些资源回收等操作。

3.3这里给出一个使用Spring Boot中过滤器的例子:

(1). 创建一个过滤器

@Component
public class AuthenticationFilter implements Filter {
 
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 在这里对请求进行身份验证的操作
        // 如果验证成功,调用chain.doFilter方法将请求传递到下一个过滤器或Servlet;否则,返回错误信息
        chain.doFilter(request, response);
    }
 
    // 省略其他两个方法
}

上述代码中,我们定义了一个名为AuthenticationFilter的过滤器,并实现了Filter接口中的doFilter方法。在该方法中,我们可以进行一些额外的操作,比如身份验证、记录日志等。

(2). 配置过滤器

在Spring Boot的配置类中,我们需要添加一个@Bean注解来创建过滤器的实例,并配置过滤器的映射路径。示例如下:

@Configuration
public class AppConfig {
 
    @Bean
    public FilterRegistrationBean<AuthenticationFilter> filterRegistrationBean() {
        FilterRegistrationBean<AuthenticationFilter> registrationBean = new FilterRegistrationBean<>();
        registrationBean.setFilter(new AuthenticationFilter());
        registrationBean.addUrlPatterns("/*");
        return registrationBean;
    }
}

上述代码中,我们使用@Configuration注解标识一个配置类,并通过@Bean注解创建一个名为filterRegistrationBean的Bean实例。在该实例中,我们通过setFilter方法设置过滤器的实例对象,然后通过addUrlPatterns方法设置过滤器的映射路径,即对所有请求进行过滤。

(3). 使用过滤器

当我们访问Spring Boot应用程序中的某个页面时,过滤器会自动进行过滤和处理。如果请求与过滤器的映射路径匹配,则过滤器的doFilter方法将被调用,可以在该方法中进行一些额外的操作,比如身份验证、日志记录等等。如果过滤器需要继续将请求传递到下一个过滤器或Servlet,可以通过调用chain.doFilter方法实现。如果不希望将请求传递到下一个过滤器或Servlet,可以直接返回相应的错误信息。

完结撒花,如果本文对大家有帮助的话记得留下宝贵的 赞赞 哦!

  • 5
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
过滤器拦截器都是Java Web开发常用的组件,用于处理HTTP请求和响应。它们的主要区别在于它们在请求处理过程的位置和功能。 过滤器是在Servlet容器执行的,它们在请求进入容器时拦截请求,可以对请求进行修改或筛选,然后将请求传递给Servlet或其他过滤器过滤器可以对请求和响应进行处理,例如压缩响应、设置请求和响应头、字符编码转换等。 以下是一个简单的过滤器示例: ```java public class MyFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { // 过滤器初始化 } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { // 对请求进行处理 HttpServletRequest httpRequest = (HttpServletRequest) request; String requestURI = httpRequest.getRequestURI(); if (requestURI.startsWith("/admin")) { // 如果请求的URI以/admin开头,则需要进行权限检查 HttpSession session = httpRequest.getSession(); if (session == null || session.getAttribute("user") == null) { // 如果未登录,则返回401错误 HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); return; } } // 继续处理请求 chain.doFilter(request, response); // 对响应进行处理 HttpServletResponse httpResponse = (HttpServletResponse) response; httpResponse.setHeader("X-Frame-Options", "DENY"); // 设置响应头,禁止页面在iframe展示 } @Override public void destroy() { // 过滤器销毁 } } ``` 拦截器是在Spring MVC框架执行的,它们在请求进入Controller之前拦截请求,可以对请求进行处理、修改或筛选。拦截器可以访问Spring上下文的Bean,也可以拦截异步请求和WebSocket请求。 以下是一个简单的拦截器示例: ```java public class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 对请求进行处理 String requestURI = request.getRequestURI(); if (requestURI.startsWith("/admin")) { // 如果请求的URI以/admin开头,则需要进行权限检查 HttpSession session = request.getSession(); if (session == null || session.getAttribute("user") == null) { // 如果未登录,则返回401错误 response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Unauthorized"); return false; } } return true; } @Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { // 对响应进行处理 response.setHeader("X-Frame-Options", "DENY"); // 设置响应头,禁止页面在iframe展示 } @Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { // 请求完成后的处理 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值