最近做了一个J2EE的项目,门户需要将我们的项目集成进去,但在集成时,出现问题了,单点登录完成后,后续的请求从session里取得登录信息时,却取不到,经过调试发现,request.getServerName()取得值,不是从门户来的ip,而是本机的ip,测试发现,启动项目,如果用域名访问,request.getServerName()就是域名,用ip,该值就是ip,该值一般与浏览器地址栏一致的,因这个值在我们的jsp页面会用到
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
造成在二次请求时,html的基地址成了本机地址,在浏览器中就会根据请求地址生成cookie的code不同,当然在获取session时,也是不同的,后续是拿不到第一次请求生成的session中的登录信息的。
因门户与我们不是同一个公司做的项目,我们的应用没法与他们的门户应用集成,就成了件扯皮的事,我说你得将你门户代理中,将serverName改一下,应该就没事了,但他们说改不了,而且还说别的应该都已经集成进来了,还说让我们改程序,可是要知道,我们的所有页面都有这个,那意味着,改后所有的功能都得测试一遍,这个代价太大了,所以没答应。
一个偶然事件,我发现了一个同样的问题,公司内网安装了一个正在开发的应该,因需要这个应该在外网访问,就让网管把此应该弄个外网的ip,在访问该应用时,发现在内网可以正常访问,但在用外网ip时,登录后就会现登录不成功,在外网访问时,网页不正常图2
我就觉得这跟上面的问题可能是一样的,在页面中右键,查看源码
果然是访问地址与base地址不一样,我觉得有戏,与是找网管,问他这个代理是用什么软件做的,他说是ISA,我就让网管打开这个软件的设置,看到了一项“转发初始主机头”,让他给勾选上
再试一下,果然有戏,一切正常,再看一下源码
访问的ip与base中的ip一样了,很高兴,把这个解决问题的过程发给门户网站的人,他们看后,就协调了他们公司的人,重新设置了一下,联调成功