【学习笔记】Filter 过滤器

Filter 过滤器

过滤器的作用:用来过滤网站的数据(处理中文乱码、登录验证....)

过滤器加在服务器和servlet、jsp、静态资源 中间,用来过滤服务器的请求

我们以处理乱码问题为例:

之前处理乱码都是在servlet中设置 setCharacterEncoding("utf-8"),但如果servlet数量太多,我们不可能在每一个servlet中都这样设置,所以我们可以在过滤器中去设置。

步骤:

  1. 编写过滤器

    • 实现Filter接口,

    • 导包,注意一定要导入servlet包下的Filter

    • 重写方法 init() 初始化、destory() 销毁、doFilter() 实现过滤

    import jakarta.servlet.*;
    ​
    import java.io.IOException;
    ​
    public class CharacterEncodingFilter implements Filter {
    ​
        @Override
        public void init(FilterConfig filterConfig) throws ServletException {
            System.out.println("过滤器初始化");
        }
    ​
        @Override
        public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
            servletResponse.setCharacterEncoding("utf-8");
            servletResponse.setContentType("text/html;Character=UTF-8");
            servletRequest.setCharacterEncoding("utf-8");
    ​
            filterChain.doFilter(servletRequest,servletResponse);  //让请求继续执行,如果不写就被截断在这里了
        }
    ​
        @Override
        public void destroy() {
            System.out.println("过滤器销毁");
        }
    }

    注意点:在doFilter()方法中,必须要写filterChain.doFilter(servletRequest,servletResponse)

    必须让过滤器继续通行

    过滤器中的所有代码,在过滤特定请求的时候都会执行,意思就是要配置过滤器,使过滤器在什么请求下可以使用

  2. 配置过滤器

    <filter>
        <filter-name>CharacterEncoding</filter-name>
        <filter-class>CharacterEncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CharacterEncoding</filter-name>
        <url-pattern>/servlet/*</url-pattern>
    </filter-mapping>

    这段配置和配置servlet相同,意思就是 /servlet的任何请求都会走过滤器

 

测试:

import jakarta.servlet.ServletException;
import jakarta.servlet.http.HttpServlet;
import jakarta.servlet.http.HttpServletRequest;
import jakarta.servlet.http.HttpServletResponse;
​
import java.io.IOException;
​
public class ShowServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       resp.getWriter().write("你好世界");
    }
​
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}
<servlet>
    <servlet-name>ShowServlet</servlet-name>
    <servlet-class>ShowServlet</servlet-class>
</servlet>
<servlet-mapping>
    <servlet-name>ShowServlet</servlet-name>
    <url-pattern>/servlet/show</url-pattern>
</servlet-mapping>
<servlet-mapping>
    <servlet-name>ShowServlet</servlet-name>
    <url-pattern>/show</url-pattern>
</servlet-mapping>

我们配置了两个路径,一个是/servlet/show 一个是/show

访问/servlet/show ,没有出现乱码问题

访问/show ,出现乱码问题

对应了上面配置的 filter 路径

 

过滤器初始化在服务器已启动就执行了

过滤器销毁是在服务器关闭的时候执行

posted @ 2022-10-22 11:28  GrowthRoad  阅读(30)  评论(0编辑  收藏  举报