1:什么是单点登录?

答:单点登录的英文名叫做:Single Sign On(简称SSO

一般我们的模块都是在同一个系统下,同一个tomcat(如图,以商城为例)

后来为了维护和资源我们把一个系统拆成多个子系统。

而单点登录就是其中的一部分。

我们有多个系统,每个系统都要输入一次账号和密码的话就会变得很麻烦,这时候就需要单点登录,只要其中一个子系统登录的话,其他系统都能自动登录。最为熟悉的例子就是淘宝和天猫,如果你淘宝登录后,打开天猫就能自动登录无需再输入账号和密码。

2:实现单点登录的思路(整个页面的流程)

假设两个页面

用户A系统没登陆,B系统没登陆

这时用户在A登陆,A生成token令牌存入cookie,redis存入已经登录参数

然后用户打开B系统登录页面,B系统登录页面发送请求,后端通过cookie获取到用户在A系统登录的信息

判断获取到的信息没有错误进行自动登陆

3:Demo代码(两个页面的代码是一样的,路径什么的改改就行了)

简单的登陆jq,ajax请求

前端

<body background="jquery/loginbg.jpg">
<div>
<form  style="margin: auto; width:230px" class="form-signin"  >
<h2 class="form-signin-heading"><font color="white">SSO1用户登录</font></h2>
<!-- <label>账号:</label> -->
<input type="text" id="txtUsername" class="form-control" name="username" placeholder="请输入账号" /><br/>
<!-- <label>密码:</label> -->
<input type="password" id="txtPassword" class="form-control" name="password" placeholder="请输入密码" /><br/>
<!-- <input type="submit" value="提交" /> --><a class="btn btn-primary btn-block" id="tijiao">提交</a><br>
<!-- <button class="btn btn-primary btn-block"  id="tijiao">提交</button><br> --><button class="btn btn-primary btn-block"  >重置</button><br>
<!-- <input type="reset" value="重置" /> -->
<input type="button" class="btn btn-primary btn-block" value="注册" onclick="window.location.href='add.jsp';"/>
</div>
<div id="chartmain" style="width:600px; height: 400px;  margin: auto; " class="form-signin"></div></body>
<script type="text/javascript">$("#tijiao").click(function(){var paramMap = {};paramMap.username = $("#txtUsername").val();paramMap.userpasswd = $("#txtPassword").val();$.ajax({type:'POST',data:JSON.stringify(paramMap),dataType:'JSON',url:"user/slogin",contentType :"application/json;charset=UTF-8",async: true,error:function(jqXHR){alert("发生错误:"+ jqXHR.status); },success:function(data){if(data){if(data.state == "success"){window.location.href ='index.jsp';}else if(data.state == "fault"){window.location.href ='login.jsp';} }}});})window.onload = function(){var paramMap = {};var i = 0;paramMap.username = $("#txtUsername").val();paramMap.userpasswd = $("#txtPassword").val();$.ajax({type:'POST',data:JSON.stringify(paramMap),dataType:'JSON',url:"user/slogin",
//          xhrFields: {//              withCredentials: true // 携带跨域cookie
//          },contentType :"application/json;charset=UTF-8",async: true,error:function(jqXHR){alert("发生错误:"+ jqXHR.status); },success:function(data){if(data){if(data.state == "success"){window.location.href ='index.jsp';}else if(data.state == "fault"){debugger;var str=location.href; //取得整个地址栏var num=str.indexOf("=") str=str.substr(num+1);if(str!="1"||str==null){window.location.href ='login.jsp?state=1';}} }}});
}
</script>

后端

 /*** 登陆* @param <Account>* @param model* @param session* @return* @throws Exception */@ResponseBody@RequestMapping(value = "/slogin", method = RequestMethod.POST)public ResultInfo slogin(@RequestBody Map<String, String> param,HttpSession session, HttpServletRequest request,ServletResponse response, HttpServletResponse responses)throws Exception {ResultInfo resultinfo = new ResultInfo();/*** 判断redis是否连接成功*///连接本地的 Redis 服务@SuppressWarnings("resource")Jedis jedis = new Jedis("localhost");System.out.println("连接成功");//用户验证String username = param.get("username");String passwd = param.get("userpasswd");if(jedis.exists("islogin")){//判断是否已经登录if(!jedis.get("islogin").equals("1")){// TODO: handle exceptionresultinfo.setState(StateType.fault);jedis.set("islogin", "0");}}else if(!jedis.exists("islogin") && username.length()==0 && passwd.length()==0){resultinfo.setState(StateType.fault);return resultinfo;}/*** 从cookie中获取数据*/Cookie[] cookies = request.getCookies();System.out.println(cookies);String cookievalue = null;for(Cookie cookiexs : cookies){if(cookiexs.getName().equals("token")){cookievalue = cookiexs.getValue();break;}}if(cookievalue!=null){//base64解密String decusername = null;String decpasswd = null;int a = 1;byte[] decoded = Base64Utils.decode(cookievalue.getBytes());String decodeStr = new String(decoded,"UTF-8");System.out.println("Base 64 解密后:" + decodeStr);//获取用户名和密码for(int i=-1; i<=decodeStr.lastIndexOf("=");++i){i=decodeStr.indexOf("=",i);System.out.print(i+"\t");if(a==1){decusername = decodeStr.substring(i, i);a++;}else if(a>1){decusername = decodeStr.substring(5,i-6);decpasswd = decodeStr.substring(i+1, decodeStr.length()-6);a=1;}System.out.println("账号为:"+decusername+"\t"+"密码为:"+decpasswd);}username = decusername;passwd = decpasswd;}try {if(username  != "" && passwd !=""){User user = userService.loginUsername(username);if(user ==null){resultinfo.setState(StateType.fault);jedis.set("islogin", "0");return resultinfo;}else if(!user.getPassword().equals(passwd)){resultinfo.setState(StateType.fault);jedis.set("islogin", "0");return resultinfo;}//设置tokenString token = tokenset(user);//将数据保存到cookie中Cookie cookie = new Cookie("token", token);//cookie.setMaxAge(600);responses.addCookie(cookie);//将token发送给客户端,附带本次全局会话的sessionId//String allSessionId=request.getSession().getId();//获取sessionidString sessionid = session.getId();//设置状态(通过session判断该浏览器与认证中心的全局会话是否已经建立),生成令牌//判断用户是否登录request.getSession().setAttribute("isLogin", username);Map<String, String> tosession = new HashMap<String, String>();tosession.put("sessionid", sessionid);jedis.set("islogin", "1");jedis.set(token,username+passwd);jedis.expire("islogin", 120);
//              jedis.expire("token", 600);resultinfo.setData(token);resultinfo.setState(StateType.success);}if(jedis.get("islogin").equals("1")){resultinfo.setState(StateType.success);}else{resultinfo.setState(StateType.fault);}} catch (Exception e) {// TODO: handle exceptionresultinfo.setState(StateType.fault);resultinfo.setData(e.toString());}return resultinfo;}
     /*** 设置token*/private String tokenset(User user) {// TODO Auto-generated method stubString token = null;String sign = "hitomi";String param = "name="+user.getUsername()+"passwd="+user.getPassword()+sign;token = Base64Utils.encodeToString(param.getBytes());return token;}

此代码只是简单的实现单点登录的思路和功能,仅供参考

JAVA SSM框架+Redis 实现单点登录相关推荐

  1. vue java实现登录_SpringBoot+Vue+Redis实现单点登录(一处登录另一处退出登录)

    一.需求 实现用户在浏览器登录后,跳转到其他页面,当用户在其它地方又登录时,前面用户登录的页面退出登录(列如qq挤号那种方式) 二.实现思路 用户在前端填写用户信息登录后,后台接收数据先去数据库进行判 ...

  2. Java Spring Cloud XII 之 单点登录

    Java Spring Cloud XII 之 单点登录 单点登录 1.用户\角色\权限 用户是一个基本的单位 我们登录时都是在登录用户的 我们再登录后需要明确这个用户具有哪些角色 用户和角色的关系是 ...

  3. 基于javaweb+mysql的网上水果超市商城设计和实现(java+ssm+springboot+redis)

    基于javaweb+mysql的网上水果超市商城设计和实现(java+ssm+springboot+redis) 运行环境 Java≥8.MySQL≥5.7 开发工具 eclipse/idea/mye ...

  4. 使用Java+SSM框架+JSP开发简单在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户、物品的协同过滤推荐算法 大数据 机器学习 SimpleMovieRecommendOnline

    使用Java+SSM框架+JSP开发简单在线电影推荐网 电影推荐系统 豆瓣电影爬虫 基于用户.物品的协同过滤推荐算法 大数据 机器学习 SimpleMovieRecommendOnline 一.项目简 ...

  5. (精品)JAVA SSM框架黄淮学院食堂仓库管理系统的设计与实现源码+论文+查重报告+效果、安装视频+ppt模板(已降重)

    项目介绍: (精品)JAVA SSM框架黄淮学院食堂仓库管理系统的设计与实现源码+论文+查重报告+效果.安装视频+ppt模板(已降重) 高清视频演示: https://www.bilibili.com ...

  6. java ssm框架的点歌系统的设计与实现源码

    项目名称 java ssm框架的点歌系统的设计与实现源码 下载地址 下载地址 系统说明 4.2 系统功能 4.2.1 登录与注册功能 系统的登录分为了前台登录和后台登录两个模块,都分别处在不同的界面上 ...

  7. 基于java SSM框架的游戏商城系统

    今天给大家介绍一个使用java SSM框架的游戏商城系统,案例比较典型,更换一些内容可以作为其他商品的商城系统使用,话不多说上截图: 技术描述 开发工具: idea 数据库: mysql Jar包仓库 ...

  8. 基于java SSM框架+微信小程序实现电子书城阅读器演示【附项目源码+论文说明】分享

    基于java SSM框架+微信小程序实现电子书城阅读器演示 摘要 而随着互联网技术的不断发展,互联网已经渗入到我们生活中的各个方面.移动设备的普及使我们的生活发生了翻天覆地的变化,这种变化也深刻影响着 ...

  9. 基于java SSM框架+微信小程序实现电子书城阅读器演示【附项目源码+论文说明】

    基于java SSM框架+微信小程序实现电子书城阅读器演示 摘要 而随着互联网技术的不断发展,互联网已经渗入到我们生活中的各个方面.移动设备的普及使我们的生活发生了翻天覆地的变化,这种变化也深刻影响着 ...

最新文章

  1. vs2008中js的语法提示及修正功能(downmoonn)
  2. 青藏高原地下巨型空间形成原因
  3. AtCoder Beginner Contest 215 G - Colorful Candies 2
  4. Appcan开发笔记:导出Excel文件
  5. 通过wifi调试Android程序
  6. razor java,如何在Razor中声明局部变量?
  7. Renting Boats
  8. python管道怎么使用_python中管道用法入门实例
  9. 2017 Multi-University Training Contest - Team 7:1005. Euler theorem(答案是(n+3)/2)
  10. linux配置端口映射
  11. Cortex-M3 (NXP LPC1788)之GPIO
  12. 【flash】 水果忍者
  13. 华为荣耀android进入,EMUI 9.1公测招募开启 华为荣耀14款机型获支持
  14. Matlab如何进行利用离散傅里叶变换DFT (快速傅里叶变换FFT)进行频谱分析
  15. ICM-42670-P 六轴运动传感器 TDK ICP-10740 气压计实现运动监测
  16. Linux内网离线安装nginx(rpm包安装方式)
  17. 计算机网考里操作题发邮件,计算机网考操作题题型.doc
  18. 【华为云技术分享】如何将90%的代码自动迁移到鲲鹏平台上
  19. 【EI会议推荐】第四届机器人、智能控制与人工智能国际学术会议(RICAI 2022)
  20. react 项目环境搭建和ant design组件使用全攻略详解

热门文章

  1. [转载] StringBuffer和StringBuilder类
  2. [转载] Java中变量与常量
  3. Java Hashtable keySet()方法与示例
  4. Kotlin程序用于打印JVM版本的Kotlin(打印Java属性)
  5. hypot函数_hypot()函数与C ++中的示例
  6. cad安装日志文件发生错误_苹果电脑Mac os系统重装时出现“准备安装时发生错误”解决方案...
  7. java 字节数组作用_这段java代码中字节数组b起到了什么作用?
  8. 图片md5修改工具_如何修改视频和图片的MD5,用电脑自带的命令
  9. oracle 增量_【干货分享】DMETL中的增量抽取初识
  10. 手机子王掩码和网关查找_C程序使用位掩码查找奇数或偶数