在实际开发中,一个常见的功能要求是:有很多操作都需要登录后才能操作,如果操作的时候还没有登录,那么通常情况下会要求跳转回到登录页面。
1)如何实现这样的功能呢?
在具体实现之前,先来考虑几个问题:
(1)这个功能应该在哪里实现?
要实现登录检查的功能,很明显是在Action运行之前,就要判断用户是否登陆了,判断方式是看session里面是否有相关信息,如果有,则继续操作;如果没有,则要跳转到预先制定好的登录页面。简单点说,登录检查应该写在“invocation.invoke();”语句之前。
(2)是否需要参数?
要判断是否需要参数,其实就是判断这个拦截器有没有什么可变的量,可以把这些可变量从程序中分离出来,通过struts.xml来配置。经过分析,可以抽出两个参数:
- 代表登陆页面的Result
- 判断session中哪个attribute,也就是attribute的名称
(3)如何引用呢?
现在的情况是只有部分Action需要登陆录检查,另外一些Action不需要,这就需要权衡了。对于大多数Action都要进行登录检查的包,可以在包的默认拦截器引用上设置登录检查,而对于少数不需要登陆检查的Action,可以让它们直接引用默认的defaultStack拦截器栈。
2)实现满足要求的拦截器,示例代码如下:
package cn.javass.hello.struts2impl.action;import java.util.Map;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.Interceptor; public class SessionCheckInterceptor implements Interceptor{ //设置参数 private String sessionAttribute; private String reloginResult; public void setSessionAttribute(String sessionAttribute) { this.sessionAttribute = sessionAttribute; } public void setReloginResult(String reloginResult) { this.reloginResult = reloginResult; } public void destroy() { } public void init() { } public String intercept(ActionInvocation invocation) throws Exception { //读取Session Map
}
在intercept方法中,先读取session中指定的attribute,具体读取哪个attribute由参数从外界传进来,然后判断Session中是否存在这个attribute,如果有则继续执行后续的拦截器、Action和Result,如果没有则跳转到指定的Result所对应的页面,具体跳转到哪个Result也是由参数从外界传进来的。
3)拦截器配置,配置示例如下:
<package name&#61;"helloworld" extends&#61;"struts-default"> <interceptors> <interceptor name&#61;"testInteceptor" class&#61;"cn.javass.hello.struts2impl.action.MyInterceptor"/> <interceptor name&#61;"myLogger" class&#61;"cn.javass.hello.struts2impl.action.LoggerInterceptor"/><interceptor name&#61;"loginChecker" class&#61;"cn.javass.hello.struts2impl.action.SessionCheckInterceptor"/> <interceptor-stack name&#61;"myStack"> <interceptor-ref name&#61;"timer"/> <interceptor-ref name&#61;"testInteceptor"/><interceptor-ref name&#61;"myLogger"/> <interceptor-ref name&#61;"loginChecker"> <param name&#61;"sessionAttribute">login_userparam> <param name&#61;"reloginResult">loginparam> interceptor-ref> <interceptor-ref name&#61;"defaultStack"/> interceptor-stack> interceptors> <default-interceptor-ref name&#61;"myStack"/> <global-results> <result name&#61;"math-exception">/${folder}/error.jspresult> <result name&#61;"login">/s2impl/login.jspresult> global-results> <global-exception-mappings> <exception-mapping result&#61;"math-exception" exception&#61;"java.lang.ArithmeticException"/> <exception-mapping result&#61;"math-exception" exception&#61;"java.lang.Exception"/> global-exception-mappings> <action name&#61;"helloworldAction" class&#61;"cn.javass.hello.struts2impl.action.HelloWorldAction"> <result name&#61;"toWelcome">/${folder}/welcome.jspresult> action> package>
参考资料&#xff1a;http://www.iteye.com/topic/1124526