什么是Filter?

  Filter属于sevlet规范,翻译为过滤器。

  Filter在web开发中有什么作用?

案例一:一个web站点只有用户登录才能继续访问该站点的资源,那么需要用户每次访问都判断是否登陆,若在每个servlet中都写上登陆判断安全控制代码,代码冗余,复用性差,Filter可以很好的解决这个问题。

案例二:一个web站点当中的所有post请求都有可能出现中文乱码问题,所有post请求我们都需要设置字符集,request.setCharacterEncoding("UTF-8");代码无法重复利用。

上图:

javaweb开发如何编写一个Filter?

 首先 编写一个类实现javax.servlet.Filter接口并实现其中的方法

import java.io.IOException;
import java.util.Enumeration; import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse; public class FirstFilter implements Filter { @Override
public void init(FilterConfig filterConfig) throws ServletException {
//System.out.println("FirstFilter init...");
//Filter在服务器启动阶段被实例化。并且调用init方法,init方法只执行一次,因为Filter只被实例化一次(单例的)
Enumeration<String> names = filterConfig.getInitParameterNames();
while(names.hasMoreElements()){
String name = names.nextElement();
String value = filterConfig.getInitParameter(name);
System.out.println(name + " = " + value);
}
} @Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException { System.out.println("FirstFilter doFilter begin...");
//前端用户只要发送一次请求,则执行一次doFilter方法
//顺着链条往下走,下一个目标是Filter则调用Filter的doFilter方法
//顺着链条往下走,下一个目标是Servlet则调用Servlet的service方法
chain.doFilter(request, response); System.out.println("FirstFilter doFilter end...");
} @Override
public void destroy() {
/**当长时间没有用户访问,或者项目重新部署,或者服务器重新启动的时候,会销毁所有的Filter对象,
*销毁之前会先调用Filter对象的destroy方法,完成销毁前的准备工作。也是只执行一次。*/
System.out.println("FirstFilter destroy...");
}
}

其次:在web.xml文件中对filter进行路径映射配置,确定filer;拦截过滤哪些路径   filter的优先级:在web.xml越靠上的优先级越高。

<filter>
<filter-name>firstFilter</filter-name>
<filter-class>com.bjpowernode.javaweb.web.filter.FirstFilter</filter-class>
<!-- 在初始化参数当中指定了字符集为UTF- -->
<init-param>
<param-name>encoding</param-name>
<param-value>GBK</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>firstFilter</filter-name>
<url-pattern>*.do</url-pattern>
</filter-mapping>

Filter优先级天生比servlet高,Filter通过filter.chain进入链条的下一个环节,在服务器启动阶段动态组合链条,符合责任链设计模式(动态调用,组合依赖于配置)。

这样最简单的一个fiter过滤器就完成了,我们可以在执行servlet之前在filter里面添加我们需要的业务逻辑,过滤字符集,添加登陆安全控制等等...

                                                  如有不足,欢迎指正。

java filter过滤器及责任链设计模式的更多相关文章

  1. Java中的责任链设计模式,太牛了!

    责任链设计模式的思想很简单,就是按照链的顺序执行一个个处理方法,链上的每一个任务都持有它后面那个任务的对象引用,以方便自己这段执行完成之后,调用其后面的处理逻辑. 下面是一个责任链设计模式的简单的实现 ...

  2. Java设计模式之责任链设计模式

    职责链模式(Chain of Responsibility):使多个对象都有机会处理请求,从而避免请求的发送者和接收者之间的耦合关系,将所有处理对象连成一条链,并沿着这条链传递请求,直到有一个对象处理 ...

  3. Jfinal----Handler之责任链设计模式

    Jfinal handler的处理采用了责任链设计模式 有关责任链模式,推荐看: <JAVA与模式>之责任链模式 1.实现Handler只需要继承Handler public class ...

  4. javascript实现责任链设计模式

    javascript实现责任链设计模式 使多个对象都有机会处理请求,从而避免请求的发送者和接受者之间的耦合关系.将这些对象连成一条链,并沿这条链传递该请求,直到有一个对象处理他为止. 这是Gof的定义 ...

  5. Java模式开发之责任链模式

    Java模式开发之责任链模式 从击鼓传花谈起 击鼓传花是一种热闹而又紧张的饮酒游戏.在酒宴上宾客依次坐定位置,由一人击鼓.击鼓的地方与传花的地方是分开的.以示公正. 開始击鼓时,花束就開始依次传递,鼓 ...

  6. Java Filter过滤器(拦截路径的配置+拦截方式的配置+生命周期+多个过滤器的先后执行顺序)

    Java Filter过滤器+Listen监听器 啥是过滤器 顾名思义即过滤掉一些东西,比如我们经历的高考中考都是过滤器,他过滤掉一些在学习这一方面不是很好的人,而那些成绩好的人则升入高中,大学. 但 ...

  7. PHP责任链设计模式

    <?php //责任链设计模式 /** * 每个对象,储存着对自己上级的引用, * 如果自己处理不了,交给上一级. */ class board{ protected $power=1; pro ...

  8. JAVA责任链设计模式

    <JAVA与模式>之责任链模式 在阎宏博士的<JAVA与模式>一书中开头是这样描述责任链(Chain of Responsibility)模式的: 责任链模式是一种对象的行为模 ...

  9. Sentinel-Go 源码系列(二)|初始化流程和责任链设计模式

    上节中我们知道了 Sentinel-Go 大概能做什么事情,最简单的例子如何跑起来 其实我早就写好了本系列的第二篇,但迟迟没有发布,感觉光初始化流程显得有些单一,于是又补充了责任链模式,二合一,内容显 ...

随机推荐

  1. keras环境

    Windows 7 python3.6 在安装 Keras 之前, 需要确认自己已经安装好了 Numpy 和 Scipy. 安装个anaconda3就可以搞定 因为 Keras 是基于 Tensorf ...

  2. 2019.01.08 bzoj3809: Gty的二逼妹子序列(莫队+权值分块)

    传送门 题意:多组询问,问区间[l,r]中权值在[a,b]间的数的种类数. 看了一眼大家应该都知道要莫队了吧. 然后很容易想到用树状数组优化修改和查询做到O(mnlogamax)O(m\sqrt nl ...

  3. GDI基础(3):绘制图片

    1.CBitmap位图类封装了Windows GDI中的位图和操作位图的成员函数.CPen.CBrush.CFont.CBitmap是常用的Windows GDI对象,和CFont一样,CBitmap ...

  4. 词袋模型(BOW, bag of words)

    词集模型:单词构成的集合,每个单词只出现一次. 词袋模型:把每一个单词都进行统计,同时计算每个单词出现的次数. 在train_x中,总共有6篇文档,每一行代表一个样本即一篇文档.我们的目标是将trai ...

  5. Arcgis Server Manager发布ArcGISTiledMapServiceLayer服务

    用ArcgisServer manager发布一个ArcGISDynamicMapServiceLayer服务: Add New Service->填写name,type 选择Map servi ...

  6. js中的事件代理(委托)

    1,什么是事件委托:通俗的讲,事件就是onclick,onmouseover,onmouseout,等就是事件,委托呢,就是让别人来做,这个事件本来是加在某些元素上的,然而你却加到别人身上来做,完成这 ...

  7. MIT Molecular Biology 笔记1 DNA的复制,染色体组装

    视频  https://www.bilibili.com/video/av7973580?from=search&seid=16993146754254492690 教材 Molecular ...

  8. Linux入门(1)——Ubuntu16.04安装搜狗拼音

    在网址下载搜狗deb包:http://pinyin.sogou.com/linux/ 将下载的sogoupinyin_2.1.0.0082_amd64.deb放在根目录下. 安装搜狗拼音: ltq@l ...

  9. 20145232 韩文浩 《Java程序设计》第7周学习总结

    教材学习内容总结 就目前来说,即使标注为GMT(格林威治时间),实际上谈到的时间指的是UTC时间. 秒的单位定义时基于TAI.也就是铯原子辐射的振动次数. UTC考虑了地球自转越来越慢而有闰秒修正,确 ...

  10. GPIO工作模式

    共8种工作模式,4种输入,1.输入浮空模式2.输入上拉模式 3.输入下拉模式4.模拟输入模式 4种输出模式:开漏输出.开漏复用功能.推挽输出.推挽复用输出 ps:mos管就是场效应管,三极管有的时候也 ...