当我们在使用DWR的反向AJax是,每次页面的刷新都会产生一个ScriptSession(SS),但是我们确无从对过期的SS进行即使的销毁,虽然可以通过在每个页面访问时,自动执行某个方法,来销毁那些当前用户的非有效SS,但是这样也使得我们在代码管理上带来非常麻烦的问题.

DWR3的诞生终于给我们提供了ScritpSessionLintener(SSL)接口

本文,主要讲解如何使用ScriptSession接口.

DWR支持在Web.XML当中,配置扩展.

Xml代码
  1. <init-param>
  2. param-name>*</param-value>

但是,经过几次的实验和摸索,SSL在当中配置后,管理器会进行有效构造,但是SS在创建和销毁时,并不会执行继承了ScriptSessionListner类的相关方法.(或许是我自己项目的问题.)

经过自己的研究发现,在ScriptSessionManager类中,包含了AddScriptSessionListener方()法.这样给使用SSL带来了方便

我们只需要在Web.XML文件中配置一个自定义的ScrptSessionManager

Java代码
    publicclassCustomScriptSessionManagerextendsorg.directwebremoting.impl.DefaultScriptSessionManager{
  1. publicCustomScriptSessionManager(){
  2. try{
  3. this.addScriptSessionListener(newCustomScriptSessionListener());
  4. }catch(Exceptione){
  5. e.printstacktrace();
  6. }
  7. }

*CustomScriptSessionListener为一个实现了ScriptSessionListener接口的实体类.

通过这种方式,将SS管理程序注射近SSM内,让管理器在SS状态发生变化时,即使通过SSL进行处理

如何使得每个用户的SS都是新鲜的,每个人都有自己的方法,我在自己的管理程序内使用一个

将每个用户的Session内存放当前ScriptSession进行绑定,当用户生成一个新的ScriptSession时,根据用户的Session,并且将旧的ScriptSession进行主动销毁,并更新Session.

这样,我们随着高效的保证每个用户只有一个ScriptSession存在于内存当中,使得我们的程序更加高效.

packagecom.dwr;
  • importjava.util.Collection;
  • importjava.util.Iterator;
  • importjava.util.Vector;
  • importjavax.servlet.http.HttpServletRequest;
  • importjavax.servlet.http.HttpSession;
  • importorg.directwebremoting.ScriptSession;
  • importorg.directwebremoting.ServerContextFactory;
  • importorg.directwebremoting.WebContext;
  • importorg.directwebremoting.WebContextFactory;
  • importorg.directwebremoting.event.ScriptSessionEvent;
  • importorg.directwebremoting.event.ScriptSessionListener;
  • importorg.dom4j.Document;
  • importorg.dom4j.Element;
  • importorg.dom4j.io.SAXReader;
  • /**
  • *在线ScriptSession(SSL)监听管理器.
  • *在SSL中,每当DWR工厂在生成一个新的ScriptSession(SS)时,将被SSL捕获
  • *SSL对捕获的SS进行初始化赋值
  • *其中在SS属性中的SessionLabel.CurrentSesionID赋予当前用户的SessinID
  • *并在改用户的Session属性中的SessionLabel.CurrentScriptSessionID赋予当前的SSL
  • *然后在SessionLabel.CurrentPage中赋予当前SS的操作界面地址
  • *
  • *并且开始激活SSL插件中的sessionCreated方法
  • *当
  • *@author熊浩华-ibmsz
  • *2009-8-18:下午03:11:55-
  • */
  • classCustomScriptSessionListenerimplementsScriptSessionListener{
  • staticfinalHttpSessionLabelSessionLabel=newHttpSessionLabel();
  • privateCollection<IListenerMessage>collection=null;
  • publicCustomScriptSessionListener()throwsException{
  • System.out.println("开始构造SSL");
  • collection=newVector<IListenerMessage>();
  • SAXReaderreader=newSAXReader();
  • Documentdocument=reader.read(this.getClass().getResource("ScriptSessionListener.xml"));
  • ElementrootElement=document.getRootElement();
  • Iteratorit=rootElement.elementIterator("listener");
  • while(it.hasNext()&&it!=null){
  • Elementelement=(Element)it.next();
  • Stringclasspath=element.getTextTrim();
  • if(classpath==null||classpath.trim().equals("")){
  • continue;
  • Classcls=Class.forName(classpath);
  • Objectobject=cls.newInstance();
  • if(objectinstanceofIListenerMessage){
  • this.collection.add((IListenerMessage)object);
  • @SuppressWarnings("deprecation")
  • finalvoidsessionCreated(ScriptSessionEventsSessionEvent){
  • //System.out.println("创建新的ScriptSession时执行");
  • ScriptSessionscriptSession=sSessionEvent.getSession();//获取新创建的SS
  • WebContextwebContext=WebContextFactory.get();
  • HttpServletRequesthttpServletRequest=webContext.getHttpServletRequest();
  • HttpSessionhttpSession=httpServletRequest.getSession();//获取构造SS的用户的HttpSession
  • ScriptSessioncurrSession=(ScriptSession)httpSession.getAttribute(SessionLabel.getCurrentScriptSessionID());
  • if(currSession!= currSession.invalidate();
  • for(IListenerMessagemessage:this.collection){
  • message.sessionCreated(sSessionEvent);
  • httpSession.setAttribute("DWR3.CurrPath",scriptSession.getPage());
  • httpSession.setAttribute("DWR3.CurrScriptSession",scriptSession);
  • Collection<ScriptSession>sSCollection=webContext.getScriptSessionsByPage(scriptSession.getPage());
  • for(ScriptSessionsession:sSCollection){
  • if(session.getAttribute(SessionLabel.getCurrentSesionID())== message.sendCreateMessage(scriptSession,session);
  • scriptSession.setAttribute(SessionLabel.getCurrentSesionID(),httpSession.getId());
  • voidsessionDestroyed(ScriptSessionEventsSessionEvent){//销毁一个ScriptSession时执行
  • ScriptSessionscriptSession=sSessionEvent.getSession();
  • /*
  • Objectusername=(Object)scriptSession.getAttribute(SessionLabel.getCurrentScritpUserName());
  • if(username==null){
  • username="";
  • }
  • message.sessionDestroyed(sSessionEvent);
  • Collection<ScriptSession>collection=ServerContextFactory.get().getScriptSessionsByPage(scriptSession.getPage());
  • for(ScriptSessionsession:collection){
  • StringscritpAttrID=(String)session.getAttribute(SessionLabel.getCurrentSesionID());
  • if(scritpAttrID!= message.sendDestroyMessage(scriptSession,85); font-weight:bold">classHttpSessionLabel{
  • privatefinalStringCurrentScriptSessionID="DWR3.CurrScriptSession";
  • finalStringCurrentScritpUserName="DWR.Chat.UserName";
  • finalStringCurrentSesionID="DWR3.CurrSessionID";
  • finalStringCurrentPage="DWR3.CurrPath";
  • *获取当前SessionScript的在线页面
  • *@returncurrentPage
  • publicStringgetCurrentPage(){
  • returnCurrentPage;
  • *获取Session中的当前ScriptSession的ID
  • *@returncurrentScriptSessionID
  • publicStringgetCurrentScriptSessionID(){
  • returnCurrentScriptSessionID;
  • *获取当前用户名称
  • *@returncurrentScritpUserName
  • publicStringgetCurrentScritpUserName(){
  • returnCurrentScritpUserName;
  • *获取ScriptSession中的HttpSessionID
  • *@returncurrentSesionID
  • publicStringgetCurrentSesionID(){
  • returnCurrentSesionID;
  • }
  • 以上代码是从一个通过DWR实现的及时在线聊天系统中抽取出来的ScriptSession监听器.

    红色标注部分为管理SS的程序段

    全案例源代码下载

    高效管理DWR中的ScriptSession,ScriptSessionLintener的更多相关文章

    1. HTML5 Web缓存和运用程序缓存(cookie,session)

      这篇文章主要介绍了HTML5 Web缓存和运用程序缓存(cookie,session),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧

    2. iOS Swift上弃用后Twitter.sharedInstance().session()?. userName的替代方案

      解决方法如果您仍在寻找解决方案,请参阅以下内容:

    3. 使用Fabric SDK iOS访问Twitter用户时间线

      我试图在这个问题上挣扎两天.我正在使用FabricSDK和Rest工具包,试图为Twitter使用不同的RestAPIWeb服务.我可以使用具有authTokenSecret,authToken和其他值的会话对象的TWTRLogInButton成功登录.当我尝试获取用户时间线时,我总是得到失败的响应,作为:{“errors”:[{“code”:215,“message”:“BadAuthentic

    4. ios – 如何从Apple Watch调用iPhone上定义的方法

      有没有办法从Watchkit扩展中调用iPhone上的类中定义的方法?根据我的理解,目前在Watchkit和iPhone之间进行本地通信的方法之一是使用NSUserDefaults,但还有其他方法吗?

    5. ios – 应该加密APNS令牌吗?

      所以,我想知道,因为用户将APNS令牌发送给APNS提供商以便接收推送通知,是否应该加密令牌?另外,我认为根据APNS令牌识别设备是不可能的?因此,我想确保,如果有人从我的一个客户端嗅探推送通知注册...>他仍然必须获得我的推送证书才能以任何方式打扰我的客户>他知道有人对这些信息感兴趣,但无法确定我的客户是谁我可以放心吗?

    6. ios – 如何将视频从AVAssetExportSession保存到相机胶卷?

      在此先感谢您的帮助.解决方法只需使用session.outputURL=…

    7. ios – 使用AVCaptureSession sessionPreset = AVCaptureSessionPresetPhoto拉伸捕获的照片

      解决方法所以我解决了我的问题.这是我现在使用的代码,它工作正常:…重要的输出imagaView:一些额外的信息:相机图层必须是全屏,并且outputimageView也必须是.我希望这些对某些人来说也是有用的信息.

    8. 我可以在iOS中自定义Twitter工具包的登录按钮吗?

      我已经下载了Twitter工具包框架并添加了用Twitter登录的代码.但是,我不希望登录按钮看起来像那样.我想要一个用于登录的自定义按钮.我能这样做吗?我只想使用这个框架,因为这也适用于iOS系统帐户.解决方法根据document:在按下按钮中添加代码:Objective-C的迅速

    9. ios – AVCaptureSession条形码扫描

      解决方法以下是我所拥有的项目代码示例,可以帮助您走上正确的轨道

    10. iOS Enterprise Deployement:单击itms-services链接会导致“无法连接到[域]”错误

      解决方法我有这个问题,这里没有任何记录的解决方案,或者在其他答案中,没有为我工作.使用正确的SSL证书,可以在目标设备上的safari中加载plist,没有任何问题.但是,尝试使用“itms-services://…”链接进行安装将始终失败,并显示“无法连接到[域]”错误.问题是Web服务器上未配置中间SSL证书.Web浏览器没有问题,SSL有效,但将设备连接到Mac,并通过XCode中的设备面板查看日志显示以下错误:在Apache上安装中间SSL证书解决了这个问题.

    随机推荐

    1. xe-ajax-mock 前端虚拟服务

      最新版本见Github,点击查看历史版本基于XEAjax扩展的Mock虚拟服务插件;对于前后端分离的开发模式,ajax+mock使前端不再依赖后端接口开发效率更高。CDN使用script方式安装,XEAjaxMock会定义为全局变量生产环境请使用xe-ajax-mock.min.js,更小的压缩版本,可以带来更快的速度体验。

    2. vue 使用 xe-ajax

      安装完成后自动挂载在vue实例this.$ajaxCDN安装使用script方式安装,VXEAjax会定义为全局变量生产环境请使用vxe-ajax.min.js,更小的压缩版本,可以带来更快的速度体验。cdnjs获取最新版本点击浏览已发布的所有npm包源码unpkg获取最新版本点击浏览已发布的所有npm包源码AMD安装require.js安装示例ES6Module安装通过Vue.use()来全局安装示例./Home.vue

    3. AJAX POST数据中文乱码解决

      前端使用encodeURI进行编码后台java.net.URLDecoder进行解码编解码工具

    4. Koa2框架利用CORS完成跨域ajax请求

      实现跨域ajax请求的方式有很多,其中一个是利用CORS,而这个方法关键是在服务器端进行配置。本文仅对能够完成正常跨域ajax响应的,最基本的配置进行说明。这样OPTIONS请求就能够通过了。至此为止,相当于仅仅完成了预检,还没发送真正的请求呢。

    5. form提交时,ajax上传文件并更新到&lt;input&gt;中的value字段

    6. ajax的cache作用

      filePath="+escape;},error:{alert;}});解决方案:1.加cache:false2.url加随机数正常代码:网上高人解读:cache的作用就是第一次请求完毕之后,如果再次去请求,可以直接从缓存里面读取而不是再到服务器端读取。

    7. 浅谈ajax上传文件属性contentType = false

      默认值为contentType="application/x-www-form-urlencoded".在默认情况下,内容编码类型满足大多数情况。在这里,我们主要谈谈contentType=false.在使用ajax上传文件时:在其中先封装了一个formData对象,然后使用post方法将文件传给服务器。说到这,我们发现在JQueryajax()方法中我们使contentType=false,这不是冲突了吗?这就是因为当我们在form标签中设置了enctype=“multipart/form-data”,

    8. 909422229_ajaxFileUpload上传文件

      ajaxFileUpload.js很多同名的,因为做出来一个很容易。我上github搜AjaxFileUpload出来很多类似js。ajaxFileUpload是一个异步上传文件的jQuery插件传一个不知道什么版本的上来,以后不用到处找了。语法:$.ajaxFileUploadoptions参数说明:1、url上传处理程序地址。2,fileElementId需要上传的文件域的ID,即的ID。3,secureuri是否启用安全提交,默认为false。4,dataType服务器返回的数据类型。6,error

    9. AJAX-Cache:一款好用的Ajax缓存插件

      原文链接AJAX-Cache是什么Ajax是前端开发必不可少的数据获取手段,在频繁的异步请求业务中,我们往往需要利用“缓存”提升界面响应速度,减少网络资源占用。AJAX-Cache是一款jQuery缓存插件,可以为$.ajax()方法扩展缓存功能。

    10. jsf – Ajax update/render在已渲染属性的组件上不起作用

      我试图ajax更新一个有条件渲染的组件。我可以确保#{user}实际上是可用的。这是怎么引起的,我该如何解决呢?必须始终在ajax可以重新呈现之前呈现组件。Ajax正在使用JavaScriptdocument.getElementById()来查找需要更新的组件。但是如果JSF没有将组件放在第一位,那么JavaScript找不到要更新的内容。解决方案是简单地引用总是渲染的父组件。

    返回
    顶部