JSF AJAX请求的会话超时处理

当我们使用AJAX行为开发JSF应用程序时,在处理Ajax请求超时场景时可能会遇到问题。 例如,如果您使用的是基于J2EE表单的身份验证,则会话超时后应将正常请求重定向到登录页面。 但是,如果您的请求是AJAX,则无法在客户端正确处理响应。 用户将保留在同一页面上,并且不知道会话已过期。

许多人为此问题提出了解决方案。 以下是涉及使用Spring安全框架的两种可能的解决方案:

1. Oleg Varaksin的帖子
2. Spring Security 3和ICEfaces 3教程

但是,某些应用程序可能只是使用简单的机制将其身份验证和授权信息存储在会话中。 对于那些不使用Spring Security框架的应用程序,他们如何处理此类问题? 我刚刚修改了Oleg Varaksin提出的解决方案,作为我的参考。

首先,创建一个名为“ MyJsfAjaxTimeoutSetting”的简单会话范围内的JSF托管bean。

该POJO的主要目的只是允许您在faces-config.xml中的会话超时后配置重定向URL。 如果您不希望配置超时URL,则可能不需要此类。

public class MyJsfAjaxTimeoutSetting {public MyJsfAjaxTimeoutSetting() {}private String timeoutUrl;public String getTimeoutUrl() {return timeoutUrl;}public void setTimeoutUrl(String timeoutUrl) {this.timeoutUrl = timeoutUrl;}}

其次,创建一个PhaseListener来处理Ajax请求的重定向。

此PhaseListener是解决方案中最重要的部分。 它重新创建响应,以便超时后可以重定向Ajax请求。

import org.borislam.util.FacesUtil;
import org.borislam.util.SecurityUtil;
import java.io.IOException;
import javax.faces.FacesException;
import javax.faces.FactoryFinder;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import javax.faces.event.PhaseEvent;
import javax.faces.event.PhaseId;
import javax.faces.event.PhaseListener;
import javax.faces.render.RenderKit;
import javax.faces.render.RenderKitFactory;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.log4j.Logger;
import org.primefaces.context.RequestContext;public class MyJsfAjaxTimeoutPhaseListener implements PhaseListener
{public void afterPhase(PhaseEvent event){}public void beforePhase(PhaseEvent event){   MyJsfAjaxTimeoutSetting timeoutSetting = (MyJsfAjaxTimeoutSetting)FacesUtil.getManagedBean('MyJsfAjaxTimeoutSetting');FacesContext fc = FacesContext.getCurrentInstance();RequestContext rc = RequestContext.getCurrentInstance();ExternalContext ec = fc.getExternalContext();HttpServletResponse response = (HttpServletResponse) ec.getResponse();HttpServletRequest request = (HttpServletRequest) ec.getRequest();if (timeoutSetting ==null) {System.out.println('JSF Ajax Timeout Setting is not configured. Do Nothing!');return ;}UserCredential user = SecurityUtil.getUserCredential(); //// You can replace the above line of code with the security control of your application.// For example , you may get the authenticated user object from session or threadlocal storage.// It depends on your design.if (user==null) {// user credential not found. // considered to be a Timeout caseif (ec.isResponseCommitted()) {// redirect is not possiblereturn;}try{if ( ( (rc!=null &&  RequestContext.getCurrentInstance().isAjaxRequest())|| (fc!=null && fc.getPartialViewContext().isPartialRequest()))&& fc.getResponseWriter() == null&& fc.getRenderKit() == null) {response.setCharacterEncoding(request.getCharacterEncoding());RenderKitFactory factory = (RenderKitFactory)  FactoryFinder.getFactory(FactoryFinder.RENDER_KIT_FACTORY);RenderKit renderKit = factory.getRenderKit(fc,fc.getApplication().getViewHandler().calculateRenderKitId(fc));ResponseWriter responseWriter =renderKit.createResponseWriter(response.getWriter(), null, request.getCharacterEncoding());fc.setResponseWriter(responseWriter);ec.redirect(ec.getRequestContextPath() + (timeoutSetting.getTimeoutUrl() != null ? timeoutSetting.getTimeoutUrl() : ''));     }} catch (IOException e) {System.out.println('Redirect to the specified page '' + timeoutSetting.getTimeoutUrl() + '' failed');throw new FacesException(e);}} else {return ; //This is not a timeout case . Do nothing !}}public PhaseId getPhaseId(){return PhaseId.RESTORE_VIEW;}}

FacesUtil.getManagedBean('MyJsfAjaxTimeoutSetting')的详细信息如下所示:

public static Object getManagedBean(String beanName) {FacesContext fc = FacesContext.getCurrentInstance();ELContext elc = fc.getELContext();ExpressionFactory ef = fc.getApplication().getExpressionFactory();ValueExpression ve = ef.createValueExpression(elc, getJsfEl(beanName), Object.class);return ve.getValue(elc);
}

组态

如前所述,会话作用域受管bean MyJsfAjaxTimeoutSetting的目的只是为了使您可以在faces-config.xml中配置timeoutUrl。

<managed-bean>
<managed-bean-name>MyJsfAjaxTimeoutSetting</managed-bean-name>
<managed-bean-class>org.borislam.security.MyJsfAjaxTimeoutSetting</managed-bean-class>
<managed-bean-scope>session</managed-bean-scope>
<managed-property>
<property-name>timeoutUrl</property-name>
<value>/login.do</value>
</managed-property>
</managed-bean>

最重要的是,将PhaseListener添加到faces-config.xml中。

<lifecycle>
<phase-listener id="JSFAjaxTimeoutPhaseListener">hk.edu.hkeaa.infrastructure.security.JSFAjaxTimeoutPhaseListener                             </phase-listener>
</lifecycle>

如果您使用的是Spring框架,则可以在SpringBeanFacesELResolver的帮助下在Spring中管理MyJsfAjaxTimeoutSetting。 然后,您可以使用以下配置。

<bean id="MyJsfAjaxTimeoutSetting" class="org.borislam.security.MyJsfAjaxTimeoutSetting" scope="session">   <property name="timeoutUrl" value="/login.do">

参考: “ 编程和平”博客上JCG合作伙伴 Boris Lam 对JSF AJAX请求的会话超时处理 。

翻译自: https://www.javacodegeeks.com/2012/12/session-timeout-handling-on-jsf-ajax-request.html

JSF AJAX请求的会话超时处理相关推荐

  1. jsf标签p:ajax_JSF AJAX请求的会话超时处理

    jsf标签<p:ajax> JSF AJAX请求的会话超时处理 当我们使用AJAX行为开发JSF应用程序时,在处理Ajax请求的超时情况时,我们可能会遇到问题. 例如,如果您使用的是基于J ...

  2. ajax请求如何判断超时,ajax请求超时判断(转载)

    ajax请求时有个参数可以借鉴一下 var ajaxTimeOut = $.ajax({ url:'', //请求的URL timeout : 1000, //超时时间设置,单位毫秒 type : ' ...

  3. 全局处理ajax请求时session超时

    $.ajaxSetup({contentType : "application/x-www-form-urlencoded;charset=utf-8",complete : fu ...

  4. java Servlet Filter 拦截Ajax请求,统一处理session超时的问题

    后台增加filter,注意不要把druid也屏蔽了 import java.io.IOException;import javax.servlet.Filter; import javax.servl ...

  5. ajax请求封装,封装的ajax请求

    在做登录注册这类提交表单数据时,我们经常需要局部刷新网页来验证用户输入的信息,这就需要用到ajax请求,我们通常需要获取表单中的数据,发起ajax请求,通过服务程序,与数据库的数据进行比对,判断信息的 ...

  6. java和ajax超时_java – 如何在不重置tomcat的会话超时的情况下执行经过身份验证的AJAX请求?...

    我会使用Grails过滤器,它会执行类似于The-MeLLeR提议的内容,而不会在所有会话中进行不必要的循环: class AjaxTimeoutFilters { int sessionTimeou ...

  7. session会话拦截ajax,session过期,拦截ajax请求并跳转登录页面

    1.方法一 :1.1使用filter 和ajaxsetup 对ajax进行拦截并跳转登录页面 public void doFilter(ServletRequest request, ServletR ...

  8. 解决spring-security session超时 Ajax 请求没有重定向的问题

    解决spring-security session超时 Ajax 请求没有重定向的问题 参考文章: (1)解决spring-security session超时 Ajax 请求没有重定向的问题 (2) ...

  9. html jsf ajax blur,JSF和AJAX:隐藏网站的一部分,直到第一个Ajax请求

    我想创建一个页面,其中一些内容将在ajax请求后显示.这里是我的代码部分:JSF和AJAX:隐藏网站的一部分,直到第一个Ajax请求 Retrive object by id: You retrive ...

最新文章

  1. Windows基本路由配置(cmd/route)
  2. 统一代码风格工具 editorConfig
  3. 电子测量与仪器第四版pdf_固定资产管理系统_资产分类名称(电子和通信测量分析仪器篇)...
  4. TCP/IP 网络编程 (三)
  5. Angular 依赖注入的学习笔记
  6. python热部署_关于Spring Cloud 框架热部署的方法
  7. 编程错题本——解析OpenWnn(1)命名问题
  8. 工程数学(数值分析)第四讲:插值逼近
  9. mac连接ubuntu,tomcat乱码
  10. windows server 2012 分布式文件系统DFS介绍
  11. python循环输入数组_python数组循环处理方法
  12. 使用CSS3 Animation实现输入文字动画
  13. 【Linux-Windows】海康网络相机开启ONVIF协议
  14. VSCode 中文乱码
  15. 深度卷积神经网络(CNN)
  16. MIMO系列之分集与复用
  17. pt100铂电阻低温温度传感器的特点
  18. 至强CPU型号系列的变化
  19. 星星之火-50:无意中发现一种能够把网络视频下载到本地计算机中的方法
  20. 外业调查工具助手,照片采集、精准定位、导航、地图查看

热门文章

  1. (转)springboot:添加JSP支持
  2. 程序员三年的门槛该如何跨过去?
  3. maven依赖管理_依赖管理和Maven
  4. spring 构造函数注入_Spring依赖注入–字段vs设置器vs构造函数注入
  5. 弱投影模型_通过投影增强数据模型
  6. java日期时间转日期_Java时间和日期指南
  7. plsql例外_大例外背后的真相
  8. jooq_jOOQ API设计缺陷的怪异事件
  9. javafx 浏览器_浏览器中的JavaFX
  10. Project Reactor展开方法