e3mall商城总结11之sso系统的分析、应用以及解决ajax跨域问题
说在前面的话
一、sso系统分析
什么是sso系统
SSO英文全称Single Sign On,单点登录。SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统。它包括可以将这次主要的登录映射到其他应用中用于同一个用户的登录的机制。它是目前比较流行的企业业务整合的解决方案之一。
传统的登录方式:

此方式在只有一个web工程时是没有问题。但是在集群环境下问题很大:

集群环境下会出现要求用户多次登录的情况。
解决方案:
1、配置tomcat集群。配置tomcatSession复制。节点数不要超过5个。(不适合)
2、可以使用Session服务器,保存Session信息,使每个节点是无状态。需要模拟Session。
3、单点登录系统是使用redis模拟Session,实现Session的统一管理。
再来看看我们的项目架构图

sso系统使用流程:

sso单点登录系统使用逻辑:
用户点击登录,若登录失败,则重新登录。若登录成功,则生成一个token存放到redis缓存中,设置过期时间,同时也存到cookies中(使用CookieUtils工具),也设置时间。然后当用户点击每一个页面时都通过ajax向服务器发送请求,请求的URL包含token的值,若在redis中找到该key,则说明没有过期,返回该key的值。若没找到,则说明登录已过期,跳转重新登录。同时设置回调页面,让用户体验好。
用户登录的service层:
@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);
}
**redis的key是USER_INFO : token,值是password为null的user对象。
**
用户登录的controller层:
@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;
}
cookies的key是COOKIE_TOKEN_KEY,值是token。
用户获取token是否过期的service层:
@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);
}
解决ajax跨域问题


现在的的浏览器为了安全,是不让网址访问非该网址服务器,比如我在www.baidu.com上网,该网址上有请求数据去www.xiaofeng88.cn服务器上请求,然后该服务器就响应了,但是浏览器拒绝发送给baidu上。但是浏览器支持向其他网址下载js、css、jpg等文件,因此jsonp利用引入下载.js文件的原理将请求的数据带回来。当然服务器的配置也需要修改一下。
服务端:
1、接收callback参数,取回调的js的方法名。
2、业务逻辑处理。
3、响应结果,拼接一个js语句。

添加了一个参数callback,如果callback不为空,则说明前端的代码中填写了type:jsonp。
因此返回的json语句也需要修改一下。
本文讲解的很详细,希望可以给您带来灵感,如果您有问题,欢迎下方评论,博主看到后会第一时间回复大家.
e3mall商城总结11之sso系统的分析、应用以及解决ajax跨域问题的更多相关文章
- JAVAEE——宜立方商城11:sso登录注册功能实现、通过token获得用户信息、Ajax跨域请求(jsonp)
1. 学习计划 第十一天: 1.sso注册功能实现 2.sso登录功能实现 3.通过token获得用户信息 4.Ajax跨域请求(jsonp) 2. Sso系统工程搭建 需要创建一个sso服务工程,可 ...
- Ajax跨域请求action方法,无法传递及接收cookie信息(应用于系统登录认证及退出)解决方案
最近的项目中涉及到了应用ajax请求后台系统登录,身份认证失败,经过不断的调试终于找到解决方案. 应用场景: 项目测试环境:前端应用HTML,js,jQuery ajax请求,部署在Apache服务器 ...
- SSO系统的分析与架构
随着公司子系统越来越多,一直以来使用ucenter的同步登录方式的性能以及效率问题显得越来越大,重新构建一个SSO系统显得势在必行. 通过google搜索关于SSO单点登录文章,发现以下文章关于新浪微 ...
- 基于CAS的SSO单点登录-实现ajax跨域访问的自动登录(也相当于超时重连)
先补课,以下网址可以把CAS环境搭起来. [JA-SIG CAS服务环境搭建]http://linliangyi2007.iteye.com/blog/165307 [JA-SIG CAS业务架构介绍 ...
- 11. cookie_session_原生ajax_readyState的值_同源策略_跨域_jsonp的使用
1. cookie 浏览器存储技术.(服务器将少量数据交于浏览器存储管理) 作用: 存储数据, 解决 http 协议无状态问题 工作流程: 浏览器发送请求给服务器,请求登录 服务器返回响应给浏览器,此 ...
- 淘淘商城之Ajax跨域请求
一.什么是跨域 (1)域名不同时: (2)域名相同,端口不同时 二.解决方法 可以使用jsonp解决跨域问题 三.什么是jsonp jsonp其实是一个跨域解决方案,js跨域请求数据是不允许的,但是跨 ...
- 深入理解跨域SSO(单点登录)原理与技术
一:SSO体系结构 SSO SSO英文全称Single Sign On,单点登录.SSO是在多个应用系统中,用户只需要登录一次就可以访问所有相互信任的应用系统.它包括可以将这次主要的登录映射到其他 ...
- 深入理解跨域SSO单点登录原理与技术
[本文版权归微信公众号"代码艺术"(ID:onblog)所有,若是转载请务必保留本段原创声明,违者必究.若是文章有不足之处,欢迎关注微信公众号私信与我进行交流!] 一:SSO体系结 ...
- day78_淘淘商城项目_11_单点登录系统实现 + 用户名回显 + ajax请求跨域问题详解_匠心笔记
课程计划 1.SSO注册功能实现 2.SSO登录功能实现 3.通过token获得用户信息 4.ajax跨域请求解决方案--jsonp 1.服务接口实现 SSO系统就是解决分布式环境下登录问题的,本 ...
随机推荐
- 电脑小知识:Windows 10是用什么语言写的?到底有多少行代码?
这是微软的内核工程师 Axel Rietschin在Quora的一个回答. Windows 10 的code base 和Windows 8.x , 7 , Vista , XP , 2000 和Wi ...
- Qt 乱码
个人认识: 乱码的原因: 在编写代码时-->文件的格式--->编译器对文件进行编译的时候看到的只是二进制(乱码就出现在这里) 应合适方法 通知编译器(为什么说通知编译器呢?因为个人觉得这样 ...
- Git科普文,Git基本原理&各种骚操作
Git简单介绍 Git是一个分布式版本控制软件,最初由Linus Torvalds创作,于2005年以GPL发布.最初目的是为更好地管理Linux内核开发而设计. Git工作流程以及各个区域 Work ...
- QWebEngineView简单使用
QWebEngineView是提供一个访问web页面的widget,这里是一个简单的使用代码 头文件 #ifndef MAINWINDOW_H #define MAINWINDOW_H #includ ...
- “随手记”开发记录day13
今天继续对我们的项目进行更改. 今天我们需要做的是增加“修改”功能.对于已经添加的记账记录,长按可以进行修改和删除的操作. 但是今天并没有完成……
- 修改jar包配置文件的正确操作,jar包解压出来的文件夹重新打成jar,不依靠开发工具!!!!
修改jar包配置文件的正确操作,有的时候通过一些解压工具可以对内部的文件进行修改,但是有时候会无效.这就很烦了 一.背景: 有一个springboot项目,事先我已经用编译好打成jar包以 ...
- 修改 jar 包 或 war 包内容
修改 jar 包 或 war 包内容 有一个 java web 项目,是 .jar 或 .war 文件,我想替换其中的部分样式(.css)或功能(.class). 步骤就是解压,替换,重新打包. 以 ...
- Python爬虫获取百度贴吧图片
#!/usr/bin/python# -*- coding: UTF-8 -*-import urllibimport re文章来源:https://www.cnblogs.com/Axi8/p/57 ...
- Bystack跨链技术源码解读
Bystack是由比原链团队提出的一主多侧链架构的BaaS平台.其将区块链应用分为三层架构:底层账本层,侧链扩展层,业务适配层.底层账本层为Layer1,即为目前比较成熟的采用POW共识的Bytom公 ...
- MySQL数据库——数据约束
1 什么数据约束 对用户操作表的数据进行约束 2 默认值(缺省约束) 作用: 当用户对使用默认值的字段不插入值的时候,就使用默认值. 注意: 1)对默认值字段插入null是可以的 2)对默认值字段可以 ...