《Tomcat与Java Web开发技术详解》阅读梳理 第二十章 过滤器

点击查看合集

过滤器介绍

过滤器能够对ServletRequest和ServletResponse对象进行检查和修改。在Web组件被调用之前检查ServletRequ对象。修改请求头和请求正文。或对请求进行预处理。在Web组件被调用之后检查ServletResponse对象,修改响应头和响应正文。(可以过滤的Web组件有Servlet html jsp)
在这里插入图片描述

特点

1.过滤器可以检查ServletRequest和ServletResponse对象,并且利用ServletRequestWrapper和ServletResponseWrapper包装类来修改ServletRequest和ServletResponse对象。
2.可以在Web.xml中位过滤器配置映射url
3.多个过滤器可以被串联在一起。

创建过滤器

过滤器需要实现Filter接口,且实现三个方法。
init(FilterConfig config):初始化方法,在Web应用启动时,会创建过滤器,此时会执行此方法。
doFilter(ServletRequest req,ServletResponse res,FilterChain chain):访问响应url时会执行该方法,chain为下一个要执行得过滤器或者web组件
destroy():过滤器销毁时执行。

拦截器类

拦截器1

public class MyFilter1 implements Filter {
    
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    
    
        System.out.println("拦截器1初始化");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
    
        System.out.println("拦截器1执行(前)");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("拦截器1执行(后)");
    }

    @Override
    public void destroy() {
    
    
        System.out.println("拦截器1销毁");
    }
}

拦截器2

public class MyFilter2 implements Filter {
    
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    
    
        System.out.println("拦截器2初始化");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
    
         System.out.println("拦截器2执行(前)");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("拦截器2执行(后)");
    }

    @Override
    public void destroy() {
    
    
        System.out.println("拦截器2销毁");
    }
}

拦截的Servlet


@WebServlet(urlPatterns = "/filter")
public class TestFilterServlet extends HttpServlet {
    
    
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        doPost(req,resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    
    
        resp.setCharacterEncoding("GBK");
        resp.setContentType("text/html;charset=gbk");
        PrintWriter writer = resp.getWriter();
        writer.write("helloWord");

    }
}

注册拦截器

方法一:
在web.xml文件中注册

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
<filter>
    <filter-name>f1</filter-name>
    <filter-class>com.sea.Filter.MyFilter1</filter-class>
</filter>
    <filter>
        <filter-name>f2</filter-name>
        <filter-class>com.sea.Filter.MyFilter2</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>f2</filter-name>
        <url-pattern>/filter</url-pattern>
    </filter-mapping>
    <filter-mapping>
        <filter-name>f1</filter-name>
        <url-pattern>/filter</url-pattern>
    </filter-mapping>
</web-app>

注意此时如果存在拦截器串联的话,执行顺序和 的先后顺序有关(例如上面就是先执行拦截器2)
当浏览器访问TestFilterServlet时的执行结果
在这里插入图片描述

方法二:注解

//注解
@WebFilter(urlPatterns = "/filter")
public class MyFilter1 implements Filter {
    
    
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    
    
        System.out.println("拦截器1初始化");
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    
    
        System.out.println("拦截器1执行(前)");
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("拦截器1执行(后)");
    }

    @Override
    public void destroy() {
    
    
        System.out.println("拦截器1销毁");
    }
}

待续

猜你喜欢

转载自blog.csdn.net/qq_30033509/article/details/110148562