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

关于J2EE中过滤器的使用

2017年08月22日 ⁄ 综合 ⁄ 共 3146字 ⁄ 字号 评论关闭

关于J2EE中过滤器的使用

 一个执行过滤器的Java 类必须实现javax.servlet.Filter 接口。这一接口含有三个方法:

init(FilterConfig):这是容器所调用的初始化方法。它保证了在第一次 doFilter() 调用前由容器调用。它能获取在web.xml 文件中指定的filter初始化参数。 
doFilter(ServletRequest,ServletResponse,FilterChain):这是一个完成过滤行为的方法。它同样是上一个过滤器调用的方法。引入的 FilterChain 对象提供了后续过滤器所要调用的信息。 
destroy():容器在销毁过滤器实例前,doFilter()中的所有活动都被该实例终止后,调用该方法。

 

一个J2EE中的最常见的编码过滤器,这个在spring中已经封装好了(spring-web-2.5.6.jar),下面我将仿效它,做一个过滤器。

首先在web.xml中添加如下片段:

 <filter>
 <filter-name>encodingFilter</filter-name>
<filter-class>org.yuqiaotech.filter.CharacterEncodingFilter</filter-clas>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>false</param-value>
        </init-param>
</filter>
<filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

添加实现类CharacterEncodingFilter.java

package  org.yuqiaotech.filter.CharacterEncodingFilter;
package Time;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
 
public classCharacterEncodingFilter  implements   Filter {
 
    private String  encoding;
    private boolean forceEncoding = false;
    protected   FilterConfig  filterConfig;
   
    public   void   init(FilterConfig   filterConfig)   throws   ServletException   {
        this.filterConfig=filterConfig;
        this.encoding=filterConfig.getInitParameter("encoding");
        String  value=filterConfig.getInitParameter("forceEncoding");
        if(value==null)
        this.forceEncoding=true;
        else   if(value.equalsIgnoreCase("true"))
        this.forceEncoding=true;
        else
        this.forceEncoding=false;
        }
 
        public   void   doFilter(ServletRequest   request,  ServletResponse   response,   FilterChain  chain)  throws   IOException,   ServletException   {
        //   TODO  自动生成方法存根
        if   (forceEncoding   ||   (request.getCharacterEncoding()   ==  null))   {
        String   encoding  =   selectEncoding(request);
        if   (encoding  !=  null)
        request.setCharacterEncoding(encoding);
        }
        chain.doFilter(request,   response);
        }
 
        public   void   destroy()   {
        //   TODO  自动生成方法存根
        this.encoding   =  null;
        this.filterConfig   =  null;
        }
 
 }

那么以后只要是客户端像服务器发出请求时都会先经过改过滤器,将其编码方式改为Utf-8

 

 J2EE中实际用法

encodingFilter

<filter>
        <filter-name>encodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>utf-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceEncoding</param-name>
            <param-value>false</param-value>
        </init-param>
</filter>
<filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
</filter-mapping>
 

OpenSessionInViewFilter

如果应用中使用了OpenSessionInViewFilter,所有打开的session会被保存在一个线程变量里。在线程退出前通过OpenSessionInViewFilter断开这些session为什么这么做?这主要是为了实现Hibernate的延迟加载功能。基于一个请求一个hibernatesession的原则。spring中对OpenSessionInViewFilter的描述如下:

它是一个Servlet2.3过滤器,用来把一个HibernateSession和一次完整的请求过程对应的线程相绑定。目的是为了实现"OpenSession
in View"
的模式。它允许在事务提交之后延迟加载显示所需要的对象。

<filter>
        <filter-name>OpenSessionInViewFilter</filter-name>
        <filter-class>
            org.springframework.orm.hibernate3.support.OpenSessionInViewFilter
        </filter-class>
</filter>
<filter-mapping>
        <filter-name>OpenSessionInViewFilter</filter-name>
        <url-pattern>*.action</url-pattern>
</filter-mapping>

 

抱歉!评论已关闭.