很简单,就是需要操作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;
}











网友评论