过滤器与拦截器使用的正确姿势

过滤器与拦截器的功能非常的相似,都是对请求处理的机制,那他俩有什么区别呢,又或者说什么时候要使用到过滤器,什么时候使用到拦截器呢?现在我们来逐一分析一下

过滤器

过滤器是通过实现javax.servlet.Filter接口来创建的。它需要在web.xml文件中进行配置,指定过滤器的名称、URL模式和其他参数。过滤器可以按照配置的顺序串联起来,形成过滤器链,每个过滤器都可以对请求进行处理或将请求传递给下一个过滤器或目标Servlet。

过滤器的工作流程如下:

  1. 请求到达过滤器链的起始点。
  2. 过滤器链中的第一个过滤器对请求进行处理。
  3. 过滤器可以选择将请求传递给下一个过滤器,或直接将响应返回给客户端。
  4. 如果请求被传递给下一个过滤器,则下一个过滤器继续处理请求,直到最后一个过滤器。
  5. 最后一个过滤器可以将请求传递给目标Servlet,也可以直接返回响应给客户端。
  6. 如果响应被传递给上一个过滤器,那么过滤器链中的过滤器可以对响应进行处理。

通过使用过滤器,可以在不修改目标Servlet代码的情况下,对请求和响应进行全局的处理和过滤。这样可以实现一些通用的功能,如日志记录、权限验证、字符编码设置等。

使用如下:

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class AuthenticationFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 初始化方法,在过滤器实例化后调用,可以进行一些初始化操作
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;

        // 检查用户是否已经登录,可以根据具体的业务逻辑进行判断
        boolean isAuthenticated = checkIfUserIsAuthenticated(request);

        if (isAuthenticated) {
            // 用户已经登录,继续传递请求给下一个过滤器或目标Servlet
            filterChain.doFilter(request, response);
        } else {
            // 用户未登录,可以重定向到登录页面或返回错误信息
            response.sendRedirect("/login");
        }
    }

    @Override
    public void destroy() {
        // 销毁方法,在过滤器被销毁时调用,可以进行资源释放等操作
    }

    private boolean checkIfUserIsAuthenticated(HttpServletRequest request) {
        // 在此处实现具体的身份验证逻辑,例如检查用户的会话状态、验证用户的凭证等
        // 返回true表示用户已经登录,返回false表示用户未登录
        // 这里只是简单示例,实际逻辑需要根据具体业务需求进行实现
        return request.getSession().getAttribute("user") != null;
    }
}

拦截器 

在Java的Spring框架中,拦截器是Spring MVC提供的一种机制,用于在请求到达处理方法之前或之后进行拦截和处理。拦截器可以用于实现一些通用的业务逻辑、权限控制、日志记录等操作。

以下是拦截器的主要特点和使用方式:

  1. 拦截器是应用程序层面的组件,与特定的Servlet容器无关。它是Spring MVC框架提供的一部分,更接近于应用程序的业务逻辑。
  2. 拦截器可以在请求到达处理方法之前(preHandle)或之后(postHandle)进行拦截和处理,甚至可以在响应返回给客户端之后(afterCompletion)进行拦截和处理。
  3. 拦截器可以对请求进行预处理、修改请求参数、验证权限、记录日志等操作。在处理方法执行之后,可以对响应进行修改或添加一些额外的处理。
  4. 拦截器是通过实现HandlerInterceptor接口来创建的。可以实现该接口的preHandlepostHandleafterCompletion方法来实现拦截器的具体逻辑。
  5. 在Spring MVC中,拦截器可以通过配置在WebMvcConfigurer@Configuration类中进行注册和使用。
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoggingInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        // 在处理方法执行之前进行拦截和处理
        // 可以进行权限验证、日志记录等操作
        return true; // 返回true表示继续执行处理方法,返回false表示中断请求处理
    }

    @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 {
        // 在整个请求处理完成之后进行拦截和处理
        // 可以进行资源清理、日志记录等操作
    }
}

拦截器与过滤器有什么区别

过滤器处于底层,属于Servlet容器级别的组件,能够对请求进行底层的预处理、过滤和修改。

拦截器处于应用程序层面,属于Spring MVC框架提供的组件,能够在请求到达处理方法前后进行拦截和处理,提供更多的应用程序级别的功能。

什么时候用拦截器,什么时候用过滤器

过滤器和拦截器在Web应用程序中都用于对请求进行处理,但它们的使用场景有一些区别。以下是一些常见的使用情况:

过滤器的使用场景:

  1. 请求预处理:过滤器可以用于在请求到达目标Servlet之前进行一些预处理操作,如设置字符编码、请求参数解析、请求头处理等。
  2. 请求过滤和验证:过滤器可以对请求进行过滤和验证,例如检查请求的合法性、防止恶意请求、验证用户身份等。
  3. 静态资源处理:过滤器可以用于处理静态资源请求,如图片、CSS文件、JavaScript文件等。

拦截器的使用场景:

  1. 请求前后处理:拦截器可以在请求到达处理方法之前或之后进行一些处理,如日志记录、性能监控、异常处理、数据校验等。
  2. 权限控制和身份验证:拦截器可以用于检查用户权限、进行身份验证,如果权限不足或未认证,可以阻止请求继续执行。
  3. 统一业务逻辑处理:拦截器可以用于实现一些通用的业务逻辑,比如数据缓存、国际化支持、请求参数封装等。

总的来说,过滤器更加底层,主要用于请求的预处理、过滤和验证,对于静态资源处理也很方便。而拦截器更加高层,主要用于请求的前后处理、统一业务逻辑实现和权限控制等。

在实际开发中,可以根据具体的需求选择合适的过滤器和拦截器来处理请求,通常可以结合使用,以实现更灵活和细粒度的请求处理。

你可能感兴趣的:(spring,boot,servlet)