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,求解!?
<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,求解!?
<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>
<interceptor-ref name="authority"/>
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
恩,谢谢,可行;另外问下关于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?
2.<interceptor-ref />元素作用:是引用拦截器。
3.<default-interceptor-ref />元素作用:是定义默认拦截器。一个package下只能有一个默认拦截器。package中没有定义默认拦截器,就是用defaultStack