`
bowld
  • 浏览: 13959 次
  • 性别: Icon_minigender_1
  • 来自: 沈阳
最近访客 更多访客>>
社区版块
存档分类
最新评论

session串的问题以及解决方法

 
阅读更多

  什么是session串的问题  
  典型案例:现有一Web系统,用用户A登录,打开修改页面Page1,然后通过菜单文件-》新窗口打开一个窗口,用用户B登录,然后回Page1页面提交,此时身份已经变为用户B,出现非希望的结果。这就是session串的问题。
  如何解决Session串的问题
  解决Session串的问题需要使用URL重写的技术,下面介绍一下什么是
  (1)URL重写
  什么是URL重写
  URL重写包括向URL路径添加一些容器可以解释的数据。规范要求会话ID必须编码在URL路径中,参数名称必须是jsessionid,例如: http://www.ss.com/catalog/index.html;jsessionid=11 11,只有在你确定用户浏览器会把COOKIE停用的情况下才应使用URL重写,因为在这种情况下,WEB APP中的所有HYBERLINKS和FORM的ACTION URL都要使用URL重写,这样就引入一个问题就是APP中所有的页面必须是动态的页面,不能存在静态的HTML页面了,因为每个页面在往服务器发送请求的时候都要在URL上带上JSESSIONID。所有页面都用SERVLET来处理的话速度就可能变慢了。
  WebLogic默认打开URL重写功能,但是这是有个前提的,要求用HttpServletResponse.encodeURL()方法来包装url,如
  out.println("catalog");
  必需写成  
  out.println("catalog");
  HttpServletResponse.encodeURL()方法检测客户端Cookie是否被禁用,如果禁用则会自动将session id加到URL中,如果没有禁用则不会添加。
  具体解决方法
  1.将现有系统的连接采用response.encodeURL的方式包装(工作量很大,包括href连接和js组装的连接)
  2.添加一个Filter,包装HttpServletResponseWrapper,使得无论如何HttpServletResponse.encodeURL()方法都添加一个参数sid_token(值为session id)。如果是Form,则自动修改表单,添加一个隐藏字段sid_token(值为session id),同时在Filter的doFilter方法中添加一个逻辑,检查参数sid_token的值是否和当前的sesssion id一致,如果不一致则抛出异常,表示该用户已经退出系统。 
  注:1.Filter是否需要自动修改表单未经考证
  2.本来想采用标准的jsessionid,但是和CAS配合时发生问题。
  (2)ThreadLocal
  ThreadLocal是什么呢?其实ThreadLocal并非是一个线程的本地实现版本,它并不是一个Thread,而是thread local variable(线程局部变量)。也许把它命名为ThreadLocalVar更加合适。线程局部变量(ThreadLocal)其实的功用非常简单,就是为每一个使用该变量的线程都提供一个变量值的副本,是每一个线程都可以独立地改变自己的副本,而不会和其它线程的副本冲突。从线程的角度看,就好像每一个线程都完全拥有该变量。线程局部变量并不是Java的新发明,在其它的一些语言编译器实现(如IBM XL FORTRAN)中,它在语言的层次提供了直接的支持。因为Java中没有提供在语言层次的直接支持,而是提供了一个ThreadLocal的类来提供支持,所以,在Java中编写线程局部变量的代码相对比较笨拙,这也许是线程局部变量没有在Java中得到很好的普及的一个原因吧。
  我们知道,对于每个请求容器都会开一个线程去处理,从servlet到数据库层都是同一个线程,通过ThreadLocal可以把变量在各个层共享,通过这一特性就可以解决我的问题了。
  首先我实现一个filter(不知道什么是filter?),使得所有请求都通过这个filter,在filter里面获取用户选择的年份,实际上通过年份就知道了连接哪个数据库,因为系统的数据源名称是通过年份来区分的,根据年份获得数据源名称(jndi name),把jndi name存放在ThreadLocal里面。接着就要在获取数据库连接的地方获得这个jndi name。还好,程序员规范遵循得好(真的深深体会编码规范的重要性),大家统一调用同一个类来获得数据库连接,这就好办,在获取数据库连接的地方通过ThreadLocal取回jndi name,这样就获得了正确的数据库连接,代码改动量也不多。
  ThreadLocal的代码如下,很简单:
  public class DnsThread(){
  private static ThreadLocal tl=new ThreadLocal ();//私有静态变量  
  public static Object get(){
  return tl.get();
  }
  public static void set(Object object){
  tl.set(object);
  }  
  }
分享到:
评论

相关推荐

    IE8串session的解决方法

    IE8串session的解决方法

    使用Ajax时处理用户session失效问题的解决方法

    在使用spingMVC的拦截器来处理用户session失效的问题时,当用户session失效会返回一串javascript字符串强制用户浏览器跳转至登录页面。然而当使用Ajax请求数据时,在验证失败后只会响应一串字符串,JavaScript并不会...

    详解.net mvc session失效问题

    主要介绍了.net mvc session失效问题,本文通过问题分析,解决过程分步骤给大家介绍的非常详细,需要的朋友可以参考下

    Asp.net在ashx文件中处理Session问题解决方法

    今天做一个vb.net的登录实例,前台使用Ext中Ajax ,后台用ashx文件处理登录过程,并将用户储存在Session中总是出现在这个错误. [NullReferenceException: 未将对象引用设置到对象的实例。] 从网上查了一下有以下几种...

    ASP.NET在IE10中无法判断用户已登入及Session丢失问题解决方法

    Agent标头字符串,所以无法识别用户浏览器的版本,从而导至了ASP.NET的特定功能失效,认为游览器不支持Cookies功能,不处理与Cookie相关的程式码等,从而在浏览器中不保存服务器返回的Session标识,造成丢失等

    XP网卡占用解决方案

    XP 网卡IP占用解决方法 (2007-03-12 16:59:01) 网卡换了个插槽,进入系统时,设备管理器中就多出了个网卡Realtek RTL8139 Family PCI Fast Ethernet NIC #2 。我在局域网上网,给网卡设置IP地址时,提示冲突信息,...

    javascript使用window.name解决跨域问题第1/2页

    window.name 传输技术,原本是 Thomas Frank 用于解决 cookie 的一些劣势(每个域名 4 x 20 Kb 的限制、数据只能是字符串、设置和获取 cookie 语法的复杂等等)而发明的(详细见原文:《Session variables without ...

    PHP经典实例

    有了这些针对真实问题的解决方案放在手边,大多数编程难题都会迎刃而解。 本书将PHP的特性与经典实例丛书的独特形式组合到一起,足以帮您成功地构建跨浏览器的Web应用程序。在这个修订版中,您可以更加方便地找到...

    net core集成jwt

    随着技术的发展,分布式web应用的普及,通过session管理用户登录状态成本越来越高,...适用于多客户端的前后端解决方案,JWT 是无状态化的,更适用于 RESTful 风格的接口验证。本文主要介绍使用JWT进行接口身份认证。

    史上最全PHP5基础精讲教程

    PHP网站程序乱码问题解决方法.doc PHP表单处理.doc PHP语法-数组.doc PHP随机显示目录下图片的源码.doc strlen与mb_strlen字符串长度函数.doc strtok()函数实际应用.doc 文件函数.txt 研究批量删除数据的方法.doc

    关于JAVA面试的100题及其答案

    多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 2、String是最基本的数据类型吗? 基本数据类型包括byte、int、char、long、float、double、boolean和short。 java.lang....

    超级有影响力霸气的Java面试题大全文档

    多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 5、String是最基本的数据类型吗?  基本数据类型包括byte、int、char、long、float、double、boolean和short。  java....

    JAVA面试题最全集

    写一个方法,实现字符串的反转,如:输入abc,输出cba 写一个方法,实现字符串的替换,如:输入bbbwlirbbb,输出bbbhhtccc。 3.数据类型之间的转换 如何将数值型字符转换为数字(Integer,Double) 如何将数字...

    java 面试题 总结

    多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 2、String是最基本的数据类型吗? 基本数据类型包括byte、int、char、long、float、double、boolean和short。 java.lang....

    Django_CheckCode:本项目是使用最新的Python3.6.1版本编写的在网站后台生成验证码图片的插件,该插件二进制放置项目中app01toolsCheckCode.py文件内,从头至尾均进行注释。以便显示效果,使用Django框架写了一个网站(一切从简,未做任何修饰,一目了然,方便其他人引用)

    1 随机生成的指定位数的字符串,同时将其也保存到session中,用与验证用户输入合法性; 2 将生成的字符串绘制到图片,并将图片保存到二进制类型的的内存IO; 3 返回 生成的字符串 和 图片的二进制流(已保存到内存...

    第24次课-1 Spring与Hibernate的整合

    该接口中只有一个方法doInHibernate(Session session)。 通常,程序中采用实现HibernateCallback的匿名内部类来获取HibernateCallback的实例,方法doInHibernate()就是Spring执行的持久化操作。 24.3 Spring对...

    轻量级数据持久层组件Restful.Data.zip

    Restful.Data充分考虑了实体框架的执行效率问题,进行了反复的推敲和论证,尽可能的采用高效的设计方案来提高性能。谁需要Restful.Data? 敢于冒险、追求完美、勇于挑战并极具责任感的程序设计人员。Restful.Data...

    KODExplorer 芒果云-资源管理器

    ###ver2.61(2014.7.12) ... #### 1.... - Kodexplorer为千帆网络工作室开发的一款服务器文件管理程序。 - 完美取代FTP管理:可用于服务器文件管理,...(字符串转义问题。1&#'[{'"+~%25\\\\ ////) - 文件编辑,添加收藏夹 -...

    ASP.NET编程之道.part1.rar

    这是第一部分,需要两部分一起才能解压 目录: 第1篇 编程经验与感悟篇 第1章 编程感悟6则 感悟01 程序员的成长之路 感悟02 程序员应具备的素质 感悟03 程序员的必备技能 ...第13章 项目中经常用到的20个解决方案

    RapidWebDev框架源码

    实践证明,它可以让项目节省超过50%的代码,并且代码质量和开发效率比其他的解决方案都要高出很多 设置Xml Schema 复制如下XML定义文件(C:\MyProject\RapidWebDev\xml schema\目录下找到它们)到你vs2008的Schemas...

Global site tag (gtag.js) - Google Analytics