目录
过滤期正如我们生活中用来过滤东西的东西,泡茶喝,用纱网过滤茶叶一样。再web中,当我们浏览器访问服务器时候,浏览器所发送的请求会先经过过滤器被拦截下来,让过滤器来执行某些操作。在实际开发中,过滤器的常用用途有登录验证、统一编码处理、过滤敏感字符等等
要创建一个过滤器,只需要创建一个Java类,然后让过滤器实现Filter接口,然后重写里面的三个方法:init、doFilter、destroy即可,最后再配置一下拦截路径即可。
首先,对于inti、destroy方法,他和servlet是一样的,在服务器加载和销毁的时候会执行一次,通常inti用来加载资源,而服务器在正常关闭后,Filter对象被销毁,只执行一次destroy方法,用于释放资源
对于doFilter,他是在每次请求拦截资源时候,都会执行,所以他是执行多次的。要注意,该方法有三个参数,前两个我们都很熟悉了,对于第三个参数FilterChain,他是一个接口,在该接口中又定义了doFilter方法。这是咋回事呢?可以这样理解:过滤器不单只有一个,在Java中就使用了链式结构。把所有的过滤器都放在FilterChain里边,如果符合条件,就执行下一个过滤器(如果没有过滤器了,就执行目标资源)。
若要使用注解方法配置拦截路径,需要在Filter前面加上@WebFilter()
括号里面的就是拦截路径,如果只写拦截路径,可以不写参数名,因为默认就是value/urlPattern
,如果还要设置其他参数的话,那么就要加上参数名了。如果想要部分的Web资源进行过滤器过滤则需要指定Web资源的名称即可。
若要指定过滤器拦截的资源被Servlet容器调用的方式,那么可以设置dispatcherTypes
,有:DispatcherType.REQUEST(默认)、DispatcherType.ERROR、DispatcherType.FROWARD、DispatcherType.INCLUDE、DispatcherType.ASYNC五种方式,分别对应如下:
在web.xml中,添加如下代码:filter用于注册过滤器,如果没有配置的话,即使实现类Filter接口也没有用
<filter>
<filter-name>设置一个filter名</filter-name>
<filter-class>要配置的Filter的全类名</filter-class>
<!-- 用于为过滤器指定的初始参数,在init中可以通过filterConfig来获取 -->
<init-param>
<param-name>word_file</param-name>
<param-value>/WEB-INF/word.txt</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>对应上面的filter名</filter-name>
<url-pattern>设置拦截路径</url-pattern>
<dispatcher>?指定 Filter 对资源的多种调用方式进行拦截(默认REQUEST)</dispatcher>
<servlet-name>过滤指定的servlet的资源名称</servlet-name>
</filter-mapping>
过滤器的先后执行顺序问题是怎样的?
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
// 只有HttpServletResponse才可以设置响应信息,所以我们一般都将他们转化为Http
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
// 设置禁止缓存
response.setDateHeader("Expires", -1);
response.setHeader("Cache-Control", "no-cache");
response.setHeader("Pragma", "no-cache");
chain.doFilter(request, response);
}
设置之后响应头为:
监听器就是⼀个实现特定接⼝的普通java程序,这个程序专⻔⽤于监听另⼀个java对象的⽅法调 ⽤或属性改变,当被监听对象发⽣上述事件后,监听器某个⽅法将⽴即被执⾏。
在Servlet规范中定义了多种类型的监听器,它们⽤于监听的事件源分别 ServletContext,HttpSession和ServletRequest 这三个域对象
Servlet监听器的注册不是在事件源上,而是由web容器负责,我们只需要在web.xml中配置好 标签即可
HttpSessionListener、ServletContextListener、ServletRequestListener分别监听着Session、Context、Request对象的创建和销毁
ServletContextAttributeListener、HttpSessionAttributeListener、ServletRequestAttributeListener 分别监听着Context、Session、Request对象属性的变化
着三个接口都定义了以以下三个方法来处理被监听对象中的属性的增加、删除、替换事件,同一个事件在三个接口中方法名完全相同,只是接受的参数类型不同:
除了上面的6中listener,还有两种listener监听Session的对象:HttpSessionBindingListerner和HttpSsessionActivation:
想要测试出Session的硬化和钝化,需要修改Tomcat的配置的。在META-INF下的context.xml⽂件中添加下⾯的代码:
<Context>
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="1">
<Store className="org.apache.catalina.session.FileStore" directory="linzeliang"/>
</Manager>
</Context>