两个系统进行集成
1.工作中遇到项目集成,但这种集成又不同于单点登录的集成:用户从A项目的登陆界面登陆,点击登录按钮后,先登录B系统,B系统登录成功再登录A系统,否则不登陆A系统,提示用户登陆失败;登陆成功后,展示的页面以A系统为主,部分功能点需要从B系统获取,保存数据时数据需同时保存到A系统和B系统对应的数据库中。这是项目集成的基本需求。
2.登陆的集成:
用户登陆A系统容易解决,只需按原来的登陆处理即可。B系统的登陆不太好处理,涉及到登陆用户信息存储在session的问题,用户登录B系统并不会返回页面,所以session信息很容易丢失,导致的结果就是用户登陆完成后,B系统并没有用户登录的session信息(或者说找不到用户的session信息)。
最终采用了心跳机制,即用户完成登录后,进入A系统的主页面,在A系统主页面获取B系统的心跳页面,并嵌套进A系统的主页面中,心跳页面如下:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <title>heartbeat</title> <dt:comppath></dt:comppath> <script type="text/javascript" src="../js/core/dt.util.js"></script> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <meta http-equiv="Cache-Control" CONTENT="no-store" /> <meta http-equiv="Pragram" CONTENT="no-cache" /> <meta http-equiv="Expires" CONTENT="no-store" /> <meta http-equiv="refresh" content="1200" /> </head> <body> </body>
</html>
该页面每隔20分钟刷新一次,通过不停的刷新保证用户登录B系统的session信息有效。
登录的处理:用户点击登录按钮,通过jquery的ajax函数将用户名和密码传递到B系统,进行登录处理,之后将登录结果返回,由于是两个不同的项目,相当于跨域,所以返回值时需要加上
HttpServletResponse response = ServletActionContext.getResponse(); response.setHeader("Access-Control-Allow-Origin", "*");
否则数据返回不过去。
3.功能集成的处理
由于两个系统部署在同一台服务器上,ip地址和端口号都一致,所以在A系统访问B系统的页面时,只需在url前边添加B系统部署项目名即可,如访问A系统的url为:Home!getPara.action,访问B系统的url即为:/B/Home!getPara.action,如此在A系统页面即可随意访问B系统的相关action方法