问题域::登录用户长时间没有与服务器交互,再次操作提示:超时,请重新登录。

解决思路::session超时时间设置、struts拦截器拦截交互操作


具体实现

使用web.xml配置进行session超时时间设置

<session-config>

<session-timeout>10</session-timeout>

</session-config>


struts拦截器代码实现

public class SessionIterceptor extends AbstractInterceptor {
    @Override
    public String intercept(ActionInvocation actionInvocation) throws Exception {
        ActionContext ctx = ActionContext.getContext();
        Map session = ctx.getSession();
        Action action = null;
        // 之所以写这步是因为:有些action继承ActionSupport、有些Action继承BaseAction
        if (actionInvocation.getAction() instanceof Action)
            action = (Action) actionInvocation.getAction();
        if (action instanceof LoginAction) {
            return actionInvocation.invoke();
        }
        Operator operator = (Operator) session.get("OPERATOR_SESSION");
        if (operator == null) {
            HttpServletRequest request = (HttpServletRequest) actionInvocation
                    .getInvocationContext().get(
                            ServletActionContext.HTTP_REQUEST);
            request.setAttribute("timeoutMSG", "超时,请重新登录");
            return "timeoutSession";
        } else {
            return actionInvocation.invoke();
        }
    }
}

页面捕获传递的提示信息

<%@taglib prefix="s" uri="/struts-tags"%>

<s:property value="#attr.timeoutMSG" /><br/>


struts.xml中的配置

<package name="myInterceptor" extends="json-default">
        <interceptors>
            <!-- 超时拦截器 -->
            <interceptor name="timeoutSession"
                class="com.sunyard.ices.web.interceptors.SessionIterceptor"></interceptor>
            <!-- 拦截器栈 -->
            <interceptor-stack name="timeoutStack">
                <interceptor-ref name="timeoutSession"></interceptor-ref>
                <interceptor-ref name="defaultStack"></interceptor-ref>
            </interceptor-stack>
        </interceptors>
        <!-- 配置默认的拦截器 -->
        <default-interceptor-ref name="timeoutStack" />
        <!-- 全局的非登录操作拦截重定向到登录的页面 -->
        <global-results>
            <result name="timeoutSession">/login.jsp</result>
        </global-results>
    </package>

以为使用了大量include,所以专门配置一个package。在其他struts配置文件中就只需要继承此package就可使用了。

<package name="operatora" extends="myInterceptor">



至此,问题已解决。初学者,第一次写博文,为了加强记忆,也方便初学者。