下面是自己通过视频以及书籍学习整理的filter一些学习笔记。
filter可以在请求到达资源之前先对请求进行一些处理,也可以在响应到达客户端之前对响应进行一些处理。
上代码,直观清晰。
filter类的声明
package com.wk.filters; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; //filter在应用启动时创建和初始化 //filter是单例多线程的。为了保证其线程安全,一般不会为filter添加可修改的成员变量。 //filter在应用停止时进行销毁的。 //doFilter()方法在访问被该filter进行过滤时,就会被调用。 //多个filter时,注册顺序就是其执行顺序。 public class OneFilter implements Filter { public OneFilter() { System.out.println("创建onefilter。。。。。。"); } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setAttribute("cs", "请求里添加一个attribute"); //这里非常重要,使请求进行传递。 chain.doFilter(request, response); //要想可以在过滤器中对response进行修改,就要求之前的response不能被关闭。 //response会在响应完成后自动关闭。 response.getWriter().write("响应里添加一段文字"); } @Override public void destroy() { System.out.println("销毁onefilter。。。。。。"); } //FilterConfig是filter在web.xml的注册信息。 @Override public void init(FilterConfig filterConfig) throws ServletException { System.out.println("初始化onefilter。。。。。。"); } }
filter的注册
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <filter> <filter-name>onefilter</filter-name> <filter-class>com.wk.filters.OneFilter</filter-class> </filter> <filter-mapping> <filter-name>onefilter</filter-name> <!--若filter为全路径匹配,那么url-pattern里只能是/* 不能是/ /* :表示可以匹配所有请求,即拦截所有请求,不论是静态资源请求,还是动态资源请求。 / :不会拦截动态资源请求,会拦截静态资源请求。对于jsp的请求就是动态资源请求,不会被拦截。 --> <url-pattern>/*</url-pattern> <!-- servlet-name:用来指定需要过滤的servlet。 <servlet-name></servlet-name> --> <!-- ERROR :当跳转到指定错误页面时的请求会被过滤。如下面的404 时到error.jsp FORWARD :表示此过滤器只过滤有一个servlet通过RequestDispathcher的forward()完成的跳转。 另外通过forward方式的跳转,响应会在跳转后的servlet生成处理。如:1->2 在2中 INCLUDE :表示此过滤器只过滤有一个servlet通过RequestDispathcher的include()完成的跳转。 通过include方式的跳转,响应会在跳转前的servlet生成处理。如:1->2 在1中 REQUEST :表示此过滤器会过滤普通请求,但对于forward()和include()的请求不拦截。默认值。 <dispatcher></dispatcher> --> </filter-mapping> <error-page> <error-code>404</error-code> <location>/error.jsp</location> </error-page> </web-app>