struts-menu.xml 配置文件 自定义一个拦截器
<package name="menu" namespace="/" extends="struts-default">
     
     <interceptors>
       <interceptor name="sessionOut" class="com.aps.comm.filter.SessionOut"></interceptor>
       
       <interceptor-stack name="mydefault">
       <interceptor-ref name="sessionOut"></interceptor-ref>
        <interceptor-ref name="defaultStack"></interceptor-ref>
       </interceptor-stack>
     </interceptors>
      <global-results>
    
     <result name="login">/index.jsp</result>
    
    </global-results>
     
   <action name="menuOper" class="menuAction">
        <result name="findMenuSuc">/comm/permission/addPermission.jsp</result>
        
        <interceptor-ref name="mydefault"></interceptor-ref>   </action>
   </package>权限过滤拦截器,当userName 为NULL 返回主页。public class SessionOut  extends AbstractInterceptor{
Map user;


public String intercept(ActionInvocation actionInvocation) throws Exception {

HttpServletRequest request=ServletActionContext.getRequest();


     Action action=(Action)actionInvocation.getAction();

     Map userSession=ServletActionContext.getContext().getSession();
      //  actionInvocation.getInvocationContext().getSession();
 //  this.addOperationlog(path);
    
     String userName=(String)userSession.get("user");
          String str="";
    
     if (action instanceof UserLogin)
     {
     return actionInvocation.invoke();
    
     }
    
    
     if (null == userName )
     {
     str=action.LOGIN;
    
     }
     else 
     {
    
     return actionInvocation.invoke();
     }
     return str;


}问题 :1 :当userName 为NULL时 不返回主页,这是什么原因了 
       2 :我可以把上面的拦截器定义成为公共的吗?我有许多的.xml文件,上面红色的部门我在每一个配置文件中都写了一次,有什么办法可以只写一次再调用了。

解决方案 »

  1.   


      红色没有显示,[color=#FF0000] 代表红色。。
      

  2.   

    都定义了全局RESULT,把ACTION里的拦截器删了
      

  3.   

    嗯。LZ还没搞懂拦截器是起什么作用的。
    <action name="menuOper" class="menuAction">
            <result name="findMenuSuc">/comm/permission/addPermission.jsp</result>       
    </action>
    这个就可以看成是一个拦截器。当方法返回findMenuSuc时,就会跳到哪个页面。
    只要能实现效果就行。
    <global-results>  
         <result name="login">/index.jsp</result>  
    </global-results>
    你这个地方定义了全局结果集。那么如果action对应的返回结果 !=findMenuSuc时,自然会知道到全局结果集里去找相对应的页面。
      

  4.   

    第一个问题建议你自己debug. 不做过多说明了.!
    第二个:
    你可以定义一个package,这个package的abstract属性设置为true,里面只定义拦截器和拦截器栈.!
    然后以后要你的包去继承这个包就可以达到你想要的一处定义多处引用的效果
      

  5.   


    在package包中作如下配置
    <interceptors>
    <interceptor-stack name="myDefaultStack">
    <!-- 放在系统缺省之前还是之后,自己决定 -->
    <interceptor-ref name="myInterceptor"/>
    <!-- 引用系统拦截器栈 -->
    <interceptor-ref name="defaultStack"/>
    </interceptor-stack>
    </interceptors>
    <default-interceptor-ref name="myDefaultStack"/>就可以使package中所有的action共享上述拦截动作。
      

  6.   

    第一个问题:LZ这样配置拦截器,会覆盖系统缺省的拦截器栈定义,因此系统缺省的拦截器不能动作,导致不能返回。需要在action配置中增加<interceptor-ref name="defaultStack"/>拦截器配置。或者按照上个恢复配置成缺省拦击器栈处理。
      

  7.   

    楼主已经添加了拦截器栈了。
    他的mydefault包含了defaultStack
      

  8.   

     一个全局的拦截器
          <package name="colavia" extends="struts-default" abstract="true">
          <interceptors>
           <interceptor name="sessionOut" class="com.aps.comm.filter.SessionOut"></interceptor>
           
           <interceptor-stack name="mydefault">
            <interceptor-ref name="defaultStack"></interceptor-ref>
           <interceptor-ref name="sessionOut">
                  <param name="excludeMethods">validate</param>
           </interceptor-ref>
           </interceptor-stack>
          </interceptors>
         
         <default-interceptor-ref name="mydefault"></default-interceptor-ref>      
         
          <global-results>
        
         <result name="login">/index.jsp</result>
        
        </global-results>
      </package>
    <include file="struts/comm/struts-user.xml" />
     其他的配置文件 调用引用这个拦截器
    struts-user.xml 文件 <package name="user" namespace="/" extends="colavia">
    <action name="userOper" class="userAction">
         <result name="findUserSuc">/comm/user/user.jsp</result>
     </action>
         </package>
      
      这个全局的拦截器为什么没有起作用啊!
      <default-interceptor-ref name="mydefault"></default-interceptor-ref>
      把这个设置为默认的拦截器之后,把所有的都给拦截了。。不加拦截器都不起作用。
       
      
      

  9.   

    是的, 就是只要是你的package继承了那个有默认拦截器引用的包,那么你这个包下面的action全部会被这个默认拦截器栈拦截,  如果你想定义个别的, 就为action配置.!
    其实全局的拦截器引用 你最好把要用到这些拦截器的action全部扔在一个包下会比较方便.!
    比如说  要做权限的action,全扔一个包下, 当然这样分模块就很模糊了.! 各有利弊, LZ自己权衡
      

  10.   

    这里API和源码例子
    一个英文的,一个翻译的:
    http://apicode.gicp.net/class.do?api=selectByfatherIndex&father=255
    http://apicodecn.gicp.net/class.do?api=selectByfatherIndex&father=255
      

  11.   

     if (action instanceof UserLogin)
            {
                return actionInvocation.invoke();
                
            }
    去掉
      

  12.   


     知道了。谢了。。
      一直都搞不清楚
     if (null == userName )
            {
                str=action.LOGIN;
                
            }
    他跳不到主页。。调试了很久都没有找到原因。
      

  13.   

      我来说明一下情况:
     我做的是一个树型结构,树型是用jquery 动态加载进来的,有两级,如果我点本级就不会跳到主页。
      如果我点他的下一级,他会跳到主页。if (null == userName )
    {
    str=action.LOGIN;}
     这段代码有效。。
       真搞不明白,点本级会没有效果出来。。
      
      
      

  14.   

    第2个问题<default-interceptor-ref name="mydefault"></default-interceptor-ref>
      

  15.   

     if (null == userName || "".equals(userName) )
            {
                str=action.LOGIN;
                
            }传过来的值也有可能是   ""