什么是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);
}
}
发表评论
-
一个字符串问题的思考
2012-07-06 09:51 496一、 问题描述: 求解给定文本text 中以字符 A ... -
Vim正则表达式查找替换
2012-07-06 09:45 934这里简单的给大家介绍一下Vim的查找替换,众所周知,Vim ... -
使用正则表达式实现表达式计算器
2012-07-06 09:37 1234使用正则表达式实 ... -
VTK使用入门(四)
2012-07-06 09:30 1769#include "vtkDICOMImageR ... -
页面仿百度下拉框,支持动态后台提取数据
2012-07-05 20:44 998.bottom_up { font-family ... -
核心Swing组件(五)
2012-07-03 13:42 563如图4-1所示,AbstractButton类是作用在幕后 ... -
Flex 文件上传导入组件
2012-07-02 10:22 334上文讲到Flex利用Blazeds来上传文件,本文则封装了 ... -
flex分页控件源码
2012-07-02 10:22 563功能说明:只配合服务器端分页。这个分页条是通用的。只需要在 ... -
自定义网页滚动条
2012-07-02 10:21 521用户操作 [留言] [发消息] [加为好友] ... -
Three ways to set a custom busy cursor in flex
2012-07-02 10:21 507First, prepare your custom cu ... -
Android
2012-07-02 09:43 446... -
PHP作为Flex程序的数据源
2012-07-01 09:41 446Adobe Flash Builder 4 简体中文正式版 ... -
Flex和Spring的整合
2012-07-01 09:41 390关于Flex Adobe Flex是一套创建富客户端应用( ... -
实现FLEX 通过AMF跟PHP通信
2012-07-01 09:41 517AMF flex一种远调用 ... -
Java Server Push To Flex (ServerPush)
2012-07-01 09:40 514在网上找了许多的Flex与java 通信做ServerPu ... -
linux 下同名符号冲突问题解决方法
2012-06-30 17:56 1646最近的工作中遇到如下令人蛋疼的问题: linux 下 ... -
在xp和Win7上使用Tomcat 6.0经常遇到的几个问题及其解决方法
2012-06-30 17:56 497在Win7上使用Tomcat 6.0经常会遇到一下几个问题 ... -
找到多个具有相同 ID“_header”的控件。FindControl 要求控件具有唯一的 ID。错误的解决方法!
2012-06-30 17:56 529找到多个具有相 ... -
DB2相关问题及解决方法
2012-06-30 17:56 495DB2相关问题及解决方法: 一、DB2中的代码页( ...
相关推荐
IE8串session的解决方法
在使用spingMVC的拦截器来处理用户session失效的问题时,当用户session失效会返回一串javascript字符串强制用户浏览器跳转至登录页面。然而当使用Ajax请求数据时,在验证失败后只会响应一串字符串,JavaScript并不会...
主要介绍了.net mvc session失效问题,本文通过问题分析,解决过程分步骤给大家介绍的非常详细,需要的朋友可以参考下
今天做一个vb.net的登录实例,前台使用Ext中Ajax ,后台用ashx文件处理登录过程,并将用户储存在Session中总是出现在这个错误. [NullReferenceException: 未将对象引用设置到对象的实例。] 从网上查了一下有以下几种...
Agent标头字符串,所以无法识别用户浏览器的版本,从而导至了ASP.NET的特定功能失效,认为游览器不支持Cookies功能,不处理与Cookie相关的程式码等,从而在浏览器中不保存服务器返回的Session标识,造成丢失等
XP 网卡IP占用解决方法 (2007-03-12 16:59:01) 网卡换了个插槽,进入系统时,设备管理器中就多出了个网卡Realtek RTL8139 Family PCI Fast Ethernet NIC #2 。我在局域网上网,给网卡设置IP地址时,提示冲突信息,...
window.name 传输技术,原本是 Thomas Frank 用于解决 cookie 的一些劣势(每个域名 4 x 20 Kb 的限制、数据只能是字符串、设置和获取 cookie 语法的复杂等等)而发明的(详细见原文:《Session variables without ...
有了这些针对真实问题的解决方案放在手边,大多数编程难题都会迎刃而解。 本书将PHP的特性与经典实例丛书的独特形式组合到一起,足以帮您成功地构建跨浏览器的Web应用程序。在这个修订版中,您可以更加方便地找到...
随着技术的发展,分布式web应用的普及,通过session管理用户登录状态成本越来越高,...适用于多客户端的前后端解决方案,JWT 是无状态化的,更适用于 RESTful 风格的接口验证。本文主要介绍使用JWT进行接口身份认证。
PHP网站程序乱码问题解决方法.doc PHP表单处理.doc PHP语法-数组.doc PHP随机显示目录下图片的源码.doc strlen与mb_strlen字符串长度函数.doc strtok()函数实际应用.doc 文件函数.txt 研究批量删除数据的方法.doc
多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 2、String是最基本的数据类型吗? 基本数据类型包括byte、int、char、long、float、double、boolean和short。 java.lang....
多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 5、String是最基本的数据类型吗? 基本数据类型包括byte、int、char、long、float、double、boolean和short。 java....
写一个方法,实现字符串的反转,如:输入abc,输出cba 写一个方法,实现字符串的替换,如:输入bbbwlirbbb,输出bbbhhtccc。 3.数据类型之间的转换 如何将数值型字符转换为数字(Integer,Double) 如何将数字...
多态性语言具有灵活、抽象、行为共享、代码共享的优势,很好的解决了应用程序函数同名问题。 2、String是最基本的数据类型吗? 基本数据类型包括byte、int、char、long、float、double、boolean和short。 java.lang....
1 随机生成的指定位数的字符串,同时将其也保存到session中,用与验证用户输入合法性; 2 将生成的字符串绘制到图片,并将图片保存到二进制类型的的内存IO; 3 返回 生成的字符串 和 图片的二进制流(已保存到内存...
该接口中只有一个方法doInHibernate(Session session)。 通常,程序中采用实现HibernateCallback的匿名内部类来获取HibernateCallback的实例,方法doInHibernate()就是Spring执行的持久化操作。 24.3 Spring对...
Restful.Data充分考虑了实体框架的执行效率问题,进行了反复的推敲和论证,尽可能的采用高效的设计方案来提高性能。谁需要Restful.Data? 敢于冒险、追求完美、勇于挑战并极具责任感的程序设计人员。Restful.Data...
###ver2.61(2014.7.12) ... #### 1.... - Kodexplorer为千帆网络工作室开发的一款服务器文件管理程序。 - 完美取代FTP管理:可用于服务器文件管理,...(字符串转义问题。1&#'[{'"+~%25\\\\ ////) - 文件编辑,添加收藏夹 -...
这是第一部分,需要两部分一起才能解压 目录: 第1篇 编程经验与感悟篇 第1章 编程感悟6则 感悟01 程序员的成长之路 感悟02 程序员应具备的素质 感悟03 程序员的必备技能 ...第13章 项目中经常用到的20个解决方案
实践证明,它可以让项目节省超过50%的代码,并且代码质量和开发效率比其他的解决方案都要高出很多 设置Xml Schema 复制如下XML定义文件(C:\MyProject\RapidWebDev\xml schema\目录下找到它们)到你vs2008的Schemas...