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

🙌秋名山码民的主页
😂oi退役选手,Java、大数据、单片机、IoT均有所涉猎,热爱技术,技术无罪
🎉欢迎关注🔎点赞👍收藏⭐️留言📝
获取源码,添加WX


前言

在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中进行配置

<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、请求参数、请求时间等信息,方便后续的统计和分析。

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

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中的配置:

<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应用程序中配置该过滤器即可,下面我们来看一个案例。

@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过滤器

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

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() {
        // 销毁方法
    }
}

<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接口来实现的。

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();
        }
    }
}

<interceptors>
    <interceptor name="loginInterceptor" class="com.example.LoginInterceptor"/>
    <interceptor-stack name="defaultStack">
        <interceptor-ref name="loginInterceptor"/>
        <interceptor-ref name="basicStack"/>
    </interceptor-stack>
</interceptors>

最后

如果本文对你有所帮助,还请三连支持一下博主!
请添加图片描述

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
JSP拦截器并不能直接拦截Servlet,因为JSP本质上是一种Servlet。但是,JSP拦截器可以拦截JSP页面的请求,并对请求进行处理或者重定向到其他页面或Servlet。 下面是一个简单的JSP拦截器示例: 1. 创建一个实现了javax.servlet.Filter接口的拦截器类。 ```java public class JSPInterceptor 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; HttpServletResponse httpResponse = (HttpServletResponse) response; // 判断请求是否为JSP页面请求 if (httpRequest.getRequestURI().endsWith(".jsp")) { // 进行拦截操作,比如重定向到其他页面 httpResponse.sendRedirect("index.jsp"); } else { // 放行请求,继续执行后续操作 chain.doFilter(request, response); } } @Override public void destroy() { // 销毁操作 } } ``` 2. 在web.xml文件配置拦截器。 ```xml <filter> <filter-name>JSPInterceptor</filter-name> <filter-class>com.example.JSPInterceptor</filter-class> </filter> <filter-mapping> <filter-name>JSPInterceptor</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ``` 在这个示例JSPInterceptor拦截器会拦截所有的请求,并判断是否为JSP页面请求。如果是JSP页面请求,则重定向到index.jsp页面;否则,放行请求,继续执行后续操作。可以根据具体需求进行修改和扩展。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

秋名山码民

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值