1.认识一下filter是一个什么东西。
新建一个filter(命名为Filter)。步骤( idea):File-new-Create New Filter
白色数字1,@WebFilter(FilterName = “filter”)很显然,说明这是一个过滤器,名字是filter
白色数字2,我们给起的类名
白色数字3 ,实现Filter接口
黄色数字123,三个函数,destroy,doFilter,init,直接从函数名理解就是销毁,执行,初始化…
- init:服务器启动,filter对象初始化时执行
- dofilter:进入到这个过滤器的时候执行
- destroy:服务器关闭,filter对象销毁时执行
2.filter用来做什么?
过滤器自然是用来过滤的,没用filter时所有的请求都能到达servlet,如下图黑色路线。用了filter之后,浏览器发送的请求需要先经过filter过滤再进入到servlet,如下图红色线路。
3.filter怎么用
知道过滤器是什么,有什么功能,接下来就是怎么使用它。
首先要对过滤器进行配置,这里介绍两种方式。
第一种就是第一步创建的时候默认的注解方式,很简单。但是这种方式只能用于自己写的filter。
//以下三种等价
@WebFilter("/hello")
@WebFilter(value = "/hello")
@WebFilter( urlPatterns = "/hello")
//常用设置
@WebFilter(filterName = "Filter",
urlPatterns = "/hello",
dispatcherTypes{DispatcherType.FORWARD,DispatcherType.REQUEST},
initParams = { @WebInitParam(name = "encoding", value = "utf-8")})
第二种是在web.xml文件中进行配置
<!--名字和所在包-->
<filter>
<!--这里的名字可以自定义,一般默认和自己定义的类名相同-->
<filter-name>Filter</filter-name>
<filter-class>filter.Filter</filter-class>
<!--根据需要改变默认参数,下面是处理编码格式,-->
<!--<init-param>-->
<!-- <param-name>encoding</param-name>-->
<!-- <param-value>UTF-8</param-value>-->
<!--</init-param>-->
</filter>
<!--需要过滤的路径-->
<filter-mapping>
<!--这里的filter-name一定要和上面的filter-name相同-->
<filter-name>Filter</filter-name>
<url-pattern>/hello</url-pattern>
<!--<dispatcher>FORWARD</dispatcher>-->
<!--<dispatcher>REQUEST</dispatcher>-->
</filter-mapping>
接下来开始实践一下吧!
(1)首先创建一个filter,和一个servlet如下
public class Filter implements javax.servlet.Filter {
public void destroy() {
System.out.println("过滤器销毁");
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
System.out.println("过滤...");
//放行
chain.doFilter(req, resp);
}
public void init(FilterConfig config) throws ServletException {
System.out.println("过滤器创建");
}
}
@WebServlet("/hello")
public class Servlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("收到get请求");
}
}
(2)在web.xml中配置filter,常见的一些配置如下
<!--名字和所在包-->
<filter>
<!--这里的名字可以自定义,一般默认和自己定义的类名相同-->
<filter-name>Filter</filter-name>
<filter-class>filter.Filter</filter-class>
</filter>
<!--需要过滤的路径-->
<filter-mapping>
<!--这里的filter-name一定要和上面的filter-name相同-->
<filter-name>Filter</filter-name>
<url-pattern>/hello</url-pattern>
</filter-mapping>
(3)启动项目,服务器开启,此时过滤器创建
访问/hello并发起请求
得到以下结果
(4)关闭服务器,然后看到以下结果
结束啦!以上是对过滤器的初步认识和了解!
4.关于filter的url和DispatcherType
1.路径:
- “/*”:所有(包括jsp)
- “/”:所有(不包括jsp)
- “/hello”:指定路径
- “/hello/hi/*”:指定路径开头的所有
- “*.jsp”:所有jsp
- “*.html”:所有html
2.拦截方式:五种!常用的以下两种…
- DispatcherType.FORWARD:用于过滤转发,较少使用!(下图蓝色线路)
- DispatcherType.REQUEST:用于过滤除转发外的请求,这个是默认情况。(下图紫色线路)