一、单点登录介绍

  单点登录(Single Sign On),简称为 SSO,是目前比较流行的企业业务整合的解决方案之一。SSO的定义是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。

  同域下:单点登录是巧用了Cookie顶域的特性。

  不同域下:如果是不同域呢?不同域之间Cookie是不共享的,怎么办? 这个是使用CAS流程,单点登录的标准流程。

  相关详情:https://yq.aliyun.com/articles/636281 

        https://blog.csdn.net/qq_34246546/article/details/79493208

二、同域下的单点登录:利用sessionID+cookie+redis

 注意:因为我们是通过cookie的顶域特性,所以需要通过域名访问才能生成指定的cookie名称mmall_login_token 的cookie

自定义域名相关集群和负载均衡:https://www.cnblogs.com/FondWang/p/11677319.html

1. cookie工具类

package com.mmall.util;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils; import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse; /**
* cookie工具类
*/
@Slf4j
public class CookieUtil {
private static final String COOKIE_DOMAIN = "wangjun.com"; //顶级域名
private static final String COOKIE_NAME = "mmall_login_token";//cookieName /**
* 从请求中读取cookie
* @param request
* @return
*/
public static String readLoginToken(HttpServletRequest request){
Cookie[] cks = request.getCookies();
if (cks != null){
for (Cookie cookie : cks){
log.info("read cookieName:{}, cookieValue:{}",cookie.getName(),cookie.getValue());
if (StringUtils.equals(cookie.getName(),COOKIE_NAME)){
log.info("return cookieName:{}, cookieValue:{}",cookie.getName(),cookie.getValue());
return cookie.getValue();
}
}
}
return null;
} /**
* 写入cookie
* @param response
* @param token
*/
public static void writeLoginToken(HttpServletResponse response, String token){
Cookie cookie = new Cookie(COOKIE_NAME, token);
cookie.setDomain(COOKIE_DOMAIN);
cookie.setPath("/"); //代表根目录,根目录以下的代码和页面可以获取到cookie //单位秒,如果不设置maxage,cookie就不会写入硬盘,而是写入内存,只在当前页面有效
cookie.setMaxAge(60 * 60 * 24 * 365);
log.info("write cookieName:{}, cookieValue:{}", cookie.getName(),cookie.getValue());
response.addCookie(cookie);
} /**
* 删除cookie
* @param request
* @param response
*/
public static void delLoginToken(HttpServletRequest request, HttpServletResponse response){
Cookie[] cks = request.getCookies();
if (cks != null){
for (Cookie cookie : cks){
if (StringUtils.equals(cookie.getName(),COOKIE_NAME)){
cookie.setDomain(COOKIE_DOMAIN);
cookie.setPath("/");
cookie.setHttpOnly(true); //无法用脚本访问cookie。当然不能全面防止,但可以提高安全性
cookie.setMaxAge(0);//设置为0,代表删除此cookie
log.info("del cookieName:{}, cookieValue:{}", cookie.getName(),cookie.getValue());
response.addCookie(cookie);
return;
}
}
} }
}

2. redis相关内容

  (1)使用集群:https://www.cnblogs.com/FondWang/p/11690791.html

  (2)单机redis:https://www.cnblogs.com/FondWang/p/11681222.html

3. json对象转换

  作用:将登录信息转换陈json,存储到redis中。

  https://www.cnblogs.com/FondWang/p/11703197.html

4. 登录代码

@Controller
@RequestMapping("/user/")
public class UserController { @Autowired
private IUserService iUserService;
/**
* 用户登录
* @param username
* @param password
* @param session
* @return
*/
@RequestMapping(value = "login.do",method = RequestMethod.POST)
@ResponseBody
public ServiceResponse<User> login(String username, String password, HttpSession session, HttpServletResponse httpServletResponse){
ServiceResponse<User> response = iUserService.login(username, password);
if (response.isSuccess()){
CookieUtil.writeLoginToken(httpServletResponse,session.getId()); //将内容写入cookie中
RedisShardedPoolUtil.setEx(session.getId(), JsonUtil.obj2String(response.getData()), Const.RedisCacheExtime.REDIS_SESSION_EXTIME);
}
return response;
} /**
* 登出 删除session
* @param httpServletRequest
* @return
*/
@RequestMapping(value = "logout.do",method = RequestMethod.POST)
@ResponseBody
public ServiceResponse<String> logout(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse) {
String loginToken = CookieUtil.readLoginToken(httpServletRequest); //获取cookie的sessionID,如果存在,删除登出
CookieUtil.delLoginToken(httpServletRequest,httpServletResponse); //删除cookie中对应的token用户信息
RedisShardedPoolUtil.del(loginToken); //删除对应redis的用户信息
return ServiceResponse.createBySuccess("已登出");
}
}

三、不同域下的单点登录

  待更新

redis缓存+session 实现单点登录的更多相关文章

  1. springcloud微服务基于redis集群的单点登录

    springcloud微服务基于redis集群的单点登录 yls 2019-9-23 简介 本文介绍微服务架构中如何实现单点登录功能 创建三个服务: 操作redis集群的服务,用于多个服务之间共享数据 ...

  2. Django之使用redis缓存session,历史浏览记录,首页数据实现性能优化

    Redis缓存session 配置Django缓存数据到redis中 # diango的缓存配置 CACHES = { "default": { "BACKEND&quo ...

  3. TP、PHP同域不同子级域名共享Session、单点登录

    TP.PHP同域不同子级域名共享Session.单点登录 目的: 为了部署同个域名下不同子级域名共享会话,从而实现单点登录的问题,一处登录,同域处处子系统即可以实现自动登录. PHP支持通过设置coo ...

  4. Redis缓存Mysql模拟用户登录Java实现实例[www]

    Redis缓存Mysql模拟用户登录Java实现实例 https://jingyan.baidu.com/article/09ea3ede1dd0f0c0aede3938.html redis+mys ...

  5. SpringBoot 整合Shiro实现动态权限加载更新+Session共享+单点登录

    作者:Sans_ juejin.im/post/5d087d605188256de9779e64 一.说明 Shiro是一个安全框架,项目中主要用它做认证,授权,加密,以及用户的会话管理,虽然Shir ...

  6. 如何通过session控制单点登录

    web服务器为每一个浏览器实例对应一个session.这个session有自己的一个独立id,这个id保存在浏览器的cookie中(这个cookie貌似随着这个浏览器实例的关闭而清除),访问web服务 ...

  7. Thinkphp3.2 Redis缓存session

    Thinkphpsession缓存没有redis类库 Redis.class.php放在Library/Think/Session/Driver/下: <?php /** * +-------- ...

  8. session 控制单点登录

    在我登录成功之后,我会 session.setAttribute("user", userMap);//设置session 所以就写了一个监听器来控制登录的. package or ...

  9. Redis缓存Mysql模拟用户登录Java实现实例

    https://blog.csdn.net/suneclipse/article/details/50920396

随机推荐

  1. zookeeper 单机. 集群环境搭建

    zookeeper分布式系统中面临的很多问题, 如分布式锁,统一的命名服务,配置中心,集群的管理Leader的选举等 环境准备 分布式系统中各个节点之间通信,Zookeeper保证了这个过程中 数据的 ...

  2. scrapy-redis分布式爬取猫眼电影

    能够利用redis缓存数据库的优点去重来避免数据的大面积冗余 1.首先就是要创建猫眼爬虫项目 2.进入项目内部创建一个爬虫文件 创建完文件之后就是要爬取的内容,我这边以爬取猫眼电影的title和lin ...

  3. 如何在Centos服务器上搭建起Oracle10、VNC、以及FTP

    一.重装和分区 1.配置所需磁盘阵列(Raid): 2.正确分区: 3.Centos安装:过于简单,请自行bd. 二.连网 系统安装完成之后,我们需为其分配IP和DNS: "编辑连接&quo ...

  4. FreeSql (二十四)Linq To Sql 语法使用介绍

    原本不支持 IQueryable 主要出于使用习惯的考虑,如果继承 IQueryable,编写代码的智能总会提示出现一堆你不想使用的方法(对不起,我有强迫症),IQueryable 自身提供了一堆没法 ...

  5. Spring MVC+ajax进行信息验证

    本文是一个ajax结合Spring MVC使用的入门,首先我们来了解一下什么是Ajax AJAX 不是新的编程语言,而是一种使用现有标准的新方法.AJAX 最大的优点是在不重新加载整个页面的情况下,可 ...

  6. charles 重写工具/rewrite Srttings

    本文参考:charles 重写工具 rewrite Srttings 重写工具/rewrite Srttings and rewrite rule 功能:在通过charles时修改请求和响应 重写工具 ...

  7. 模板引擎Velocity学习系列-#set指令

    #set指令 #set指令用于向一个变量或者对象赋值. 格式: #set($var = value) LHS是一个变量,不要使用特殊字符例如英文句号等,不能用大括号括起来.测试发现#set($user ...

  8. Day 2 总结

  9. SQL手工注入进阶篇

    0.前言 上一篇我们介绍了SQL手工注入的流程以及步骤,但在实际的安全问题以及CTF题目中,查询语句多种多样,而且是肯定会对用户的输入进行一个安全过滤的,而这些过滤并不一定是百分百安全的,如何利用一些 ...

  10. Winform去掉标题栏后移动窗体

    第一步:声明全局变量->  private Point _HoverTreePosition; 第二步: #region 隐藏标题栏后移动窗口 private void Form_HoverTr ...