日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 前端技术 > javascript >内容正文

javascript

JSF AJAX请求的会话超时处理

發(fā)布時(shí)間:2023/12/3 javascript 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 JSF AJAX请求的会话超时处理 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

JSF AJAX請(qǐng)求的會(huì)話超時(shí)處理

當(dāng)我們使用AJAX行為開(kāi)發(fā)JSF應(yīng)用程序時(shí),在處理Ajax請(qǐng)求超時(shí)場(chǎng)景時(shí)可能會(huì)遇到問(wèn)題。 例如,如果您使用的是基于J2EE表單的身份驗(yàn)證,則會(huì)話超時(shí)后應(yīng)將正常請(qǐng)求重定向到登錄頁(yè)面。 但是,如果您的請(qǐng)求是AJAX,則無(wú)法在客戶端正確處理響應(yīng)。 用戶將保留在同一頁(yè)面上,并且不知道會(huì)話已過(guò)期。

許多人為此問(wèn)題提出了解決方案。 以下是涉及使用Spring安全框架的兩種可能的解決方案:

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

但是,某些應(yīng)用程序可能只是使用簡(jiǎn)單的機(jī)制將其身份驗(yàn)證和授權(quán)信息存儲(chǔ)在會(huì)話中。 對(duì)于那些不使用Spring Security框架的應(yīng)用程序,他們?nèi)绾翁幚泶祟?lèi)問(wèn)題? 我剛剛修改了Oleg Varaksin提出的解決方案,作為我的參考。

首先,創(chuàng)建一個(gè)名為“ MyJsfAjaxTimeoutSetting”的簡(jiǎn)單會(huì)話范圍內(nèi)的JSF托管bean。

該P(yáng)OJO的主要目的只是允許您在faces-config.xml中的會(huì)話超時(shí)后配置重定向URL。 如果您不希望配置超時(shí)URL,則可能不需要此類(lèi)。

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

其次,創(chuàng)建一個(gè)PhaseListener來(lái)處理Ajax請(qǐng)求的重定向。

此PhaseListener是解決方案中最重要的部分。 它重新創(chuàng)建響應(yīng),以便超時(shí)后可以重定向Ajax請(qǐng)求。

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')的詳細(xì)信息如下所示:

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); }

組態(tài)

如前所述,會(huì)話作用域受管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 對(duì)JSF AJAX請(qǐng)求的會(huì)話超時(shí)處理 。

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

總結(jié)

以上是生活随笔為你收集整理的JSF AJAX请求的会话超时处理的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。