zl程序教程

您现在的位置是:首页 >  后端

当前栏目

jsp过滤器一点小结

JSP 小结 过滤器 一点
2023-09-11 14:19:05 时间

Jsp过滤器的说明

过滤器的作用:

    A,正常调用请求的资源

B,用修改后的请求信息调用请求的资源

C,修改响应请求,然后发送到客户端

D,禁止调用该资源,将请求重定向到其他的资源,或者返回一个特定的状态,或者产生替换输出

过滤器的基本概念

     拦截和修改servlet或者jsp页面的输入请求和输出请求 ,也就是可以过滤请求也可以过滤响应。

  Filter类能在request到达serlvet的服务方法之前拦截HttpServletRequest对象,而在服务器方法转移控制后又能拦截HttpServletResponse对象

 

 

声明过滤器的标签

   <filter>

                   <filter-name>ReplaceSiteNameFilter</filter-name>//过滤器的别名,为了简单起见可以设置为类名

                   <filter-class>coreservlets.filters.ReplaceSiteNameFilter</filter-class>//具体的哪一个过滤器

          </filter>

 

          <filter-mapping>

                   <filter-name>ReplaceSiteNameFilter</filter-name>

                   <url-pattern>/page1.jsp</url-pattern>//要过滤的页面资源

          </filter-mapping>

  创建过程:

a.      创建实现Filter接口的类,当然也可以继承实现Filter的子类

b.      将过滤行为放入doFilter方法中,public void doFilter(ServletRequesetrequest,ServletResponse response,FilterChain chain);其中request用来过滤请求,而response就是用来过滤响应,有两种情况必须使用它:第一,如果想完全阻止资源的访问,可以调用response.getWriter方法直接向用户发送响应,第二,如果想修改资源页面的响应。所以可以发现过滤器总是在与之相关联的servlet或jsp之前运行

c.      运行doFilter方法进行调用:调用FilterChain之前,下一个关联的过滤器会被调用,也就是说过滤器讲请求后传,如果没有,就调用servlet或jsp本身;如果有则调用之,由此可知,最后一个过滤器调用FilterChain的doFilter方法时,会调用servlet或jsp页面本身;如果没有调用chain.doFilter,相应的资源是没法得到调用的

 

阻止响应的简单实现

   经过测试可以发现,当注释掉doFliter方法里面的chain.doFilter(req,res)后之没法打开相应的资源servlet或者jsp的,所以一个简单的阻止响应的伪代码就出来了

If(满足阻止条件){

  在这里,可以重定向新的页面,res.senReddirect(string);也可以做些其他的操作

}

Else {

  Chain.doFilter();

}

修改响应

  注意,需要理解就是,servlet和jsp调用response.getWriter或response.getOutputStream并开始发送输出时,输出实际上并没有被立即发送到客户端,而是发送大到一个大的字符串缓冲区,所以就可以操作这个缓冲区来修改响应了

实现这个功能的类是HttpServletResponseWrapper(implements HttpServletRepsonse),实际应用的时候,可以自己创建一个类,继承这个响应包装类;

可以将这个包装类直接传递给Filter,调用chain.doFilter之后,可以用响应包装类的getWriter或者getOutputStream()类来获得原始资源的输出,也就是得到没有改变的响应