我是struts的新手。我正在使用Struts2。任何人都可以告诉我如何在会话超时后自动重定向jsp页面。
答案 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文件中声明它来使用这个拦截器
<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值。