如果多个action共用拦截器,那不是要在每个action都要写<interceptor-ref name="MyInterceptor"/>
有没有简单的方法

解决方案 »

  1.   

    当然有简单的方法了.!
    自己定义<package name="myPkg" abstract="true" extends="struts-default"></package>
    在这个包下面定义拦截器, 这个包下面定义拦截器栈的引用, 引用defaultStack和你自己定义的拦截器!
    然后你需要用这个拦截器的包都继承这个包就好了.!
    但是这样会有个问题. 你一个包下面不是所有的action都要用到这个拦截器..!或者你把要用到这个拦截器的action分在一个包下面!
    这样做有利有弊.! 权衡吧.!
      

  2.   

    没有 定义在package下会提示xml顺序错误
      

  3.   

    ?什么定义在package下会出错? 拦截器引用?
    package下 <interceptors>这里面定义拦截器引用</interceptors>
      

  4.   

    <package name="struts-common" extends="struts-global">

    <interceptors>
    <interceptor name="MyInterceptor" class="interceptor.MyInterceptor"></interceptor>
    <interceptor-ref name="MyInterceptor"/>这个放这里出错的
    </interceptors>

    <action name="a">
    <result type="freeer">/WEB-INF/ftl/a.ftl</result>
    </action> <action name="login" class="s2.Login">
    <interceptor-ref name="MyInterceptor"/>
    <interceptor-ref name="defaultStack"></interceptor-ref> 
    <result type="freeer">/WEB-INF/ftl/b.ftl</result>
    </action>

    </package>
      

  5.   

    <interceptor-ref name="MyInterceptor"/>这个放这里出错的这里需要把defaultStack加上吧
      

  6.   

    <!-- 拦截器栈 -->
    <package name="xxx-default" extends="struts-default">
    <interceptors>
    <interceptor name="loginAuth"
    class="XXX.LoginAuthInterceptor" />
    <interceptor-stack name="completeStackWithLoginAuth">
    <interceptor-ref name="loginAuth" />
    <interceptor-ref name="defaultStack" />
    </interceptor-stack>
    </interceptors>
    <default-interceptor-ref name="completeStackWithLoginAuth" />
    <global-results>
    <result name="login">/userLogin/error.jsp</result>
    <result name="expire">/modifyPW/modifyPW.jsp</result>
    <result name="forbid">/userLogin/forbid.jsp</result>
    </global-results>
    </package>@SuppressWarnings("serial")
    public class LoginAuthInterceptor extends AbstractInterceptor {
    @Override
    public String intercept(ActionInvocation actionInvocation) throws Exception {
    // 获得会话中的用户身份字段
    Map session = actionInvocation.getInvocationContext().getSession();
    String user = (String) session.get(ISysParam.SESSION_USER);
    if (null == user) {
    return Action.LOGIN;
    } else {
    StringBuffer invokeMtd = new StringBuffer(actionInvocation
    .getProxy().getNamespace());
    invokeMtd.append("/"
    + actionInvocation.getInvocationContext().getName());
    String role = (String) session.get(ISysParam.USER_ROLE);

    //测试代码  如果是用户名是admin 则不进行权限判断
    // if(user.equals(ISysParam.ROLETYPE_ADMIN)){
    // return actionInvocation.invoke();
    // }

    /*
     * 得到该所能操作的名称空间 if(可以访问当前的名称空间){ 跳出拦截器 else{ 转到没有权限的页面 } }
     */
    // if (role.contains(invokeMtd.toString())) {
    // return actionInvocation.invoke();
    // } else {
    // return "forbid";
    // } // if (!user.getUserName().equals(ISysParam.ROLETYPE_ADMIN)) {
    // // 对非ADMIN用户,检查模块访问权限
    // if (!chkPrivilege()) {
    // log.debug(user.getUserName() + ":" +ISysParam.OPER_CANCEL);
    // return FORBID;
    // }
    // }
    // return actionInvocation.invoke();
    // }
     return actionInvocation.invoke();
    } }
    }<package name="xxx" namespace="/xxx"
    extends="xxx-default">
    <action name="*" method="{1}" class="XXXAction">
    <result name="input">{1}.jsp</result>
    <result name="error">{1}.jsp</result>
    <result name="success">{1}.jsp</result>
    </action>
    </package>
    <package name="xxx2" namespace="/xxx2"
    extends="xxx-default">
    <action name="*" method="{1}" class="XXX2Action">
    <result name="input">{1}.jsp</result>
    <result name="error">{1}.jsp</result>
    <result name="success">{1}.jsp</result>
    </action>
    </package>
    不知道这样把所有的代码都贴出来了。还能看得懂么?