url中jsessionid引起的一个问题

XX系统登录之后,偶尔在用户那会出现这个现象: 登录的逻辑是这样的:登陆主界面之后,在主界面html执行到最后的时候,使用windows.open打开一个弹出窗口,去服务器取一些需要的数据。但是偶尔用户那会出现弹出窗口又定位到登陆窗口了(summer中使用filter对请求过滤,发现没有登陆的话会重新定位到登陆窗口)。这里明明是的刚登陆的程序,却出现没有登陆的现象。。这个现象在用户那一直就存在,一直也没找到原因。今天在和三期应服推广人员的沟通中无意了解到,用户习惯使用给登陆界面建立一个桌面快捷方式,一般操作如下:在ie地址栏输入“http://localhost:8080/spxt”,这个时候请求完成之后定位到了登陆页面,但是ie地址栏已经变成 “http://localhost:8080/spxt/common/summer/jsp/login/register03.jsp;jsessionid=CA0CA7E455535994E523B01357B42214” 此时直接在这个ie窗口登陆是没有问题的。而用户一般都是在这个页面点右键,选择创建快捷方式,这个时候就有一个问题,用户的快捷方式超链接实际上指向的是后面那个带有jsessionid的很长很长的url。如果此时从桌面点击这个超链接的快捷方式打开ie进行登陆,就很容易复现文章开始的那个截图现象了,如果我修改快捷方式属性,把超链接的 sessionid去掉就没有问题了。(这里描述不是很准确,比如重启一次tomcat的话就又不会复现了)。后来在后台打印每次使用的sessionid,发现如果从快捷方式登陆的话,真正的登录session就是jsessionid所代表的那个session,而后来ajax 请求的是和服务器新建了连接,发现session没有登陆信息就定位到登陆页面了。 这里在服务器端“可能”是产生两个session的概念:一个是本次真正登录的session;另外是一个空的session。而在ajax异步请求的时候,实际上用的就是后面这个空的session,这样发现没有登陆就重新定位到登陆页面了? 后面原因的分析完全是自己的猜测,具体望大家指教一下:) 解决问题可以这样:1、帮用户把那个快捷方式的jsessionid去掉。 2、写一个filter,对于是登陆请求的,把jsessionid去掉。 ps:以上问题对于收藏夹存在同样问题。 看了帖子终于明白jsessionid是怎么来的了~多谢在struts的org.apache.struts.action.RequestProcessor.processForwardConfig()中找到了如下代码: response.sendRedirect(response.encodeRedirectURL(uri)); 不过感觉一般情况还是不要去掉jsessionid比较好,对于特殊情况的需要特殊去掉,基本还是利大于弊。

 

转帖地址:http://www.blogjava.net/midstr/archive/2009/02/25/256596.html

你可能感兴趣的:(其他)