Filter过滤器拦截方式

Filter过滤器有五种拦截方式,用注解配置dispatcherTypes属性

REQUEST:默认值,浏览器直接请求的资源会被过滤器拦截

FORWARD:转发访问资源会被过滤器拦截

INCLUDE:包含访问资源

ERROR:错误跳转资源

ASYNC:异步访问资源 

如果是web.xml配置,就是配置其<dispatcher></dispatcher>标签

这里用注解着重讲解REQUEST和FORWARD,也是常用的两个,这里我们通过一个Filter类和一个Servlet类进行演示,Filter类控制拦截方式,Servlet控制访问方式,也就是请求转发

package com.zhiying.filter;

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

@WebFilter(urlPatterns = "/index.jsp", dispatcherTypes = DispatcherType.REQUEST)
public class FilterDemo5 implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("执行了过滤器");
        chain.doFilter(request,response);
    }
}
package com.zhiying.servlet;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/user/a1")
public class ServletDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        System.out.println("servlet1...");
        req.getRequestDispatcher("/index.jsp").forward(req,resp); //请求转发的形式访问index.jsp
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

可以看出,直接访问index.jsp是通过了过滤器

从下图可以看出如果我们是通过请求转发的形式访问index.jsp,就不经过过滤器

当然了,我们还可以演示如果是FORWARD:转发访问资源会被过滤器拦截,修改Filter类如下

package com.zhiying.filter;

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

@WebFilter(urlPatterns = "/index.jsp", dispatcherTypes = DispatcherType.FORWARD)
// @WebFilter(urlPatterns = "/index.jsp", dispatcherTypes = DispatcherType.REQUEST)
public class FilterDemo5 implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("执行了过滤器");
        chain.doFilter(request,response);
    }
}

下面可以看出,直接访问是没有经过过滤器的 

下面可以看出,通过请求转发经过了过滤器

下面看一下二者的结合体,就是在注解上配置,既可以通过直接访问,也可以通过转发访问,修改Filter类即可

package com.zhiying.filter;

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

@WebFilter(urlPatterns = "/index.jsp", dispatcherTypes = {DispatcherType.FORWARD,DispatcherType.FORWARD})
// @WebFilter(urlPatterns = "/index.jsp", dispatcherTypes = DispatcherType.FORWARD)
// @WebFilter(urlPatterns = "/index.jsp", dispatcherTypes = DispatcherType.REQUEST)
public class FilterDemo5 implements Filter {
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        System.out.println("执行了过滤器");
        chain.doFilter(request,response);
    }
}
发布了376 篇原创文章 · 获赞 242 · 访问量 5万+

猜你喜欢

转载自blog.csdn.net/HeZhiYing_/article/details/104060930