Filter

来源:互联网 发布:linux数据库迁移 编辑:程序博客网 时间:2024/05/16 07:59

Filter是sun继Servlet之后发布的技术,到现在为止,已经很成熟了。Filter在WEB应用中非常重要,因为Filter可以对HttpServletRequest和HttpServletResponse进行处理。下面来看看怎么定制自己的Filter。

接口Filter

所有的自定制的Filter都必须实现javax.servlet.Filter接口,该接口原型如下:

public interface Filter{  public void init(FilterConfig config);  public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain);  public void destroy();}
其中init方法是用来在Filter被装载后初始化Filter所占有的资源的,而doFilter方法则是提供对request和response对象的处理,destroy方法是用来在Filter被卸载后释放Filter所占用的资源的。

Filter的生命周期

一个Filter在WEB程序开始的时候便会被装载进入到WEB容器,紧接着会被调用init方法来初始化资源。然后对特定的URL进行服务,也就是doFilter,这个方法会在服务期间被调用多次。最后在WEB程序被关闭时,在卸载Filter之前,调用destroy方法来释放占用的资源。

配置Filter

Filter的配置在WEB程序的部署文件中,即web.xml。

  <filter>  <filter-name>autherization</filter-name>  <filter-class>com.daniel.model.filter.AutherizationFilter</filter-class>  </filter>    <filter-mapping>  <filter-name>autherization</filter-name>  <url-pattern>*.jsp</url-pattern>  </filter-mapping>
这样的配置想必也很简单易懂了,此外需要注意的是,一个Filter可以配置多个<url-pattern>。<filter-mapping>还可以配置<dispatcher>元素(配置一个或者多个),该元素的取值有以下的四种:

REQUEST、FORWARD、INCLUDE、ERROR。

REQUEST:是当请求为REQUEST时Filter起作用;

FORWARD:当服务器端重定向时Filter起作用;

INCLUDE:当请求的页面中有<jsp:include>时起作用;

ERROR:当请求的页面指定了错误页时起作用;

其中,默认值为REQUEST。

一个自定制Filter的例子

Filter在WEB中的用处非常大,这里展示的是一个对用户访问jsp页面时进行用户名验证的Filter。

public class AutherizationFilter implements Filter {/* (non-Javadoc) * @see javax.servlet.Filter#destroy() */public void destroy() {// TODO Auto-generated method stub}/* (non-Javadoc) * @see javax.servlet.Filter#doFilter(javax.servlet.ServletRequest, javax.servlet.ServletResponse, javax.servlet.FilterChain) */public void doFilter(ServletRequest arg0, ServletResponse arg1,FilterChain arg2) throws IOException, ServletException {// TODO Auto-generated method stubHttpServletRequest request = (HttpServletRequest )arg0;String uri = request.getRequestURI();String fileName = uri.substring(uri.lastIndexOf("/") + 1);int startIndex = fileName.lastIndexOf(".");String prefix = fileName.substring(0, startIndex);//对特定的index.jsp或者Login.jsp则不要求提供用户名验证if(prefix.equals("index") || prefix.equals("Login")){arg2.doFilter(arg0, arg1);}else{HttpSession session = request.getSession();BaseUser user = (BaseUser) session.getAttribute("user");if(user == null){HttpServletResponse response = (HttpServletResponse)arg1;response.sendRedirect("/struts-spring-hibernate/jsp/Login.jsp");}else{arg2.doFilter(arg0, arg1);}}}/* (non-Javadoc) * @see javax.servlet.Filter#init(javax.servlet.FilterConfig) */public void init(FilterConfig arg0) throws ServletException {// TODO Auto-generated method stub}}
其中,当chain.doFilter被调用后,request对和response对象会被传递给后续的Filter进行处理。

Filter的配置:

  <!-- Filter:对所有的jsp页面进行登录控制 -->  <!-- begin -->  <filter>  <filter-name>autherization</filter-name>  <filter-class>com.daniel.model.filter.AutherizationFilter</filter-class>  </filter>    <filter-mapping>  <filter-name>autherization</filter-name>  <url-pattern>*.jsp</url-pattern>  </filter-mapping>  <!-- end -->
这样子,如果用户在没有登录就去访问jsp页面(除了index.jsp和Login.jsp之外),就会被客户端重定向到Login.jsp来请求用户登录。


0 0
原创粉丝点击