Struts 2 Session TimeOut

时间:2012-01-18 20:36:01

标签: java struts2

我是struts的新手。我正在使用Struts2。任何人都可以告诉我如何在会话超时后自动重定向jsp页面。

2 个答案:

答案 0 :(得分:20)

您需要创建一种方法来检查会话是否已过期,因为浏览器无法确定会话是否已过期。 您需要执行以下步骤

在web.xml中定义会话超时,如。

<session-config>  
        <session-timeout>  
            30  
        </session-timeout>  
    </session-config>

围绕Struts2的一个简单方法是创建Interceptor并检查会话有效性,如果会话已过期,您可以将用户重定向回指定的jsp页面。这里是示例拦截器的快速视图

拦截

public class SessionInterceptor extends AbstractInterceptor {
  @Override
  public String intercept(ActionInvocation invocation) throws Exception {
      Map<String,Object> session = invocation.getInvocationContext().getSession();
      if(session.isEmpty())
          return "session"; // session is empty/expired
      return invocation.invoke();
  }

最后你需要告诉Stuts2你想通过在struts.xml文件中声明它来使用这个拦截器

struts.xml中

<interceptor name="session" class="myapp.interceptor.SessionInterceptor" />
<interceptor-stack name="sessionExpirayStack">
    <interceptor-ref name="defaultStack"/>
    <interceptor-ref name="session"/>
   </interceptor-stack>

现在你需要在你的行动中使用这个堆栈声明

动作配置

<action name="myAction" class="myClass">
    <interceptor-ref name="sessionExpirayStack" />
    <result name="success">success.jsp</result>
    <result name="session">sessionexpired.jsp</result>
  </action>

替代方案,您可以为*session*声明全局结果,以便将全局重定向到同一页面。

对于Struts2之外的方式,您可以选择创建Servlet filter并将会话检查代码放在过滤器中。您需要实现javax.servlet.Filter接口

会话检查过滤器

public final CheckSession impliments Filter{
    private FilterConfig filterConfig = null;
    public void init(FilterConfig filterConfig) throws ServletException {
        this.filterConfig = filterConfig;
    }
    public void destroy() {
        this.filterConfig = null;
    }
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain  
            chain) {

        // Put your logic here to check session
    }
}

对于自动重定向,您必须通过某种Ajax调用继续检查会话

答案 1 :(得分:4)

自动重定向,您需要发出Ajax请求,看看会话是否仍包含已知值。如果会话超时,容器将使其无效,并且currentUser对象之类的内容将不再处于会话中。

如果该对象不再存在,您的Ajax调用将返回标志,重定向URL等,并且Ajax success方法将检查您是否发出信号需要重定向,并设置窗口定位到常量,或者由Ajax调用返回的重定向URL值。