一个会话验证功能, 如果没有用户登录或者在线超时(10分钟)就注销.
下面是这个interceptor内容
public class AuthorizationInterceptor extends AbstractInterceptor { private static final long serialVersionUID = 4502697384032660168L;
/**
 * 超时时间,单位millisecond,默认10分钟。
 */
private static final long TIME_OUT_INTERVAL = 600000L;
@Override
public String intercept(ActionInvocation ai) throws Exception {
Map session = ai.getInvocationContext().getSession();
//判断是否登录。
if(session.get("userId") == null){
return Action.LOGIN;
}else{
//判断是否超时
long startTime = (Long)session.get("startTime");
long interval = System.currentTimeMillis() - startTime;
if(interval > TIME_OUT_INTERVAL){
session.clear();
return Action.LOGIN;
}else{
//没有超时,重新设置计时开始时间
session.put("startTime", System.currentTimeMillis());
//调用Action
return ai.invoke();
}
}

}}
而Action内容是:
public class UserSubsystems extends ActionSupport implements SessionAware { private static final long serialVersionUID = -8136997656959262253L; private SystemService systemService;
@SuppressWarnings("unchecked")
private Map session;
private List<Subsystem> subsystems;
public List<Subsystem> getSubsystems() {
Long userId = (Long)session.get("userId");
return this.systemService.getSubsystems(userId);
}
@SuppressWarnings("unchecked")
public void setSession(Map session) {
this.session = session;
} public void setSystemService(SystemService systemService) {
this.systemService = systemService;
}}
我的主界面JSP中需要使用该Action中的subsystems属性, 但是使用interceptor后就出问题了.
希望大家帮忙看看, 万分感激.

解决方案 »

  1.   


    当使用者没有给Action注册interceptor的时候Struts2默认使用自己的拦截器栈实现很多功能当你给Action注册interceptor后,默认拦截器的功能被取消了你需要在Action里再次显式的定义使用默认拦截器栈我想应该是这个问题
      

  2.   

    struts.xml<package name="cn.edu.software.nju.crm.action" extends="struts-default">
    <interceptors>
    <interceptor name="authorization" class="authorizationInterceptor"></interceptor>
    <interceptor name="log" class="logInterceptor"></interceptor>
    <interceptor-stack name="authorizationAndLog">
    <interceptor-ref name="authorization"></interceptor-ref>
    <interceptor-ref name="log"></interceptor-ref>
    </interceptor-stack>
    </interceptors>
            <action name="UserSubsystems" class="userSubsystemsAction">
             <interceptor-ref name="authorization"></interceptor-ref>
             <result>/crm/UserSubsystems.jsp</result>
            </action>
            <!-- 其他action配置-->由于采用了spring + struts, 所以上面配置文件中的authorizationInterceptor和userSubsystemsAction的在spring的bean工厂里声明了
    在spring的applicationContext.xml中<bean id="authorizationInterceptor"
    class="cn.edu.software.nju.crm.interceptor.AuthorizationInterceptor">
    </bean>
    <bean id="userSubsystemsAction"
    class="cn.edu.software.nju.crm.action.UserSubsystems"
    scope="prototype">
    <property name="systemService" ref="systemService"/>
    </bean>
    <!-- 其他bean-->还需要什么么? 先谢谢tzb08了, :-)
      

  3.   

    十分感谢clarck_913 的帮助, 问题已经解决了. 的确是因为默认拦截器被取消了, 只要在action中添加defaultStack拦截器栈就可以了.
    另: defaultStack和我自己定义的interceptor的顺序上有什么要求么? 我自己试了一下, 好像没什么区别.
    要是没什么其他问题, 我今天就结贴, 呵呵. 再次感谢上面的朋友
      

  4.   

    恩  是需要defaultStack拦截器栈的  至于顺序,我这边defaultStack都在前面,区别?等有问题了再说吧  哈哈
      

  5.   


    关于拦截器的顺序我还没有试过我想如果我们自己定义的拦截器和Struts2提供的拦截器之间没有耦合的话顺序应该不会造成问题