上周五的时候遇到一个问题,平时做项目的时候一直使用的是火狐浏览器,上周完成了一个小论坛的功能,因为访问论坛是不需要的用户登录的,只有发帖和回复的时候才需要用户登录,所以就在系统中加了一个拦截器,发帖时候如果没有登录就跳转到登录页面,功能完成以后在火狐浏览器下面使用完全没问题,平时很少使用IE浏览器,所以也没有在IE下面测试就直接放到服务器上测试了,在服务器上测试的时候还是使用的火狐,也没什么问题,但是我的一个同事去测试的时候就出现了问题,他是使用的IE浏览器,访问的时候明明是不需要用户登录的地方也跳转到了登录页面,功能完全都乱了,一直在跳转登录页面,就开始第一下进入不会出现登录页面,然后不管点击什么按钮都是登录页面。
针对上面的问题我就开始调,开始的时候以为是我的拦截器的问题,但是在使用火狐调的时候完全没问题,然后我就使用IE11开始测试,debug拦截器,然后就发现了一个问题,第一次进入的时候拦截器获取到的路径是/com/action.action,但是点击下一个连接的时候就变成了/com/com/action.action,每点击一个连接都会在方法的前面再加上一个/com,/com是我struts2的命名空间,但是在FF下面测试的时候拦截器每次获取的路径都是/com/action.action,所以在FF下面运行时没问题的。
然后就开始去问度娘怎么解决,度娘给出的答案是IE浏览器在解析window.location.href = url的时候,如果url是相对路径,那么IE浏览器解析的时候是会出现问题的,不能正确访问,由于当时比较着急,所以也就没想那么多,就继续针对这个问题再网上找解决办法,然后就发现了下面的方法:
function getContextPath() { var pathName = document.location.pathname; var index = pathName.substr(1).indexOf("/"); var result = pathName.substr(0,index+1); return result; } var path = getContextPath(); window.location.href = path+"/com/forumAction_list.do";
使用这种方式之后在本地测试不管是IE还是火狐或者谷歌都没问题了,以为问题解决了,然后就在服务器上测试,但是到了服务器上之后所有的浏览器全部不好使了,都是点击一下就会出现登录页面,很郁闷有没有,然后就继续在网上找答案,但是很多都是直接复制上面的方法,根本没有什么实质性的作用,然后在博客园还有CSDN发帖询问,但是也没有得到什么有用的信息,可能大神们都在code/code/code.......,然后就一直拖到了今天,重新看别人发帖询问时的回复,有人说是使用绝对路径可以解决,然后就抱着试一试的心态改了一下,然后就成功了。
解决办法就是使用绝对路径,所以上面的url就可以改成“/项目名称/xxx/xxxAction_xxx.do”,经测试在服务器和本地的IE和火狐还有谷歌都是适应的,在此记录一下,备忘一下,也希望能帮到其他遇到这个问题的人,有问题的地方欢迎大神们指出。