servlet三大组件
包含普通servlet,过滤servlet,监听servlet
这篇文章主要说一下Filter
先快速入门一下
注解是如何配置的
@WebFilter("/*")这个就是会拦截所有的访问,它会考虑是否放行,filterChain.doFilter(servletRequest,servletResponse);这行代码就是我们所说的放行。
在这里我说一下
@WebFilter的常用属性
过滤器的使用场景
* @Description:filter的三种典型应用:
* 1、可以在filter中根据条件决定是否调用chain.doFilter(request, response)方法, 即是否让目标资源执行
* 2、在让目标资源执行之前,可以对request\response作预处理,再让目标资源执行
* 3、在目标资源执行之后,可以捕获目标资源的执行结果,从而实现一些特殊的功能
详细讲一下
web.xml文件如何配置
<filter>
<filter-name>demo1</filter-name>
//这里指明filter的文件存放位置
<filter-class>cn.rong.filter.FirstFilter</filter-class>
</filter>
<filter-mapping>
//filter文件的名字要和上面的filter-name进行匹配
<filter-name>demo1</filter-name>
//这里设置的就是filter过滤的路径请求
//拦截路径
<url-pattern>/*</url-pattern>
</filter-mapping>
过滤器的生命周期
过滤器也是有三个方法:
初始化方法init()---->只会执行一次,通过init方法的参数,可获得代表当前filter配置信息的FilterConfig对象。
说起这个初始化就要看一下这个方法中的这个参数
FilterConfig config
用户在配置filter时,可以使用为filter配置一些初始化参数,当web容器实例化Filter对象,
调用其init方法时,会把封装了filter初始化参数的filterConfig对象传递进来。
因此开发人员在编写filter时,通过filterConfig对象的方法,就可获得
String getFilterName():得到filter的名称。
String getInitParameter(String name): 返回在部署描述中指定名称的初始化参数的值。如果不存在返回null.
Enumeration getInitParameterNames():返回过滤器的所有初始化参数的名字的枚举集合。
public ServletContext getServletContext():返回Servlet上下文对象的引用。
主题方法doFilter()-----》每次拦截时都会执行
还有销毁方法destroy()-----》只会执行一次
而我们对于过滤器的执行流程:
在拦截请求时,过滤器主体方法会从方法的其实位置开始执行,然后执行到放行位置,在服务器处理完相应的请求之后,服务器执行放回,而返回位置的执行地方就是在放行位置的下一行,
我们可以设置过滤器的访问方式
给注解配置dispatcherTypes属性
1.Request:默认值。浏览器直接请求资源
2.ForWard:转发访问资源
3.Include。包含访问资源
4.Error:错误访问资源
5.ASYNC:异步访问资源
在web.xml文件中配置时
在filter-mapping标签中配置
dispatcherTypes标签属性
过滤器链
其实就是按照栈的方式进行拦截
但是过滤器的先后顺序是怎么回事呢?
注解配置:
他们的入栈方式是按照过滤器名字的字符串大小进行排序的,小的先执行,先入栈
web.xml文件的配置:
他们就是filter-mapping谁定义在文件的上面,谁先执行。