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