【发布时间】:2012-02-13 13:53:09
【问题描述】:
我是新来的struts。我正在使用 Struts2。请任何人告诉我如何在会话超时后自动重定向jsp页面。
【问题讨论】:
我是新来的struts。我正在使用 Struts2。请任何人告诉我如何在会话超时后自动重定向jsp页面。
【问题讨论】:
好吧,您需要创建一种方法来检查会话是否已过期,因为浏览器无法确定会话是否已过期。 您需要有以下步骤
在您的 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();
}
最后你需要通过在struts.xml文件中声明来告诉Stuts2你想使用这个拦截器
<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 调用继续检查会话
【讨论】:
要自动 重定向,您需要发出 Ajax 请求以查看会话是否仍包含已知值。如果会话超时,它会被容器失效,类似currentUser 的对象将不再在会话中。
如果该对象不再存在,您的 Ajax 调用将返回标志、重定向 URL 等,并且 Ajax success 方法将检查您是否需要重定向它们,并将窗口位置设置为一个常量,或者指向 Ajax 调用返回的重定向 URL 值。
【讨论】: