登录的处理流程:

1、登录页面提交用户名密码。

2、登录成功后生成token。Token相当于原来的jsessionid,字符串,可以使用uuid。

3、把用户信息保存到redis。Key就是token,value就是TbUser对象转换成json。

4、使用String类型保存Session信息。可以使用“前缀:token”为key

5、设置key的过期时间。模拟Session的过期时间。一般半个小时。

6、把token写入cookie中。

7、Cookie需要跨域。例如www.e3.com\sso.e3.com\order.e3.com,可以使用工具类。

8、Cookie的有效期。关闭浏览器失效。

9、登录成功。

1.1.1. Service层

参数:

1、用户名:String username

2、密码:String password

返回值:e3Result,包装token。

业务逻辑:

1、判断用户名密码是否正确。

2、登录成功后生成token。Token相当于原来的jsessionid,字符串,可以使用uuid。

3、把用户信息保存到redis。Key就是token,value就是TbUser对象转换成json。

4、使用String类型保存Session信息。可以使用“前缀:token”为key

5、设置key的过期时间。模拟Session的过期时间。一般半个小时。

6、返回e3Result包装token。

@Override

public e3Result login(String username, String password) {

// 1、判断用户名密码是否正确。

TbUserExample example = new TbUserExample();

Criteria criteria = example.createCriteria();

criteria.andUsernameEqualTo(username);

//查询用户信息

List<TbUser> list = userMapper.selectByExample(example);

if (list == null || list.size() == 0) {

return e3Result.build(400, "用户名或密码错误");

}

TbUser user = list.get(0);

//校验密码

if (!user.getPassword().equals(DigestUtils.md5DigestAsHex(password.getBytes()))) {

return e3Result.build(400, "用户名或密码错误");

}

// 2、登录成功后生成token。Token相当于原来的jsessionid,字符串,可以使用uuid。

String token = UUID.randomUUID().toString();

// 3、把用户信息保存到redis。Key就是token,value就是TbUser对象转换成json。

// 4、使用String类型保存Session信息。可以使用“前缀:token”为key

user.setPassword(null);

jedisClient.set(USER_INFO + ":" + token, JsonUtils.objectToJson(user));

// 5、设置key的过期时间。模拟Session的过期时间。一般半个小时。

jedisClient.expire(USER_INFO + ":" + token, SESSION_EXPIRE);

// 6、返回e3Result包装token。

return e3Result.ok(token);

}

发布服务

1.1.2. 表现层

引用服务:

Controller

请求的url:/user/login

请求的方法:POST

参数:username、password,表单提交的数据。可以使用方法的形参接收。

HttpServletRequest、HttpServletResponse

返回值:json数据,使用e3Result包含一个token。

业务逻辑:

1、接收两个参数。

2、调用Service进行登录。

3、从返回结果中取token,写入cookie。Cookie要跨域。

Cookie二级域名跨域需要设置:

1)setDomain,设置一级域名:

.itcatst.cn

.e3.com

.e3.com.cn

2)setPath。设置为“/”

工具类放到e3-common工程中。

4、响应数据。Json数据。e3Result,其中包含Token。

@RequestMapping(value="/user/login", method=RequestMethod.POST)

@ResponseBody

public e3Result login(String username, String password,

HttpServletRequest request, HttpServletResponse response) {

// 1、接收两个参数。

// 2、调用Service进行登录。

e3Result result = userService.login(username, password);

// 3、从返回结果中取token,写入cookie。Cookie要跨域。

String token = result.getData().toString();

CookieUtils.setCookie(request, response, COOKIE_TOKEN_KEY, token);

// 4、响应数据。Json数据。e3Result,其中包含Token。

return result;

}

1.1. 通过token查询用户信息

1.1.1. 功能分析

请求的url:/user/token/{token}

参数:String token需要从url中取。

返回值:json数据。使用e3Result包装Tbuser对象。

业务逻辑:

1、从url中取参数。

2、根据token查询redis。

3、如果查询不到数据。返回用户已经过期。

4、如果查询到数据,说明用户已经登录。

5、需要重置key的过期时间。

6、把json数据转换成TbUser对象,然后使用e3Result包装并返回。

1.1.2. Dao层

使用JedisClient对象。

1.1.3. Service层

参数:String token

返回值:e3Result

@Override

public e3Result getUserByToken(String token) {

// 2、根据token查询redis。

String json = jedisClient.get(USER_INFO + ":" + token);

if (StringUtils.isBlank(json)) {

// 3、如果查询不到数据。返回用户已经过期。

return e3Result.build(400, "用户登录已经过期,请重新登录。");

}

// 4、如果查询到数据,说明用户已经登录。

// 5、需要重置key的过期时间。

jedisClient.expire(USER_INFO + ":" + token, SESSION_EXPIRE);

// 6、把json数据转换成TbUser对象,然后使用e3Result包装并返回。

TbUser user = JsonUtils.jsonToPojo(json, TbUser.class);

return e3Result.ok(user);

}

1.1.4. 表现层

请求的url:/user/token/{token}

参数:String token需要从url中取。

返回值:json数据。使用e3Result包装Tbuser对象。

@RequestMapping("/user/token/{token}")

@ResponseBody

public e3Result getUserByToken(@PathVariable String token) {

e3Result result = userService.getUserByToken(token);

return result;

}

1.1.5. 安全退出

需要根据token删除redis中的key。

Js不可以跨域请求数据。

什么是跨域:

1、域名不同

2、域名相同端口不同。

解决js的跨域问题可以使用jsonp。

Jsonp不是新技术,跨域的解决方案。使用js的特性绕过跨域请求。Js可以跨域加载js文件。

1.1. Jsonp原理

1.1. Json实现

1.1.1. 客户端

使用jQuery。

1.1.2. 服务端

1、接收callback参数,取回调的js的方法名。

2、业务逻辑处理。

3、响应结果,拼接一个js语句。

sso系统登录以及jsonp原理的更多相关文章

  1. SSO 单点登录的实现原理

    单点登录SSO(Single Sign On)说得简单点就是在一个多系统共存的环境下,用户在一处登录后,就不用在其他系统中登录,也就是用户的一次登录能得到其他所有系统的信任.单点登录在大型网站里使用得 ...

  2. SSO单点登录的实现原理

    单点登录在现在的系统架构中广泛存在,他将多个子系统的认证体系打通,实现了一个入口多处使用,而在架构单点登录时,也会遇到一些小问题,在不同的应用环境中可以采用不同的单点登录实现方案来满足需求.我将以我所 ...

  3. SSO单点登录的实现原理是怎样的

    单点登录在现在的系统架构中广泛存在,他将多个子系统的认证体系打通,实现了一个入口多处使用,而在架构单点登录时,也会遇到一些小问题,在不同的应用环境中可以采用不同的单点登录实现方案来满足需求.我将以我所 ...

  4. sso单点登录系统原理与实现

    sso单点登录 1.认识并理解sso及其应用,并能根据其实现原理自行实现sso 没有使用sso单点登录的系统用户再访问同一个系统的不同模块都必须的登录 使用sso单点登录,用户只需要登录一次,并且可以 ...

  5. [转] SSO单点登录原理和流程分析

    WEB的登录那些事#### 说道账户登录和注册,其实我们每天都在亲身感受着,像微博.知乎还有简书等等.我们总是需要定期的去重新登录一下,对于这种认证机制,我们都能说出来两个名词,Cookie.Sess ...

  6. 使用 JSONP 实现简单的 SSO 单点登录

    SSO 即 Single Sign On(单点登录).  一.二级域名之间的单点登录 不需要用到JSONP 或者 p3p 协议,直接使用 COOKIE 就行了,因为顶级域名相同就能实现 COOKIE ...

  7. CAS实现SSO单点登录原理

    1.      CAS 简介 1.1.  What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...

  8. php sso单点登录原理阐述

    原理:就是用户登录了单点登录系统(sso)之后,就可以免登录形式进入相关系统: 实现: 点击登录跳转到SSO登录页面并带上当前应用的callback地址 登录成功后生成COOKIE并将COOKIE传给 ...

  9. CAS实现SSO单点登录原理(转)

    1.      CAS 简介 1.1.  What is CAS ? CAS ( Central Authentication Service ) 是 Yale 大学发起的一个企业级的.开源的项目,旨 ...

随机推荐

  1. 2.7 Axure rp (快速原型设计工具)

    一.   Axure rp 下载安装 直接百度栏输入Axure rp即可下载.安装无特别处,一直点击下一步即可. 安装的如果是英文版,可以下载汉化包,进行汉化. 汉化参照网址:http://www.a ...

  2. Vue的响应式原理---(v-model中的双向绑定原理)

    Vue响应式原理 不要认为数据发生改变,界面跟着更新是理所当然. 具体代码实现:https://gitee.com/ahaMOMO/Vue-Responsive-Principle.git 看下图: ...

  3. ES6常用语法,面试应急专用!

    常用的ES6语法 注:该文章为转载,原地址为https://www.jianshu.com/p/fb019d7e8b15   什么是ES6? ECMAScript 6(以下简称ES6)是JavaScr ...

  4. Java基础(十二)之包和权限访问

    软件包 软件包解决了两个类名字一样的问题.软件包就是一个"文件夹". 包名的命名规范:1.要求所有字母都小写:2.包名一般情况下,是你的域名倒过来写.比如baidu.com,pac ...

  5. Codeforces 1204D2. Kirk and a Binary String (hard version) (dp思路)

    题目链接:http://codeforces.com/contest/1204/problem/D2 题目是给定一个01字符串,让你尽可能多地改变1变为0,但是要保证新的字符串,对任意的L,R使得Sl ...

  6. 如何预测股票分析--自动ARIMA

    在上一篇中,我们发现knn和线性回归一样,表现的不是特别好,来看看时间序列的表现 时间序列预测法其实是一种回归预测方法,属于定量预测,其基本原理是;一方面承认事物发展的延续性,运用过去时间序列的数据进 ...

  7. IntelliJ IDEA 2017.3尚硅谷-----修改类头的文档注释信息

    /** @author shkstart @create ${YEAR}-${MONTH}-${DAY} ${TIME} */ ${PACKAGE_NAME} - the name of the ta ...

  8. C#中DataSet、SqlDataAdapter的使用-关于数据库操作

    本文链接:https://blog.csdn.net/xubaifu1997/article/details/51816785 DataSet 表示数据在内存中的缓存. 我的理解是,在内存中的数据表, ...

  9. [Python] CondaHTTPError: HTTP 000 CONNECTION FAILED for url

    CondaHTTPError: HTTP 000 CONNECTION FAILED for url 遇到这个问题 解决方法如下两个 一.C:\Users\Administrator 目录下 编辑 . ...

  10. SpringMVC--提交表单

    今天使用AbstractCommandController做一个提交表单的样例 (1)首先,建立一个User.java package com.zk.domain; import java.util. ...