我一直在寻找有关该主题的许多文章,但找不到适合我的解决方案。
我正在将Java EE 6与JSF 2.0结合使用(在JBoss AS 7.1上部署)
在我的web.xml
我有:
<session-config>
<session-timeout>1</session-timeout>
</session-config>
并且我 希望在会话自动超时时将用户重定向到登录页面。
我尝试过的
方法1:使用过滤器
我尝试了以下过滤器:
@WebFilter()
public class TimeOutFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
ServletException {
System.out.println("filter called");
final HttpServletRequest req = (HttpServletRequest) request;
final HttpSession session = req.getSession(false);
if (session != null && !session.isNew()) {
chain.doFilter(request, response);
} else {
System.out.println("Has timed out");
req.getRequestDispatcher("/logon.xthml").forward(request, response);
}
}
@Override
public void destroy() {
}
}
在web.xml
我尝试过的
<filter-mapping>
<filter-name>TimeOutFilter</filter-name>
<url-pattern>*.xhtml</url-pattern>
</filter-mapping>
和
<filter-mapping>
<filter-name>TimeOutFilter</filter-name>
<servlet-name>Faces Servlet</servlet-name>
</filter-mapping>
过滤器在每次请求时都会被调用(在控制台中记录“被调用的适配器”)。 但是,会话超时时不会调用它。
方法2:HttpSessionLister
我尝试使用HttpSessionListerner
。该方法称为具有以下签名:
public void sessionDestroyed(HttpSessionEvent se) {
}
我无法重定向到特定页面。当我想重定向用户时,通常使用NavigationHandler
from中的,FacesContext
但是在这种情况下,没有FacesContext
(FacesContext.getCurrentInstance()
return
null
)。
根据这篇文章,HttpListener不能重定向用户,因为它不是请求的一部分。
题
解决此问题的最佳方法是什么?如何使上述两种方法之一起作用?
只要客户端未发送HTTP请求,您就无法发送HTTP响应。就那么简单。这就是HTTP的工作方式。如果任何网站能够在客户端未请求的情况下毫不客气地推送HTTP响应,则Internet看起来将大为不同。
基于一个JavaScript心跳基于类似的回答客户端的键盘/鼠标活动在这里,或间refresh
头部等作为回答在这里),如果你已经基本上是一个单页web应用(因此,你不能有效使用会话范围将是解决办法(但视图范围),但是如果您在同一会话中的多个标签/窗口中打开了该页面,则效果将不佳。
从理论上讲,Websocket是将某些内容推送到客户端的正确解决方案,但这又需要一个活动会话。鸡鸡蛋问题。而且,它在当前仍相对广泛使用的旧版浏览器中将无法正常工作,因此当前仅应将其用于渐进式增强。
我使用的是和和。一切都很好,但是当会话超时的时候,我会得到以下错误”,因为我已经在布局的main.gsp文件中调用了session变量。现在,我希望在每次会话超时后重定向到登录页面,并且不显示错误页面。要在会话超时后重定向,我已经在文件中这样做了 但是有这么多页,所以很难写每一页。还有其他的方法做这件事吗?请帮忙。
我在global.asax中尝试了以下代码,但不起作用,并导致Application_Error(“响应在此上下文中不可用。”)。
问题内容: 要在网站上显示某个功能,该功能会在3秒左右的时间内将您重定向到该网站,我该怎么办? 问题答案:
我想通过我的代码将用户重定向到会话超时页。我可以在过滤器中写什么逻辑,检查会话是否超时,并将用户重定向到那个定制页面(比如CustomSessionTimeout.jsp)。此页面不必经过任何筛选。 这是第一个过滤器中的一个方法的签名 public void doFilter(ServletRequest ServletRequest,ServletResponse ServletResponse
我有以下HTML+js代码: 您能解释一下如何重构以下代码,在单击href code后执行,但#不添加到URL并且页面不应该重新加载的代码吗?
问题内容: 在一段时间后,有一些用于重定向的PHP函数。我在某处看到它,但记不起来了。就像登录后的gmail重定向一样。请有人提醒我吗? 问题答案: header( “refresh:5;url=wherever.php” ); 这是php的设置方式,它将在 5秒内* 将您重定向到 * 请记住,必须先通过常规HTML标记,文件中的空白行或从PHP发送任何实际输出,然后调用header()。读取包含