Java框架中常见的几个过滤器——JSP、Spring Boot、Servlet过滤器、Struts2拦截器

2023-10-16 14:26:35 浏览数 (3)

前言

在Java框架中,常见的几个过滤器包括:

  1. JSP过滤器:JSP过滤器是在JSP页面生成之前或之后执行的一种过滤器。它可以对请求进行拦截、处理和转发,还可以对响应进行修改和过滤。常见的JSP过滤器有字符编码过滤器、登录验证过滤器等。
  2. Spring Boot过滤器:Spring Boot过滤器是在Spring Boot应用程序处理请求之前或之后执行的一种过滤器。它可以对请求进行拦截、处理和转发,还可以对响应进行修改和过滤。Spring Boot过滤器通常使用Java Servlet API提供的Filter接口实现。常见的Spring Boot过滤器有字符编码过滤器、登录验证过滤器、请求日志过滤器等。
  3. Servlet过滤器:Servlet过滤器是在Java Servlet容器中执行的一种过滤器。它可以拦截、处理和转发请求,还可以修改和过滤响应。Servlet过滤器通常使用Java Servlet API提供的Filter接口实现。常见的Servlet过滤器有字符编码过滤器、登录验证过滤器、请求日志过滤器等。
  4. Struts2拦截器:Struts2拦截器是在Struts2框架中执行的一种拦截器。它可以对请求进行拦截、处理和转发,还可以对响应进行修改和过滤。Struts2拦截器通常使用Struts2框架提供的Interceptor接口实现。常见的Struts2拦截器有字符编码拦截器、登录验证拦截器、权限验证拦截器等。

今天我们来具体看看这几个过滤器的使用和区别。

1. JSP过滤器

JSP过滤器是在JSP页面生成之前或之后执行的一种过滤器,它可以对请求进行拦截、处理和转发,还可以对响应进行修改和过滤。使用JSP过滤器可以实现很多功能,例如字符编码转换、登录验证、请求日志记录等。

图——来自菜鸟教程 JSP过滤器的实现需要实现javax.servlet.Filter接口,该接口定义了三个方法:

  1. init方法:在过滤器被初始化时调用,可以用来进行初始化操作,例如读取配置文件、建立数据库连接等。
  2. doFilter方法:对请求进行过滤处理的核心方法,该方法接收一个ServletRequest对象和一个ServletResponse对象,以及一个FilterChain对象。在该方法中可以对请求进行处理和过滤,然后将请求传递给下一个过滤器或Servlet处理。
  3. destroy方法:在过滤器被销毁时调用,可以用来进行资源释放操作,例如关闭数据库连接、清理缓存等。

在web.xml中进行配置

代码语言:javascript复制
<filter>
    <filter-name>MyFilter</filter-name>
    <filter-class>com.example.MyFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>MyFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

MyFilter是自定义的过滤器类名,/*表示对所有的请求进行过滤处理。

常见的JSP过滤器包括:

  1. 字符编码过滤器:用于将请求和响应的字符编码设置为指定的编码格式,避免出现中文乱码。
  2. 登录验证过滤器:用于验证用户的登录状态,如果用户未登录则跳转到登录页面。
  3. 请求日志过滤器:用于记录请求的URL、请求参数、请求时间等信息,方便后续的统计和分析。

我们挑一个写一下案例:登录验证过滤器

代码语言:javascript复制
public class LoginFilter implements Filter {
    private FilterConfig filterConfig = null;
    private String loginPage = null;

    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
        this.loginPage = filterConfig.getInitParameter("loginPage");
    }

    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        HttpServletResponse res = (HttpServletResponse) response;
        HttpSession session = req.getSession(false);
        String requestURI = req.getRequestURI();

        if (session == null || session.getAttribute("user") == null) {
            res.sendRedirect(req.getContextPath()   loginPage   "?redirect="   requestURI);
        } else {
            chain.doFilter(req, res);
        }
    }

    public void destroy() {
        this.filterConfig = null;
    }
}

loginPage是登录页面的URL,可以通过web.xml文件进行配置。在doFilter方法中,首先获取当前请求的HttpSession对象,然后判断用户是否已经登录,如果未登录则将请求重定向到登录页面,否则将请求传递给下一个过滤器或Servlet处理。

web.xml中的配置:

代码语言:javascript复制
<filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>com.example.LoginFilter</filter-class>
    <init-param>
        <param-name>loginPage</param-name>
        <param-value>/login.jsp</param-value>
    </init-param>
</filter>
<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/secure/*</url-pattern>
</filter-mapping>

LoginFilter是自定义的过滤器类名,loginPage是登录页面的URL,/secure/*表示只对以/secure开头的URL进行过滤处理。

2. Spring Boot过滤器

Spring Boot中的过滤器是通过实现javax.servlet.Filter接口来实现的。具体来说,需要编写一个类,实现doFilter、init和destroy方法,然后在Spring Boot应用程序中配置该过滤器即可,下面我们来看一个案例。

代码语言:javascript复制
@Component
public class LoginFilter 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;

        // 判断用户是否已登录
        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute("user") == null) {
            // 用户未登录,跳转到登录页面
            response.sendRedirect("/login");
        } else {
            // 用户已登录,放行请求
            filterChain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {
        // 销毁方法
    }
}

在配置登录过滤器时,需要将登录页面和登录控制器的请求路径排除在过滤器拦截范围之外,否则会出现登录页面无限重定向的问题。可以使用注解@WebFilter的urlPatterns属性或在配置类中使用FilterRegistrationBean的addUrlPatterns方法来设置过滤器拦截的URL路径。

3. Servlet过滤器

这个其实和上面俩个基本是一样的,这个是基本。

代码语言:javascript复制
public class LoginFilter 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;

        // 判断用户是否已登录
        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute("user") == null) {
            // 用户未登录,跳转到登录页面
            response.sendRedirect("/login");
        } else {
            // 用户已登录,放行请求
            filterChain.doFilter(request, response);
        }
    }

    @Override
    public void destroy() {
        // 销毁方法
    }
}
代码语言:javascript复制
<filter>
    <filter-name>LoginFilter</filter-name>
    <filter-class>com.example.LoginFilter</filter-class>
</filter>
<filter-mapping>
    <filter-name>LoginFilter</filter-name>
    <url-pattern>/*</url-pattern>
</filter-mapping>

使用<url-pattern标签设置过滤器拦截的URL路径

4. Struts 拦截器

Struts中的拦截器是通过实现org.apache.struts2.interceptor.Interceptor接口来实现的。

代码语言:javascript复制
public class LoginInterceptor implements Interceptor {

    @Override
    public void init() {
        // 初始化方法
    }

    @Override
    public void destroy() {
        // 销毁方法
    }

    @Override
    public String intercept(ActionInvocation invocation) throws Exception {
        HttpServletRequest request = ServletActionContext.getRequest();
        HttpServletResponse response = ServletActionContext.getResponse();

        // 判断用户是否已登录
        HttpSession session = request.getSession(false);
        if (session == null || session.getAttribute("user") == null) {
            // 用户未登录,跳转到登录页面
            return "login";
        } else {
            // 用户已登录,放行请求
            return invocation.invoke();
        }
    }
}
代码语言:javascript复制
<interceptors>
    <interceptor name="loginInterceptor" class="com.example.LoginInterceptor"/>
    <interceptor-stack name="defaultStack">
        <interceptor-ref name="loginInterceptor"/>
        <interceptor-ref name="basicStack"/>
    </interceptor-stack>
</interceptors>

最后

如果本文对你有所帮助,还请三连支持一下博主!

0 人点赞