很簡單,就是需要操作redis時,子系統向redis主機發送請求,主機執行操作。
單點登錄界面:
<ul>
<li>
<a onclick="gotoOtherSys('http://192.168.1.45:8888/system1/login.action');" href="#" class="example">
<img src="<%=path %>/images/home-img01.png" />
<br />子系統1
</a>
</li>
<li>
<a onclick="gotoOtherSys('http://127.0.0.1:8081/system2/login.action');" href="#" class="example">
<img src="<%=path %>/images/home-img02.png" />
<br />子系統2
</a>
</li>
</ul>
<form name ='formToOther'method="post" action="" target="_blank">
<input name='ticket' id='ticket' type="hidden" value="" />
</form>
js方法:
function gotoOtherSys(sysURL){
$.ajax({ //跳轉多tab頁
url: "<%=path%>/gotoOtherSys.action",
data: { },
dataType:"text",
type:"POST",
cache: false,
success: function (ticket) {
// alert(ticket);
$("#ticket").val(ticket);
document.formToOther.action=sysURL;
document.formToOther.submit();
// window.open(url);
},
error: function (jqXHR, textStatus, errorThrown) {
alert("發送失敗!");
}
});
};
action:
/**
* 向其他系統的跳轉
*
* */
@RequestMapping(value = { "/gotoOtherSys.action" })
@ResponseBody
public String gotoOtherSys(HttpServletRequest request, HttpServletResponse response) {
SystemUser systemUser = getLoginUser(request);
String ticket = ticketService.getTicket(systemUser.getUserid());
return ticket;
}
service:
public String getTicket(String userId);
serviceimp:
@Override
public String getTicket(String userId) {
// TODO Auto-generated method stub
String uuid = StringNumberUtil.getUUID();
RedisModel redis =new RedisModel();
redis.setKey(uuid);
redis.setObj(userId);
redis.setSeconds(60*60*24);
String redisResult = jedisClientSingleService.set(redis);
if("faile".equals(redisResult.toLowerCase())){
return "";
}else{
return uuid;
}
}
jedisClientSingleService.set():
/**
* 往redis緩存中添加數據
*/
@Override
public String set(RedisModel redis) {
Jedis jedis = jedisPool.getResource();
String string = "faile";
try {
if (redis != null) {
String key = redis.getKey();
Integer seconds = redis.getSeconds();
string = jedis.set(key.getBytes(), ObjectsTranscoder.getInstance().serialize(redis.getObj()));
if (seconds != null) {
jedis.expire(key.getBytes(), seconds);
}
}
} catch (Exception e) {
} finally {
jedis.close();
}
return string;
}
單點登錄子系統中:
配置文件aaaconfig加入sso中的請求路徑:
SSOToOtherSystem=http://127.0.0.1:8088/sso/toOtherSystem.action
SSOGetUserId=http://127.0.0.1:8088/sso/getUserId.action
建立常亮文件:Common.java
public static final String SYSPEIZHI ="aaaconfig";
然后子系統的登錄功能,在sso上進行redis的訪問和操作
代碼:
//通過憑證登錄
if(ticket != null && !"".equals(ticket) ){//2017年4月1日17:35:44添加
try {
//從配置文件里讀取SSO的跳轉路徑
Properties aaaconfig= new GetProperty().bornProp(Common.SYSPEIZHI, null);
String reqURL = aaaconfig.getProperty("SSOGetUserId") == null ? "": aaaconfig.getProperty("SSOGetUserId");
//向SSO服務器發送請求獲取userId
HashMap params = new HashMap();
params.put("ticket", ticket);
String userId =HttpClientUtil.sendPostRequest(reqURL, params, "gb2312",null);
//2017年4月5日14:46:56 添加
//判斷ticket取出來的userid不為“”或null,則為有效。
if(userId !=null && !"".equals(userId) ){
//找出用戶
systemUser = SystemUserService.getByUserId(userId);
}
} catch (Exception e) {
e.printStackTrace();
// 如果連接出錯
validateInputOK = false;
validateErrorInfo = "系統出錯";
}
}
// 比對密碼,執行登錄操作
if (null != systemUser) {
// 攔截已刪除和已鎖定用戶
String islocked = systemUser.getIslocked();
String delflag = systemUser.getDelflag();
if (null != islocked && islocked.equals("1")) {
// 已鎖定,已調離
validateInputOK = false;
validateErrorInfo = "用戶已調離";
} else if (null != delflag && delflag.equals("1")) {
// 已刪除
validateInputOK = false;
validateErrorInfo = "用戶已刪除";
} else {
String userPassword = systemUser.getPassword();
// 對比密碼,判斷是否登錄成功
loginSuccess = PasswordUtil.passwordCheck(password,
userPassword);
if (!loginSuccess) {
// 密碼錯誤
validateInputOK = false;
validateErrorInfo = "密碼錯誤";
}
}
} else if (validateInputOK) {
// 用戶不存在
validateInputOK = false;
if (loginType_USBKEY.equalsIgnoreCase(loginType)) {
validateErrorInfo = "證書未綁定";
} else {
validateErrorInfo = "用戶不存在";
}
}
// 根據成功與否,執行定向操作
if (loginSuccess) {
// 登陸成功
view = generateView(request);
// 要求簡單直接, 使會話失效,再新創一個會話即可
HttpSession session = request.getSession(true);
// yuan
session.invalidate();
session = request.getSession(true);
setSessionAttribute(request, "" + SESSION_USER_KEY, systemUser);
// 把用戶放入application作用域中
HashMap<String, HttpSession> mymap = new HashMap<String, HttpSession>();
mymap.put(userName, request.getSession());
request.getSession().getServletContext().setAttribute(
"sysName", mymap);
final int aliveTimeSeconds = 100 * 24 * 60 * 60;
setSessionAliveTime(request, aliveTimeSeconds);
// 添加到在線用戶列表
addOnlineUser(request, systemUser);
StringNumberUtil.addCookie("userName", systemUser.getUserid(),
60 * 60 * 24 * 365, response);// 保存用戶名
addOnlineLog(systemUser, "登錄成功");
}
else {
addOnlineLog(systemUser, validateErrorInfo + ";userName="
+ userName, getLogtype(), 0);
}
系統登出代碼:
/**
* 登出
*
* @return
*/
@RequestMapping(value = { "/logout", "/lackauth" })
public ModelAndView logout(HttpServletRequest request,
HttpServletResponse response) {
//
// String myname = LogUtil.getMyName();
SystemUser systemUser = getLoginUser(request);
//更新用戶界面設置
SystemUser updateUser=new SystemUser();
String theme = request.getParameter("theme");
if(StringNumberUtil.notEmpty(theme) && null != systemUser){
updateUser.setUserid(systemUser.getUserid());
updateUser.setText1(theme);
this.SystemUserService.updateByPrimaryKeySelective(updateUser);
}
// 移除在線用戶列表
removeOnlineUser(request, systemUser);
// 執行 注銷操作
// 如果考慮擴展,不能直接操作 session
setSessionAttribute(request, SESSION_USER_KEY, null);
// 如果要求簡單直接, 使會話失效、再新創一個會話即可
HttpSession session = request.getSession(true);
session.invalidate();
session = request.getSession(true);
// ...
addOnlineLog(systemUser, "退出登錄");
//
request.getSession().getServletContext().setAttribute("sysName", null);
View view = new InternalResourceView("/login.jsp");
ModelAndView mav = new ModelAndView(view);
mav.addObject("tip", "退出登錄成功");
return mav;
}
子系統間跳轉:
子系統加入:
/2017年4月5添加
@RequestMapping(value = { "/toOtherSystem" })
public ModelAndView toOtherSystem(HttpServletRequest request, HttpServletResponse response , ModelMap model) {
SystemUser systemUser = getLoginUser(request);
String url = request.getParameter("url");
//從配置文件里讀取SSO的跳轉路徑
Properties aaaconfig= new GetProperty().bornProp(Common.SYSPEIZHI, null);
String ssoToOtherSystem = aaaconfig.getProperty("SSOToOtherSystem") == null ? "": aaaconfig.getProperty("SSOToOtherSystem");
ModelAndView mav= new ModelAndView(new RedirectView(ssoToOtherSystem ));
model.put("userId", systemUser.getUserid());
try {
mav.addObject("url", URLEncoder.encode(url, "UTF-8"));
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return mav;
}