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文件,上面红色的部门我在每一个配置文件中都写了一次,有什么办法可以只写一次再调用了。
<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文件,上面红色的部门我在每一个配置文件中都写了一次,有什么办法可以只写一次再调用了。
红色没有显示,[color=#FF0000] 代表红色。。
<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时,自然会知道到全局结果集里去找相对应的页面。
第二个:
你可以定义一个package,这个package的abstract属性设置为true,里面只定义拦截器和拦截器栈.!
然后以后要你的包去继承这个包就可以达到你想要的一处定义多处引用的效果
在package包中作如下配置
<interceptors>
<interceptor-stack name="myDefaultStack">
<!-- 放在系统缺省之前还是之后,自己决定 -->
<interceptor-ref name="myInterceptor"/>
<!-- 引用系统拦截器栈 -->
<interceptor-ref name="defaultStack"/>
</interceptor-stack>
</interceptors>
<default-interceptor-ref name="myDefaultStack"/>就可以使package中所有的action共享上述拦截动作。
他的mydefault包含了defaultStack
<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>
把这个设置为默认的拦截器之后,把所有的都给拦截了。。不加拦截器都不起作用。
其实全局的拦截器引用 你最好把要用到这些拦截器的action全部扔在一个包下会比较方便.!
比如说 要做权限的action,全扔一个包下, 当然这样分模块就很模糊了.! 各有利弊, LZ自己权衡
一个英文的,一个翻译的:
http://apicode.gicp.net/class.do?api=selectByfatherIndex&father=255
http://apicodecn.gicp.net/class.do?api=selectByfatherIndex&father=255
{
return actionInvocation.invoke();
}
去掉
知道了。谢了。。
一直都搞不清楚
if (null == userName )
{
str=action.LOGIN;
}
他跳不到主页。。调试了很久都没有找到原因。
我做的是一个树型结构,树型是用jquery 动态加载进来的,有两级,如果我点本级就不会跳到主页。
如果我点他的下一级,他会跳到主页。if (null == userName )
{
str=action.LOGIN;}
这段代码有效。。
真搞不明白,点本级会没有效果出来。。
{
str=action.LOGIN;
}传过来的值也有可能是 ""