web应用中,主要是对请求和响应的处理,一般使用过滤器来对不同的请求资源根据不同的功能需求进行判断分析、转换为满足需要的请求资源,再进行相应的业务处理,返回响应给客户端。比如,有中文字符集转换过滤器、非法文本屏蔽转换过滤器、自定义过滤器。经过许多web开发项目的沉淀积累,许多开源软件组件开发商提供了较为统一的过滤器,作为组件提供使用,比如spring提供的比较著名的字符集过滤器org.springframework.web.filter.CharacterEncodingFilter,下面总结一下过滤器的使用规则、我所用到的过滤器。
过滤器的配置规则
过滤器的配置我分为2种:1.一般过滤器;2.委托代理过滤器。
1.一般过滤器
过滤器一般配置在web.xml文件中,范例如下,参看相关注释信息:
<!--字符集过滤器--> <filter><!--1.过滤器处理类定义--> |
说明:
配置主要包含2部分:1.过滤器处理类定义,参数filter-name是过滤器名称,filter-class是过滤类路径,此类包含了请求资源的过滤相关处理逻辑,init-param是过滤类使用的参数包括参数名param-name,参数值param-value;2.过滤器映射资源路径定义,filter-mapping,filter-name是上述定义的过滤器名称,url-pattern是过滤器相应的url资源匹配后缀。
其中还要注意的地方是:如果有多个过滤器配置时,将成一种过滤链式结构,所以要注意web.xml是按照配置的先后顺序来加载过滤器的,如果过滤器拦截的资源匹配url-pattern有重叠或冲突,就需要考虑几点1)配置靠前的过滤器起作用,靠后的可能不会起作用,2)过滤的逻辑程序上也要考虑到是否会冲突,如果存在逻辑程序上的冲突就需要修正逻辑程序,以保证多个过滤器能够一起协调一致的按正确的功能要求来工作。
2.委托代理过滤器
web.xml这种配置方式,是委托代理方式的配置,这种方式功能更强,如下:
<filter> <filter-name>appSecurity</filter-name> <filter-class> org.acegisecurity.util.FilterToBeanProxy </filter-class> <init-param> <param-name>targetClass</param-name> <param-value> org.acegisecurity.util.FilterChainProxy </param-value> </init-param> </filter> <filter-mapping> <filter-name>appSecurity</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping> |
说明:上述org.acegisecurity.util.FilterChainProxy是一个实现Filter接口的类的过滤器类,它还能实现Spring的InitializingBean接口,这样的Filter类可以通过spring配置,注入spring上下文中,与其他的类一起合作工作,比单纯的Filter类的功能更强。我们需要实现特定功能时,此过滤器配置使用方式更为实用、功能更强。
过滤器类的编写
下面举一个代码实例,说明过滤器类的编写,有注释信息,如下:
import javax.servlet.Filter; public class AuthorityInterceptorFilter implements Filter { //1.过滤器加载时初始化读取或相关处理 @Override //2.执行过滤器的相关处理 @Override try { //此处编写过滤器的相关过滤逻辑 chain.doFilter(request, response); } //3.过滤器销毁的相关处理 @Override
} |
几种用过的过滤器
1.字符集过滤器
spring提供的经典的过滤器,很多web应用都要用的,完成转换中文字符集的功能,配置范例如下:
<filter>
|
2.自定义过滤器
举一个相对完整的例子,这个过滤器的功能主要是完成用户访问的权限资源路径的拦截控制,如果用户请求访问了未经授权的权限资源路径,此过滤器将拦截并给出拒绝访问的响应。
<!-- 权限资源拦截控制 --> <filter> <filter-name>authorityInterceptorFilter</filter-name> <filter-class>cn.ceopen.bss.pub.login.util.AuthorityInterceptorFilter</filter-class> <init-param> <param-name>userdefine.open.funcpath</param-name> <param-value> **/pub/login.do,**/pub/leftMenu.do </param-value> </init-param> </filter> <filter-mapping> <filter-name>authorityInterceptorFilter</filter-name> <url-pattern>*.do</url-pattern> </filter-mapping> |
说明:
过滤器类cn.ceopen.bss.pub.login.util.AuthorityInterceptorFilter,其中主要逻辑是,用户登录系统后,判断当前用户访问的请求资源路径是否与他所拥有的权限资源路径相匹配,如果不匹配则拒绝访问,init-param参数包含了自定义的其他可以自由开放访问的资源路径。处理资源路径匹配为*.do。所有程序和配置都可以根据业务需求扩展定制。
这样可以实现用户访问权限的鉴权控制。这仅是实现思路的一部分。仅供参考。