Java学习----Servlet 中的过滤器

        在 Java Web 开发中,Servlet 技术占据着重要地位,而过滤器则是 Servlet 技术体系中不可或缺的组成部分。,其是 Servlet 规范中定义的一种组件,它可以在请求到达目标 Servlet 或 JSP 之前对请求进行拦截和处理,也可以在响应返回给客户端之前对响应进行处理。它就像一个 “关卡”,对进出的数据流进行过滤和加工。​

        过滤器通过实现javax.servlet.Filter接口,在 web.xml 文件中配置或者使用注解来指定需要过滤的资源。当客户端发送请求时,Servlet 容器会先调用过滤器的doFilter方法,在该方法中可以对请求进行处理,然后通过FilterChain将请求传递给下一个过滤器或目标资源;在响应返回时,会再次经过过滤器进行处理。​

        过滤器的工作流程大致如下:​

(1)客户端发送请求到 Web 服务器。​

(2)服务器检查是否有过滤器与请求的资源相关联,若有则调用过滤器的doFilter方法。​

(3)在doFilter方法中对请求进行处理后,通过FilterChain将请求传递下去。​

(4)目标资源处理请求并生成响应。​

(5)响应按照与请求相反的顺序经过过滤器,过滤器对响应进行处理。​

(6)最终响应返回给客户端。​

        监听器的主要作用有:​

(1)身份验证和授权:可以在请求到达目标资源前,验证用户的身份信息,判断用户是否有权限访问该资源。​

(2)日志记录:记录请求的相关信息,如请求的 URL、客户端 IP 地址、请求时间等,便于系统的监控和调试。​

(3)数据压缩:对响应的数据进行压缩,减少数据传输量,提高传输效率。​

(4)字符编码转换:统一设置请求和响应的字符编码,避免出现乱码问题。​

(5)XSS 攻击防护:对请求中的特殊字符进行过滤和转义,防止跨站脚本攻击。​

        监听器的优缺点主要有:​

【1】优点:​

        (1)灵活性高:可以通过配置指定需要过滤的资源,方便地对不同的资源进行不同的处理。​

        (2)可重用性强:编写好的过滤器可以在多个 Web 应用中重复使用。​

        (3)不侵入业务逻辑:过滤器的处理逻辑与目标资源的业务逻辑相互分离,不会影响目标资源的实现。​

【2】缺点:​

        (1)可能会影响性能:每一次请求和响应都需要经过过滤器的处理,过多的过滤器会增加系统的开销,降低请求的处理速度。​

        (2)配置相对复杂:虽然可以使用注解进行配置,但在一些复杂的场景下,还是需要在 web.xml 中进行详细的配置,容易出现配置错误。

        下面用一个简单的代码讲解一下:

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;

// 使用注解配置过滤器,过滤所有资源
@WebFilter("/*")
public class MyFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // 过滤器初始化方法,在过滤器创建时调用
        System.out.println("过滤器初始化");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        // 对请求进行处理
        System.out.println("请求到达过滤器,开始处理请求");
        // 设置请求和响应的字符编码
        request.setCharacterEncoding("UTF-8");
        response.setCharacterEncoding("UTF-8");

        // 将请求传递给下一个过滤器或目标资源
        chain.doFilter(request, response);

        // 对响应进行处理
        System.out.println("响应经过过滤器,处理响应完成");
    }

    @Override
    public void destroy() {
        // 过滤器销毁方法,在过滤器被销毁时调用
        System.out.println("过滤器销毁");
    }
}

        这个代码定义了一个简单的过滤器MyFilter,通过@WebFilter("/*")注解指定该过滤器过滤所有资源。在doFilter方法中,首先对请求进行处理,设置了字符编码,然后通过chain.doFilter方法将请求传递下去,最后在响应返回时进行处理。init方法在过滤器初始化时调用,destroy方法在过滤器销毁时调用。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值