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

jsf标签<p:ajax>

JSF AJAX请求的会话超时处理

当我们使用AJAX行为开发JSF应用程序时,在处理Ajax请求的超时情况时,我们可能会遇到问题。 例如,如果您使用的是基于J2EE Form的身份验证,则会话超时后应将正常请求重定向到登录页面。 但是,如果您的请求是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标签<p:ajax>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/350741.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

使用javamail发信过程中的一些问题及解决方法

今天在研究javamail发信的过程中&#xff0c;出现了一些小问题&#xff0c;现总结如下&#xff0c;以免后来者走些不必要的弯路&#xff0c;先把完整的能够正常运行的代码示例粘贴如下&#xff1a; 发邮件源代码&#xff1a; package com.hyq.test; import java.util.Propertie…

VIsual Studio编译OpenCV:无法打开python27_d.lib(python36_d.lib)的问题

在用 VS2015 编译 Debug 版的 openCV 源码时&#xff0c;最后一步生成 INSTALL&#xff0c;碰到了下面问题&#xff1a;因为配置 Windows 版 caffe 的需要&#xff0c;我先安装了一个 Anaconda3&#xff08;3.6版本&#xff09;&#xff0c;caffe 最高支支持到 3.5 &#xff0c…

python做硬件自动化测试仪器_基于Python PyVisa和GPIB的硬件测试仪器控制方法

基于Python和GPIB的硬件测试仪器控制方法 背景 在物联网通信时代&#xff0c;嵌入式模块开发越发广泛&#xff0c;自动化测试成为大家老生常谈的话题。对于一些高精度仪器&#xff0c;我们知道它是用GPIB控制用来测试&#xff0c;也希望可以通过一个程序实现自动化控制&#xf…

外点惩处函数法·约束优化问题

版权声明&#xff1a;本文为博主原创文章&#xff0c;未经博主同意不得转载&#xff0c;博客主页 http://blog.csdn.net/i_love_home https://blog.csdn.net/zstu_wangrui/article/details/36242529 外点惩处函数法约束优化问题 外点法惩处函数&#xff08;r添加&#xff0c;SU…

在单元测试和TDD中指定时间的重要性

最近&#xff0c;我一直在写与自动测试有关的更高级的概念&#xff08;主要与Spock有关&#xff09;。 但是&#xff0c;在进行测试培训时&#xff0c;我清楚地看到&#xff0c;通常对特定工具的知识并不是主要问题。 即使使用Spock&#xff0c;也可以编写肿且难以维护的测试&a…

40个Java多线程问题总结

前言 Java多线程分类中写了21篇多线程的文章&#xff0c;21篇文章的内容很多&#xff0c;个人认为&#xff0c;学习&#xff0c;内容越多、越杂的知识&#xff0c;越需要进行深刻的总结&#xff0c;这样才能记忆深刻&#xff0c;将知识变成自己的。这篇文章主要是对多线程的问题…

.pro.user文件

.pro.user 用于记录打开工程的路径&#xff0c;所用的编译器、构建的工具链、生成目录、打开工程的qt-creator的版本等。 当更换编译环境时&#xff0c;要将其删除。

python tkinter实例_python绘制一个图形示例源码(tkinter)

【实例简介】 【实例截图】【核心代码】 # -*- coding: utf-8 -*- #!/usr/bin/python import math from tkinter import * class PTS: def __init__(self): self.x 0 self.y 0 points [] def LineToDemo(): screenx 400 screeny 400 canvas Canvas(width screenx,height…

PHP算法之冒泡排序

//冒泡排序 //①思路,先比较出第一次,找一个最大的值,排到最后; //②重复count遍之后,就能得到排序; //③优化,每一次循环之后不需要再次全部重复; $array [11,5,4,58,1,222,34]; for ($j 0; $j< count($array)-1; $j) { for($i 0 ; $i < count($array)-$j-1; $i){if(…

jaxb 命名空间_在JAXB解组期间应用名称空间

jaxb 命名空间对于某些XML模式来说&#xff0c;它是一组严格的规则&#xff0c;用于规定XML文档的结构方式。 但是对于其他人来说&#xff0c;通常的准则是指出XML的外观。 这意味着有时出于某些原因&#xff0c;人们希望接受不符合XML模式的输入。 在此示例中&#xff0c;我将…

pro文件

配置 注释 以“#”开始&#xff0c;到这一行结束。 快捷键&#xff1a;Ctrl / CONFIG 指定编译器选项和项目配置&#xff0c;值由qmake内部识别并具有特殊意义。 以下配置值控制编译标志&#xff1a; 选项说明release项目以release模式构建。如果也指定了debug&#xff0c;那么…

Java Thread 总结

线程的概述&#xff08;Introduction&#xff09; 线程是一个程序的多个执行路径&#xff0c;执行调度的单位&#xff0c;依托于进程存在。 线程不仅可以共享进程的内存&#xff0c;而且还拥有一个属于自己的内存空间&#xff0c;这段内存空间也叫做线程栈&#xff0c;是在建立…

前端和后端哪个工资高_新媒体运营和网络运维哪个好,哪个工资待遇高,门槛低?...

文/水流云在草青青通常情况下&#xff0c;门槛高低和待遇高低成反比。工资待遇和工作本领成正比。除非你有人脉或贵人&#xff0c;除非你踩狗屎运。门槛低&#xff0c;待遇高的工作对绝大多数人而言是梦话。不知题主朋友的特长是什么&#xff1f;有哪些工作经验&#xff1f;青青…

python框架源码学习

最近下了一个别人的接口测试框架原码来学习 1.有用到logbook模块进行日志管理 2.使用xlrd模块对excel数据表的操作 3.使用自定义的代码输出测试报告 4.使用logger模块记录运行时日志 主要是看了关于接口的代码&#xff1a;封装了http请求的get/post请求 用法&#xff1a; 需要导…

使用TestContainers进行数据库测试

如果您曾经编写过测试数据库交互的代码&#xff0c;例如数据访问对象&#xff0c;那么您很可能遇到了测试中最长期的烦恼之一&#xff1a;为了准确地测试这些交互&#xff0c;需要一个数据库。 为了本文的方便&#xff0c;让我们考虑一个将PostgreSQL用作其环境的一部分的应用…

cuda安装配置VS2013

1.1 安装cuda 首先官网下载安装包&#xff0c;这个就不细说了 &#xff0c;我下的是这个版本cuda_8.0.61_win10.exe&#xff0c;&#xff0c;注意win7和win10版本要对应&#xff0c;千万别弄错了 之后双击会出现如下截图&#xff0c;解压完以后一直点下一步如下图出现这个等半个…

两列布局、三列适应布局、两列等高适应布局。

一. 两列布局&#xff1a;左侧定宽、右侧自适应。 四种方法 &#xff1a;flex 、position、float和负外边距、外边距 1. 使用flex. <!DOCTYPE html> <html> <head><meta charset"utf-8"><title></title><style type"tex…

操作系统的线程和进程的区别_面试官:你熟悉多线程嘛?线程跟进程有什么区别?...

这篇文章跟大家聊聊线程&#xff0c;讲到线程&#xff0c;⼜不得不提进程了~进程我们估计是很了解的了&#xff0c;在windows下打开任务管理器&#xff0c;可以发现我们在操作系统上运⾏的程序都是进程。什么是叫一个进程&#xff1f; 什么叫一个线程&#xff1f;进程&#xff…

以OpenCV为例配置VS第三方库

正常情况下&#xff0c;你拿到的别人的第三方动态库&#xff08;静态库调用方式这里不讲&#xff0c;有另外一篇文章&#xff09;至少应该包含下面三种文件&#xff1a; 1. 头文件&#xff0c;这个一般放在include这样字眼的文件夹下&#xff0c;比如OpenCV的&#xff1a;然后i…

光纤接口怎么接 图解_光纤的数据比网线快很多倍,但为什么没有在家庭局域网中普及呢?...

光纤的数据吞吐量比网线大很多&#xff0c;速度也更快&#xff0c;网络光纤入户已经普及&#xff0c;但是家庭内组网却没有普及&#xff0c;大部分家庭组网还是网线较多。分析起来主要的原因有&#xff1a;光纤线的价格和网线差不多&#xff0c;但是因为光纤所使用的专用的光接…