Struts2 过滤器和拦截器执行的顺序

nojave 2009-11-01 08:48:46
在web.xml ,定义首页位置:
	<welcome-file-list>
<welcome-file>index.jsp</welcome-file>
</welcome-file-list>

并配置了一个filter,用于过滤对jsp的直接访问.

<filter>
<filter-name>indexfilter</filter-name>
<filter-class>com.prodinfo.filter.IndexFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>indexfilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>


......
public class IndexFilter implements Filter {
......
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {

HttpServletRequest re = (HttpServletRequest) request;
HttpSession session = re.getSession();
//redirect to action

request.getRequestDispatcher("loadindex.action?id=xxx").forward(
request, response);
System.out.println("i am filter");
}
......
}



struts.xml中配置了interceptor,拦截用户的请求,在action执行之前,load页面信息,然后继续.

<interceptors>
<interceptor name="LoadHeaderFooter"
class="loadHeaderFooter">
</interceptor>
<interceptor-stack name="InterceptorStack">
<interceptor-ref name="defaultStack" />
<interceptor-ref name="LoadHeaderFooter" />
</interceptor-stack>
</interceptors>
<action name="loadindex" class="companyInfoAction"
method="loadCompanyInfo">
<result name="success">/index.jsp</result>
<interceptor-ref name="LoadHeaderFooter"></interceptor-ref>
</action>



......
public String intercept(ActionInvocation invocation) throws Exception {
//System.out.println("Before Action");
//get header & footer infomation
List result = ci.getHeaderFooter("xxx");
......
System.out.println("i am interceptor");

final String res = invocation.invoke();
//System.out.println("After Action");
return res;
}
......

我理解的执行顺序是(<welcome-file-list>)index.jsp->(filter)"loadindex.action?id=xxx"->(interceptor)"loadHeaderFooter"->(Action)"loadindex"->(jsp)index.jsp
可是现在执行的顺序是先interceptor再filter,程序运行打印结果是:
i am interceptor
loading company info of null
i am filter

去掉了interceptor,发现还是先执行的action再进的filter. Struts2的执行顺序一定是先action再filter? 已经把FilterDispatcher放到web.xml最上面了.
...全文
468 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
nojave 2009-11-02
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 woming66 的回复:]
<filter>
        <filter-name>indexfilter </filter-name>
        <filter-class>com.prodinfo.filter.IndexFilter </filter-class>
    </filter>
    <filter-mapping>
        <filter-name>indexfilter </filter-name>
        <url-pattern>/index.jsp </url-pattern>
    </filter-mapping>

你肯定配置在FilterDispatcher的下边了,如果你把indexfilter配置在FilterDispatcher上面,结果就不一样了
[/Quote]

谢谢回答, 这种方法试过了(其实一开始就是这样的,后来才改成FilterDispatcher在最上面), 可是顺序还是不对,先interceptor后filter. 一摸一样.
nojave 2009-11-02
  • 打赏
  • 举报
回复
问题解决, struts2 的执行顺序是 <welcome-file-list> => filter => interceptor => action => jsp => filter
chenxiaomingit 2009-11-02
  • 打赏
  • 举报
回复
你把<url-pattern>/index.jsp </url-pattern> 换成<url-pattern>/* </url-pattern>
看看顺序有没有变化哈
jinancf 2009-11-01
  • 打赏
  • 举报
回复
顺序应该有关系的.
javaors 2009-11-01
  • 打赏
  • 举报
回复
这个跟拦截器和过滤器放的前后顺序有关吗,貌似有可能
CoLinM 2009-11-01
  • 打赏
  • 举报
回复
大体执行是这样的:
(filter in)->(interceptor in)->(Action)-> (interceptor out)->(jsp)index.jsp ->(filter out)
woming66 2009-11-01
  • 打赏
  • 举报
回复
<filter>
<filter-name>indexfilter</filter-name>
<filter-class>com.prodinfo.filter.IndexFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>indexfilter</filter-name>
<url-pattern>/index.jsp</url-pattern>
</filter-mapping>

你肯定配置在FilterDispatcher的下边了,如果你把indexfilter配置在FilterDispatcher上面,结果就不一样了

81,092

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧