过滤器与封装器

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个方法达成。

 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值