前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Java框架中常见的几个过滤器——JSP、Spring Boot、Servlet过滤器、Struts2拦截器

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

作者头像
秋名山码神
发布2023-10-16 14:26:35
3640
发布2023-10-16 14:26:35
举报
文章被收录于专栏:码神随笔码神随笔

前言

在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>

最后

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

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2023-10-09,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
    • 1. JSP过滤器
      • 2. Spring Boot过滤器
        • 3. Servlet过滤器
          • 4. Struts 拦截器
            • 最后
            相关产品与服务
            容器服务
            腾讯云容器服务(Tencent Kubernetes Engine, TKE)基于原生 kubernetes 提供以容器为核心的、高度可扩展的高性能容器管理服务,覆盖 Serverless、边缘计算、分布式云等多种业务部署场景,业内首创单个集群兼容多种计算节点的容器资源管理模式。同时产品作为云原生 Finops 领先布道者,主导开源项目Crane,全面助力客户实现资源优化、成本控制。
            领券
            问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档