struts2.1.3之后使用自定义Filter

本文深入解析Struts2框架中ActionContextCleanUp、FilterDispatcher、StrutsPrepareAndExecuteFilter、StrutsPrepareFilter、StrutsExecuteFilter之间的关系和用法。详细介绍了如何在新版本中替代旧过滤器,以及如何合理配置过滤器以避免错误,同时提供了自定义过滤器的实例和配置方法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

struts2中

ActionContextCleanUp,

StrutsPrepareAndExecuteFilter,

StrutsPrepareFilter,StrutsExecuteFilter,

FilterDispatcherd

 

刚看了文档中的描述(说的很清楚了,还是文档好啊):

org.apache.struts2.dispatcher

Class FilterDispatcher

Deprecated. Since Struts 2.1.3, use StrutsPrepareAndExecuteFilter instead or StrutsPrepareFilter and StrutsExecuteFilter if needing using theActionContextCleanUp filter in addition to this one

 

org.apache.struts2.dispatcher 
Class ActionContextCleanUp

Deprecated. Since Struts 2.1.3, use StrutsPrepareFilter and StrutsExecuteFilter to use other Servlet filters that need access to the ActionContext

 

org.apache.struts2.dispatcher.ng.filter 
Class StrutsPrepareAndExecuteFilter

Handles both the preparation and execution phases of the Struts dispatching process. This filter is better to use when you don't have another filter that needs access to action context information, such as Sitemesh.

 

org.apache.struts2.dispatcher.ng.filter 
Class StrutsPrepareFilter

Prepares the request for execution by a later StrutsExecuteFilter filter instance.

 

org.apache.struts2.dispatcher.ng.filter 
Class StrutsExecuteFilter

Executes the discovered request information. This filter requires the StrutsPrepareFilter to have already been executed in the current chain.

---------------------------------------------------------------------------------------------------------------------------------------------------------------------------

FilterDispatcher是struts2.0.x到2.1.2版本的核心过滤器.
StrutsPrepareAndExecuteFilter是自2.1.3开始就替代了FilterDispatcher的.

StrutsPrepareAndExecuteFilter是StrutsPrepareFilter和StrutsExecuteFilter的组合,那什么时候用StrutsPrepareFilter和StrutsExecuteFilter的组合来替代StrutsPrepareAndExecuteFilter呢?下面会讲到。

这样的改革当然是有好处的.
为什么这么说.? 应该知道如果我们自己定义过滤器的话, 是要放在strtus2的过滤器之前的, 如果放在struts2过滤器之后,你自己的过滤器对action的过滤作用就废了,不会有效!除非你是访问jsp/html! 
那我现在有需求, 我必须使用Action的环境,而又想在执行action之前拿filter做一些事, 用FilterDispatcher是做不到的.! 
那么StrutsPrepareAndExecuteFilter可以把他拆分成StrutsPrepareFilter和StrutsExecuteFilter,可以在这两个过滤器之间加上我们自己的过滤器.! 
给你打个比喻, 现在有病人要做手术, 现在struts2要做两件事, 搭病床(环境),执行手术.! 那么打麻药的工作呢.? 不可能要病人站着打吧, 所以必须有病床的环境,打完麻药之后再动手术.! 这个比喻非常形象了.!

 

 

ActionContextCleanUp也是自2.1.3开始由StrutsPrepareFilter和StrutsExecuteFilter的组合替代。

看个例子:

2.1.3之前用sitemesh的web.xml的配置:

<filter>  
   <filter-name>ActionContextCleanUp</filter-name>  
   <filter-class>org.apache.struts2.dispatcher.ActionContextCleanUp</filter-class>  
</filter>  
<filter>  
   <filter-name>sitemesh</filter-name>  
   <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>  
</filter>  
<filter>  
   <filter-name>struts2</filter-name>  
   <filter-class>org.apache.struts2.dispatcher.FilterDispatcher</filter-class>  
</filter>  
<filter-mapping>  
   <filter-name>ActionContextCleanUp</filter-name>  
   <url-pattern>/*</url-pattern>  
</filter-mapping>  
<filter-mapping>  
   <filter-name>sitemesh</filter-name>  
   <url-pattern>/*</url-pattern>  
</filter-mapping>  
<filter-mapping>  
   <filter-name>struts2</filter-name>  
   <url-pattern>/*</url-pattern>  
</filter-mapping>


其中ActionContextCleanUp filter
 SiteMesh filter
 FilterDispatcher
的顺序不能改变。

 ActionContextCleanUp的作用是延长action中属性的生命周期,包括自定义属性,以便在jsp页面中进行访问,让actionContextcleanup过滤器来清除属性,不让action自己清除。

 为了使用WebWork,我们只需要在web.xml配置FilterDispatcher一个过滤器即可,阅读一下FilterDispatcher的JavaDoc和源码,我们可以看到它调用了:

finally{
           ActionContextCleanUp.cleanUp(req);
}

在ActionContextCleanUp中,有这样的代码:

         req.setAttribute(CLEANUP_PRESENT, Boolean.TRUE);

如果FilterDispatcher检测到这个属性,就不会清除ActionContext中的内容了,而由ActionContextCleanUp后续的代码来清除,保证了一系列的Filter访问正确的ActionContext。

 

自Struts2是2.1.3版本开始,死活不得行,总是报错。原来新版本中已经不能再采用这种方式了。
【从struts2.1.3开始ActionContextCleanUp 和 FilterDispatcher过滤器,已经不建议使用了。
   将使用StrutsPrepareFilter和StrutsExecuteFilter拦截器替代】
而从Struts2.1.3开始应该改为以下配置才能集成起来,要不然你的装饰器页面或者被装饰页面

里面将不能使用Struts2的标签。一使用就会报错说什么the Struts Dispatcher not found

<filter>  
   <filter-name>StrutsPrepareFilter</filter-name>  
   <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareFilter</filter-class>  
</filter>  
<filter>  
   <filter-name>sitemesh</filter-name>  
   <filter-class>com.opensymphony.module.sitemesh.filter.PageFilter</filter-class>  
</filter>  
<filter>  
   <filter-name>StrutsExecuteFilter</filter-name>  
   <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsExecuteFilter</filter-class>  
</filter>  
<filter-mapping>  
   <filter-name>StrutsPrepareFilter</filter-name>  
   <url-pattern>/*</url-pattern>  
</filter-mapping>  
<filter-mapping>  
   <filter-name>sitemesh</filter-name>  
   <url-pattern>/*</url-pattern>  
</filter-mapping>  
<filter-mapping>  
   <filter-name>StrutsExecuteFilter</filter-name>  
   <url-pattern>/*</url-pattern>  
</filter-mapping>


StrutsPrepareFilter,sitemesh,StrutsExecuteFilter的顺序配置过滤器,sitemesh夹在中间。

通过以上配置能正确使用。 


java 自定义 Filter 例

使用Filter分为两部分:编写Filter和配置Filter。

1.编写Filter:

   1)实现 javax.servlet.Filter 接口

   2)实现接口中方法。

public void init(FilterConfig config) throws ServletException ,

public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,

FilterChain filterchain) throws IOException, ServletException ,

public void destroy()  三个方法。

 

其中,在doFilter中,filterchain.doFilter(servletRequest, servletResponse);用于继续执行原有请求的活动。

比如你访问了网站index.jsp页面,希望在访问这个页面前对数据库进行查询来初始化这个页面,那么可以在doFilter方法中,编写数据库查询的代码。但是之后一定要写filterchain.doFilter(servletRequest, servletResponse);这样页面才会在执行完数据库查询后跳转至index.jsp。即在filter后继续执行原有的请求。

 

注意:在doFilter的参数中的request和response参数为ServletRequest 和ServletResponse,如需获取session,可将它们转换为HttpServletRequest和HttpServletResponse。再通过request.getSession()获取HttpSession。

 

代码例子:

import java.io.IOException;  
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;  
import javax.servlet.http.HttpSession;  
  
public class UserroleFilter implements Filter{  
      
    public void destroy() {  
          
    }  
      
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse,  
            FilterChain filterchain) throws IOException, ServletException {  
      
        HttpServletResponse response = (HttpServletResponse) servletResponse;  
        HttpServletRequest request = (HttpServletRequest)servletRequest;  
        HttpSession session = request.getSession();  
        //需要过滤的代码         
        filterchain.doFilter(servletRequest, servletResponse);  
    }  
      
    public void init(FilterConfig config) throws ServletException {  
          
    }  
}

2.配置Filter:

在web.xml中配置哪些请求需要使用过滤器进行过滤。

<filter>  
    <filter-name>selfTestFilter</filter-name>  
    <filter-class>com.maggie.filter.SelfTestFilter</filter-class>  
    </filter>  
<filter-mapping>  
    <filter-name>selfTestFilter</filter-name>  
    <url-pattern>/*</url-pattern>  
</filter-mapping>

转载于:https://my.oschina.net/i33/blog/48969

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值