struts配置文件中:<interceptors>
    <interceptor name="authority" class="com.company.framework.common.servlet.AuthorityInterceptor"/>
    <interceptor name="initLov" class="com.company.framework.actions.basic.MultiFuncInterceptor"/>    
        <interceptor-stack name="auctionStack">
            <interceptor-ref name="defaultStack"/>
            <interceptor-ref name="authority"/>
        </interceptor-stack>
        <interceptor-stack name="initLovStack">
            <interceptor-ref name="initLov"/>            
            <interceptor-ref name="defaultStack"/>
        </interceptor-stack>
</interceptors>
<default-interceptor-ref name="auctionStack"/>
<global-results>
<result name="error">/WEB-INF/pages/screen/home/error.vm</result>
<result name="doEditPassword" type="redirect-action">doEditPassword</result>
<result name="login" type="redirect-action">searchListBulletinTabAuthority</result>
</global-results><action class="articleAction" method="detailOperationSubject" name="detailOperationSubject">
<result name="success">/WEB-INF/pages/screen/article/detailOperationSubject.vm</result>
<interceptor-ref name="initLovStack"/>
</action>public class MultiFuncInterceptor extends AbstractInterceptor { private static final long serialVersionUID = 1L; public String intercept(ActionInvocation invocation) throws Exception { BasicAction action = (BasicAction) invocation.getAction();
HttpServletRequest request = (HttpServletRequest) ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_REQUEST);
String uri = request.getRequestURI();
String[] splitStrs = uri.split("/");
String actionUrl = splitStrs[splitStrs.length - 1];
if (actionUrl.startsWith("add") || actionUrl.startsWith("edit")||actionUrl.startsWith("reply")) {
action.initPageLov();
request.setAttribute("fckEditor",action.getFckEditor());
}
String result = invocation.invoke();
return result;
}
}AuthorityInterceptor类中有intercept方法是验证登陆的,没登陆跳转到提示页面,登陆则进入请求action
现在的问题是在没有登陆的情况下直接键入了url,……/detailOperationSubject.action?gid=123
直接看到了页面,没有进入AuthorityInterceptor中进行登陆验证,经过了MultiFuncInterceptor的intercept方法就执行了detailOperationSubject的对应action方法。问:struts中配置了action使用initLovStack,而auctionStack设为了默认拦截器栈,要先进入登陆验证的话怎么做? 我改initLovStack为auctionStack或defaultStack或去掉都不行;其他action使用defaultStack是正常的,都先到了验证登陆的action,求解!?

解决方案 »

  1.   


    <interceptors>
        <interceptor name="authority" class="com.company.framework.common.servlet.AuthorityInterceptor"/>
        <interceptor name="initLov" class="com.company.framework.actions.basic.MultiFuncInterceptor"/>    
            <interceptor-stack name="auctionStack">
                <interceptor-ref name="defaultStack"/>
                <interceptor-ref name="authority"/>
            </interceptor-stack>
            <interceptor-stack name="initLovStack">
                <interceptor-ref name="initLov"/>            
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
    </interceptors>
    <default-interceptor-ref name="auctionStack"/>
    <global-results>
        <result name="error">/WEB-INF/pages/screen/home/error.vm</result>
        <result name="doEditPassword" type="redirect-action">doEditPassword</result>
        <result name="login" type="redirect-action">searchListBulletinTabAuthority</result>
    </global-results><action class="articleAction" method="detailOperationSubject" name="detailOperationSubject">
    <result name="success">/WEB-INF/pages/screen/article/detailOperationSubject.vm</result>
    <interceptor-ref name="initLovStack"/>//这里配置了initLovStack拦截器,它会忽略你配置的默认
                                              //拦截器<default-interceptor-ref name="auctionStack"/>
    //所以你要显示的加上这个拦截器
     <interceptor-ref name="authority"/>
    这样就可以验证了,最好加在<interceptor-ref name="initLovStack"/>上面去。
    </action>
      

  2.   

            <interceptor-stack name="auctionStack">
                <interceptor-ref name="authority"/>
                <interceptor-ref name="defaultStack"/>

            </interceptor-stack>
      

  3.   


    恩,谢谢,可行;另外问下关于struts配置文件中头上那段定义:    <interceptor name="authority" class="com.hundsun.framework.common.servlet.AuthorityInterceptor"/>
        <interceptor name="initLov" class="com.hundsun.framework.actions.basic.MultiFuncInterceptor"/>    
            <interceptor-stack name="auctionStack">
                <interceptor-ref name="defaultStack"/>
                <interceptor-ref name="authority"/>
            </interceptor-stack>
            <interceptor-stack name="initLovStack">
                <interceptor-ref name="initLov"/>            
                <interceptor-ref name="defaultStack"/>
            </interceptor-stack>
    </interceptors>
    <default-interceptor-ref name="auctionStack"/>  在下面的action中配置
    <interceptor-ref name="auctionStack"/>,
    <interceptor-ref name="defaultStack"/>,
    <interceptor-ref name="initLovStack"/> 的区别?
    是不是如果是auctionStack那么执行了authority和defaultStack
    如果是initLovStack那么执行了initLov和defaultStack
    如果是defaultStack那么执行了??
    这个defaultStack是否是指<default-interceptor-ref name="auctionStack"/>自定义的默认?还是struts2自身默认的defaultStack?
      

  4.   

    1.struts2默认拦截器是defaultStack。
    2.<interceptor-ref />元素作用:是引用拦截器。 
    3.<default-interceptor-ref />元素作用:是定义默认拦截器。一个package下只能有一个默认拦截器。package中没有定义默认拦截器,就是用defaultStack
      

  5.   

    咦,1,2楼是同个人?怎么回复1楼是2楼您老来回答捏- -`那么自定义了默认拦截器auctionStack后使用defaultStack,对应的是自定义的那个还是struts2自身默认拦截器呢?我试了一下好像是struts2默认拦截器?就是说自定义默认拦截器后,使用时是以自定义那个名字auctionStack而不是“defaultStack”为准的......