现在的位置: 首页 > 综合 > 正文

Servlet的过滤器

2018年05月09日 ⁄ 综合 ⁄ 共 3486字 ⁄ 字号 评论关闭

1.  Filter介绍
过滤器就是一个类似于Servlet的由容器管理对象,它能够以声明的方式插入到HTTP请求响应的过程中,过滤器是J2EE Web应用程序中应用级别的Java代码组件。除了Servlet和JSP页面以外,遵循Servlet 2.3以上规范编码的开发人员能将过滤器作为在Web应用程序中加入活动活动行为的机制。与在特定的URL上工作的Servlet和JSP页面不同,过滤器接入J2EE容器的处理管道,并能够跨由Web应用程序提供的URL子集进行工作。

2.  Filter的功能
1)在一个Servlet被调用前截获该调用
2)在一个Servlet被调用前检查请求
3)修改在实际请求中提供了可定制请求对象的请求头和请求数据
4)修改在实际响应中提供了可定制响应对象的响应头和响应数据
5)在一个Servlet被调用之后截获该调用
6)过滤的应用包含授权、日志、图像转换、数据压缩、加密、表示流及XML转换。另外在Servlet 2.4的规范中,增加了一个新的技术,就是可以在视图派发器下执行过滤操作。

3.  Filter的生命周期
实例化:在访问Web资源创建过滤器的实例
初始化:容器在调用过滤器的doFilter()方法之前调用init()方法。Web容器使用FilterConfig对象作为init()方法的参数将配置信息发送给过滤器。
过滤:每当用户提交请求或Web资源发送响应时,调用doFilter()方法。
销毁:在停止使用过滤器之前,由容器调用过滤器的destroy()方法,允许过滤器完成必要的清除和释放资源。

4.  过滤器API(以下是翻译J2EE 1.5 API的部分片段)
与过滤器相关的API在javax.servlet这个包中,其中包含了Filter、FilterChain、FilterConfig这三个接口
Filter中的方法有:
void destroy() 这个方法有Web容器调用以表示过滤正在从服务中销毁
void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 在每次客户端请求资源最后时刻,传递过来的请
求和响应时,由容器调用这个方法。
void init(FilterConfig filterConfig) 由容器调用表示过滤器正在初始化。

FilterChain中的方法有:
void doFilter(ServletRequest request, ServletResponse response) 调用这个方法将导致在整个过滤器链的下一个过滤器被调用,或者如果这个过滤器是整个过滤器的最后一个过滤器,那么资源将被调用。

FilterConfig的方法有:
String getFilterName() 返回这个在部署文件描述(web.xml)中定义的过滤器的名字
String getInitParameter(String name) 返回以name命名的初始化参数的字符串类型的值,如果这个参数不存在,那么返回空。
Enumeration getInitParameterNames() 返回过滤器所有初始化参数名字的一个枚举,如果没有参数存在,那么返回空枚举。
ServletContext getServletContext() 返回Servlet上下文。
 

 5.  过滤器示例

 /*=======CharFilter.java========*/
package com.filter;

import java.io.IOException;
import java.util.Enumeration;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletContext;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class CharFilter implements Filter {
 String charSet = null;

 @Override
 public void destroy() {
  System.out.println("正在销毁过滤器。。。");
 }

 @Override
 public void doFilter(ServletRequest req, ServletResponse res,
   FilterChain filterChain) throws IOException, ServletException {
  System.out.println("正执行字符过滤。。。");

  HttpServletRequest hreq = (HttpServletRequest) req;
  HttpServletResponse hres = (HttpServletResponse) res;

  hreq.setCharacterEncoding(charSet);
  hres.setCharacterEncoding(charSet);

  filterChain.doFilter(hreq, hres);
 }

 @Override
 public void init(FilterConfig filterConfig) throws ServletException {
  System.out.println("正在获取字符过滤器初始化,获取初始化参数。。。");
  charSet = filterConfig.getInitParameter("charSet");
  String filterName = filterConfig.getFilterName();
  Enumeration nameEnum = filterConfig.getInitParameterNames();

  ServletContext sc = filterConfig.getServletContext();

  System.out.println("charSet: " + charSet);
  System.out.println("filterName: " + filterName);

  while (nameEnum.hasMoreElements()) {
   System.out
     .println("nameEnum: " + nameEnum.nextElement().toString());
  }

  if (charSet == null) {
   charSet = "GBK";
  }
 }
}

 

/*=========过滤器的配置=========*/

<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.4" xmlns="http://java.sun.com/xml/ns/j2ee"
 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
 xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
 http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">

 <filter>
  <filter-name>charFilter</filter-name>
  <filter-class>com.filter.CharFilter</filter-class>
  <init-param>
   <param-name>charSet</param-name>
   <param-value>GBK</param-value>
  </init-param>
 </filter>
 <filter-mapping>
  <filter-name>charFilter</filter-name>
  <url-pattern>/*</url-pattern>
 </filter-mapping>

</web-app>

 

抱歉!评论已关闭.