过滤器概念
过滤器就是用来拦截客户端(浏览器)与目标资源的请求,对客户端的请求进行一定过滤处理,再发给目标资源(Servlet、JSP、html等)。
在Web应用程序中,过滤器是介于Servlet之前,既可以拦截、过滤浏览器的请求,也可以改变对浏览器的响应。它在服务端与客户端起到一个中间组件的作用,对二者之间的数据信息进行过滤。
一个Web应用程序中可以有多个过滤器,组成过滤器链。
过滤器链中的每个过滤器都各司其职地处理并转发数据。
在Web开发中,经常利用过滤器来实现如下功能:
对用户请求进行身份认证;
对用户发送的数据进行过滤或者替换;
转换图像的数据格式;
数据压缩;
数据加密;
XML数据的转换;
修改请求数据的字符集。
Servlet过滤器的用途:
用户认证与授权管理:我们开发一个web应用,肯定有不同权限的用户,有管理员,有普通用户。而管理员又可能分为一级管理员,二级管理员,三级管理员。每一级管理员可能又有不同的管理权限操作,访问不同的资源。过去我们可能都是在jsp页面,servlet中加以权限的控制。通过session,看他是否有这个权限,如果有,则让他操作某个资源。这些都是些共性。那么现在我们就可以把他提取出来。让他通过过滤器来实现;用户来访问一个资源,我们通过过滤器来过滤这个请求,在程序中判断是否有权限来访问这个资源;有,则让他去访问,没有,就让他转到另外一个页面。这样通过过滤器就实现了授权管理;
实现过滤器
1.创建Class类,并实现Filter接口(javax.servlet.Filter)。
2.重写Filter接口中的方法:
Public void init(FilterConfig filterConfig){ // 该方法用来初始化过滤器,FilterConfig对象可以得到过滤器中初始化的配置参数信息 }
Public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain){ // 该方法主要实现过滤的方法。当客户端请求目标资源时会调用此方法,在该方法中,实现对请求(request)和响应(response)的数据处理,chain是过滤器链对象。在该方法中的特定操作完成后,可调用FilterChain对象的doFilter(request, response)将请求传递给下一个过滤器或目标资源。 }
Public void destroy(){ // 该方法用于释放过滤器中使用的资源。 } |
3.在web.xml中配置Filter
<filter> <filter-name>filter1</filter-name> <filter-class>com.filter.ServletFilter</filter-class> </filter> <filter-mapping> <filter-name>filter1</filter-name> <!--当请求/manage/目录下的资源时执行过滤器--> <url-pattern>/manage/*</url-pattern> </filter-mapping> |
实现过滤器链
在访问目标资源时执行多个过滤器。
例:访问/manage/下所有目标资源时会执行过滤器filter1和filter2
<!--第一个过滤器--> <filter> <filter-name>filter1</filter-name> <filter-class>com.filter.SerlvetFilterA</filter-class> </filter> <filter-mapping> <filter-name>filter1</filter-name> <url-pattern>/manage/*</url-pattern> </filter-mapping> <!--第二个过滤器--> <filter> <filter-name>filter2</filter-name> <filter-class>com.filter.ServletFilterB</filter-class> </filter> <filter-mapping> <filter-name>filter2</filter-name> <url-pattern>/manage/*</url-pattern> </filter-mapping> |
注意事项:
l 过滤链的执行顺序由 web.xml中定义的顺序决定。
l 一旦形成过滤链的,请求的顺序以web.xml的顺序决定,响应的顺序则相返,先请求的后响应。
l 在开发中,有可能只对某个或某几个目录过滤,此时可以明确的写出是哪个目录过滤,增加过滤的映射路径即可。
执行Servlet时执行过滤器
<!-- Filter 配置--> <filter> <filter-name>filter1</filter-name> <filter-class>com.filter.SerlvetFilterA</filter-class> </filter> <filter-mapping> <filter-name>filter1</filter-name> <url-pattern>/user/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>filter1</filter-name> <!--当访问Servlet中aabb时,执行过滤器filter1--> <servlet-name>aabb</servlet-name> </filter-mapping>
<!-- Servlet 配置--> <servlet> <servlet-name>aabb</servlet-name> <servlet-class>com.servlet.Servlet1</servlet-class> </servlet> <servlet-mapping> <servlet-name>aabb</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> |
评论 (0)