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比较好,对于特殊情况的需要特殊去掉,基本还是利大于弊。
posted on 2009-02-25 13:40
岁月如歌 阅读(8027)
评论(3) 编辑 收藏 所属分类:
java