- Fillter
功能上讲,Fillter是可以帮助我们队请求与响应过滤进行过滤。
技术上讲,它是sun公司定义的一个接口:javax.servlet.Fillter。
filter优先于servlet的执行,请求到达服务器后,许先经过filter再转发到servlet中处理。servlet能做的,filter也能做,但是反过来不行。所以filter可以代替servlet,但通常不会这么做,而是只用来做过滤用。
- Fillter的常用功能:信息拦截
- 过滤消息.
- 权限控制
- 生命周期
- 初始化:服务器启动加载filter时初始化,调用init方法.
- 服务期:服务器运行期间,多次调用doFilter方法.
- 消亡:服务器正常关闭时,调用destroy方法.
- 如何使用
- 创建一个类,实现javax.servlet.Filter接口.
- 重写接口中的三个方法:init、doFilter、destroy.
- 在web.xml文件中配置,指定拦截什么资源.
- filter的配置
- Filter的配置和servlet类似的配置
注意:
- servlet-name、url-pattern两个都陪的情况下,tomcat6会执行两遍filter,而tomcat7以上不会出现异常。
- filter优先级由web.xml配置的filter的maping顺序有关,而非根据路径优先级。
- FillterConfig对象的作用(和ServletConfig差不多的功能)
- 获取Fillter的名称.
- 获得Fillter的配置参数.
- 获取ServletContext对象.
- Filter链(过滤链)
filter链是指多个filter同时拦截了同一个资源,则这些filter就形成了一个filter链,即过滤链。filter链常用与对消息的不同内容进行过滤等。
- 拦截的优先顺序按照web.xml文件中配置的先后顺序确定.
- 在拦截连中的某个filter执行完后,若放行,后面的filter才能拦截到,否则拦截不到.
- 那些请求能被拦截
在web.xml配置文件中,有dispatcher配置项,决定了该过滤器拦截那些类型。前两个类型比较常用。
- REQUEST : 拦截来自浏览器的请求。
- FORWARD : 拦截来自服务器内部的请求转发的请求。
- ERROR : 拦截500、404等错误。
- INCLUDE : 拦截请求包含的请求。
- Filter中的一般处理流程
- 将request、response对象强转。原因是服务器内部传过来的也是HttpServletXxx的对象。ServletRequest、ServletResponse是其父类。要是不强转,HttpServletXxx子类特有的方法将无法使用。所以一般强转。
- 处理具体的过滤器处理操作。
- 将请求放行。
- 样例
- 自动登录过滤器,使用MD5加密(*****)
- 在第一次登录成功后,将用户名、密码经加密后,存储到cookie中,保存在浏览器段。
- 下次访问网站时,若是在session中没取到user信息,则判断法国来的cookie中是否携带用户名、密码信息
- 存在,则自动登录。
- 不存在,将客户端账户、密码信息清空。
- Url级别权限控制(***)
- 在访问某个资源时,先校验用户是否登录,是,往下执行,否则屏蔽.
- 验证用户的权限等级是否满足,是,则往下,否则中断.
- 将请求转发到要访问的资源.
- 自动登录过滤器,使用MD5加密(*****)
注:权限较多可使用配置文件存储每个角色能访问的路径.
- 自动登录中的信息安全性问题
- web应用中,用户的密码通常是使用MD5加密(不可逆加密)后,存储到数据库中。
- 用户第一次登录过后,将用户名和加密后的密码存储在cookie中。
- 自动登录时:
- 获取到cookie中的密码密文。
- 从数据库获取到用户密码的密文。
- 两者对比,即可验证。
cookie中的密文的加密是不可逆的,也就无法破解出原始密码。
cookie的不可移动性由浏览器保证。也就是说cookie文件时无法移动的,你无法从一个浏览器将cookie移动到另一个浏览器中使用。
cookie端、数据库端存储的都是密文。若正常登陆,则将密码加密后得到密文,再去比较验证。
注:目前最安全的加密算法是MD5加密了,号称不可逆算法,无法破解。但其实该算法已经被破解了,但破解算法没有被公开。不公开的原因是会对业界造成……..你懂的。