传智播客java学习--javaweb过滤器(filter)

我今天学习了过滤器(filter)的知识,是冯老师讲的课,我做了简单的笔记:

 

Servlet过滤器(Filter):不限定于具体的协议

一、         使用拦截设置请求字符编码,过滤非法文字,验证客户是否已经登陆,

二、         编写过滤器:

a)       建立一个class,实现Filter接口,有三个方法,是过滤器生命周期的方法,init()初始化:执行一次,doFilter()完成过滤任务:执行多次,destroy()过滤器销毁:执行一次,(先实例化,后初始化),有请求时才执行doFilter方法,

b)      在web.xml里面注册过滤器:    ( /* )代表拦截所有的文件                     <filter><filter-name>                               </filter-name><filter-class><filter-class></filter>                       配置映射信息:<filter-mapping><filter-name></filter-name> <url-pattern>/*</url-pattern>  </filter-maping>

c)       在doFilter()里面放行:chain.doFilter(request,repsonse);  

三、         初始化方法:Init(FilterConfig  filterConfig ):读取过滤器的初始化参数:filterConfig.getInitParameter(“nba”);                            使用枚举读取: Enum em =filterConfig.getInitParamternames();    输出上下文参数;filterCOnfig.getServletcontext.getInitparamternames()

四、         doFilter( ):将request转型:                          HttpServletRequest req= (HttpServletRequest)request                  

a)      

五、         过滤器的应用:字符编码的过滤器

a)       通过配置参数encoding指明使用何种字符编码,以处理Html Form请求参数的中文问题

b)      使用方法:在过滤器的doFilter( )里面设置请求字符编码:           HttpServletRequest req= (HttpServletRequest)request      ;        String  encoding=req.getetCharaterEncoding       if(encoding==null)     req.setCharaterEncoding(“utf-8”);

c)       使用方法2:在Filter里面配置初始化参数<init-param>encoding:在init()里面读取参数:

六、         只拦截一个servlet:

a)      

b)      拦截所有servlet:将servlet路径改为:                                     

c)      

d)      拦截某一目录的所有文件:

e)      

七、         拦截转发:<dispatcher>指定过滤器所拦截的资源被 Servlet 容器调用的方式,可以是REQUEST,INCLUDE,FORWARD和ERROR之一,默认REQUEST. 可以设置多个<dispatcher> 子元素用来指定 Filter 对资源的多种调用方式进行拦截。

a)       <dispatcher> 子元素可以设置的值及其意义:

REQUEST:当用户直接访问页面时,Web容器将会调用过滤器。如果目标资源是通过RequestDispatcher的include()或forward()方法访问时,那么该过滤器就不会被调用。

INCLUDE如果目标资源是通过RequestDispatcher的include()方法访问时,那么该过滤器将被调用。除此之外,该过滤器不会被调用。

FORWARD:如果目标资源是通过RequestDispatcher的forward()方法访问时,那么该过滤器将被调用,除此之外,该过滤器不会被调用。

ERROR如果目标资源是通过声明式异常处理机制调用时,那么该过滤器将被调用。除此之外,过滤器不会被调用。

b)       

c)      

八、         Servlet过滤器对响应的过滤:

a)       A.过滤器截获客户端的请求.
B.重新封装ServletResponse,在封装后的                         ServletResponse中提供用户自定义的输出流.
C.将请求向后续传递.
D.Web组件产生响应.
E.从封装后的ServletResponse中获取用户自定义的输出流.
F.将响应内容通过用户自定义的输出流写入到缓冲流中.
G.在缓冲流中修改响应的内容后清空缓冲流,输出响应内容.

b)      应用:使浏览器不缓存页面的过滤器:

                       i.              强转(HttpServletResponse )response;

                      ii.              有 3 个 HTTP 响应头字段都可以禁止浏览器缓存当前页面,它们在 Servlet 中的示例代码如下:

      //设定网页的到期时间,一旦过期则必须到服务器上重新调用

   response.setDateHeader("Expires",-1);

//  Cache-Control指定请求和响应遵循的缓存机制   no-cache指示请求或响应消息不能缓存

response.setHeader("Cache-Control","no-cache"); 

//是用于设定禁止浏览器从本地机的缓存中调阅页面内容,设定后一旦离开网页就无法从Cache中再调出

response.setHeader("Pragma","no-cache"); 

并不是所有的浏览器都能完全支持上面的三个响应头,因此最好是同时使用上面的三个响应头

九、         当一个web应用中有多个过滤器时,web 容器将把这多个 Filter 程序组合成一个 Filter 链(过滤器链),Filter 链中各个 Filter 的拦截顺序与它们在应用程序的 web.xml 中映射的顺序一致。(即<fiter-mapping>的先后顺序,而与<filter>的顺序无关)

十、        过滤器应用:检测用户是否登陆

a)       方法一:利用session,在登陆页面放置session,在每个页面获取session,获取不到,则转到登陆页面,

b)      方法二:利用Filter:

                        i.              在web.xml里面配置:

                      ii.             

                    iii.             

                   iv.             

                     v.              在servlet获取配置信息,放置session:

                   vi.             

                 vii.              在过滤器的init()里面读取配置参数:

               viii.             

                   ix.             

                     x.             

                   xi.              在doFilter()的判断:

                 xii.             

               xiii.             

               xiv.               

                 xv.              ,在过滤器的doFilter( )里面,转换request和response,利用request获取session,获取session的值,如果获取不到session,则转到登陆页面,如果获取到了,则放行,

十一、              装饰模式:

a)       装饰 HttpServletRequest 对象

                        i.              需求:在 HttpServletRequest 对象到达 Servlet 之前把用户输入的多余空格都去掉

                      ii.              情景:因为 HttpServletRequest 对象里的请求参数都实际包含在 java.util.Map 对象里,而Map是不允许修改的,所以包含在 HttpServletRequest 对象里的请求参数不能被修改

                    iii.              解决方案:采取 Decorator(装饰器)模式

b)      HttpServletRequestWrapper 类:

                        i.              Servlet API 中提供了一个 HttpServletRequestWrapper 类来包装原始的 request 对象, HttpServletRequestWrapper 类实现了 HttpServletRequest 接口中的所有方法,这些方法的内部实现都是仅仅调用了一下所包装的的 request 对象的对应方法

                      ii.              相类似ServletAPI也提供了一个 HttpServletResponseWrapper 类来包装原始的 response 对象

十二、            过滤器应用:过滤不雅文字和HTML特殊字符

a)       步骤:建立一个过滤器:将request和response转型,

b)      建立一个class: myHttpServletWrapper继承HttpServletWrapper

c)       在过滤器里面:new myHttpServletWrapper();

d)      建立一个资源属性文件:存放待替换的字符:

e)       在myHttpServletWrapper里面加载属性文件,检查页面输入的字符是否包含属性文件的字符,

 

 

总结:过滤器有很多功能:设置请求字符编码,过滤非法文字,验证客户是否已经登陆,这些都是如今的互联网上都经常使用的功能,因此要多加练习,彻底掌握过滤器的使用

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值