1.过滤器的实现
在servlet/jsp容器中实现过滤器,必须实现Filter接口,并在web.xml中定义过滤器,让容器知道该加载哪些过滤器类。
doFilter()中的过程:
service()前置处理
chain.doFilter(request,response);
service后置处理
如果调用了FilterChain的doFilter(),就会执行下一个过滤器,如果没有下一个过滤器,就调用请求目标Servlet的service().如果没有通过过滤器的验证,则请求不会继续交给下面的过滤器或目标Serlvlet,这时就是所谓的拦截请求。
Ps:
Servlet/Jsp的过滤器机制,其实就是Java EE设计模式的Interceptor Filter模式的实现。
2.过滤器的设置
web.xml
<filter>
<filter-name>Per</filter-name>
<filter-class>...</filter-class>
<init-param>
<param-name></
<param-value></
</init-param>
</filer>
<filter-mapping>
<filter-name>Per</filter-name>
<url-patter>/prime.do</这里或者是<servlet-name>userServlet</
<dispatcher>REQUEST</
<dispatcher>FORWARD</
<dispatcher>INCLUDE</
<dispatcher>ERROR</
</filter-mapping>
<url-patter>设置哪些URL请求必须应用哪个过滤器
<servlet-name>设置哪些Servlet将应用此过滤器
可以指定<url-patter>或<servlet-name>,且可以出现多次(可以2个都存在)。如果想符合所有的Servlet名称,则可以使用*
<servlet-name>*</servlet-name>
3.触发过滤器的时机
<dispatcher>指定哪些请求转发类型可以触发过滤器
1) 默认是浏览器直接发出请求(<dispatcher>REQUEST</)
2) 如果是RequestDispatcher 的forward()或include()请求,则可以是
<dispatcher>FORWARD</
<dispatcher>INCLUDE</
3) <dispatcher>ERROR是容器处理异常而转发过来的请求
不设置<dispatcher>即是默认的REQUEST
Ps:
当然这些请求转发的类型也要满足<servlet-name>或<url-pattern>才能执行过滤器
4.过滤器执行顺序
如果有某个URL或Servlet会应用多个过滤器,则根据<filter-mapping>在web.xml中出现的先后顺序,来决定过滤器的执行顺序。
封装器
1.对容器产生的请求与响应对象进行封装,以针对某些请求或响应进行加工处理,因为有些信息无法修改,如请求参数,所以需要封装。
虽然可以使用HttpServletRequest的getParameter()取得请求参数值,但就是没有类似setParameter()的方法可以将处理后的参数值重新设置给HttpServletRequest。
HttpServletRequestWrapper实现了HttpServletRequest接口,这样不用自己实现此接口,只有继承HttpServletRequestWrapper类,并编写想要重新定义的方法即可。相对于ServletRequest接口,也有个 ServletRequestWrapper类可以使用。
同理:(HttpServletResponse ServletResponse同样类比)
2.HttpServletRequestWrapper的实现
继承HttpServletRequestWrapper之后,必须定义构造函数,通过super()来调用父类的构造函数,并传入想要封装的原请求对象,之后若想取出原请求对象,可以通过getRequest()来取得。
Ps:可以使用封装类和过滤类搭配,也可以在Servlet中进行封装类的实例建立对请求或响应进行封装。
封装之后,在Filter或Servlet中使用此对象,不需要也不用知道请求对象是否被封装,一样调用getParameter()即可。
3.HttpServeltResponseWrapper类的实现
例:
如果想要对响应的内容进行压缩处理,就要像办法让HttpServletResponse对象具有压缩处理的功能。
若想要对浏览器进行输出响应,必须通过getWriter()取得PrintWriter,或是getOutputStream()取得ServletOutputStream.所以针对压缩输出的需求。主要在继承HttpServletResponseWrapper之后,通过重写这2个方法达成。