sso系统登录以及jsonp原理

sso系统登录以及jsonp原理_第1张图片

登录的处理流程:

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

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

3、把用户信息保存到redisKey就是tokenvalue就是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、登录成功后生成tokenToken相当于原来的jsessionid,字符串,可以使用uuid

3、把用户信息保存到redisKey就是tokenvalue就是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 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

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

HttpServletRequestHttpServletResponse

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

业务逻辑:

1、接收两个参数。

2、调用Service进行登录。

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

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

1setDomain,设置一级域名:

.itcatst.cn

.e3.com

.e3.com.cn

2setPath。设置为“/

 

工具类放到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原理

sso系统登录以及jsonp原理_第2张图片

1.1. Json实现

1.1.1. 客户端

使用jQuery

 

1.1.2. 服务端

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

2、业务逻辑处理。

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

 sso系统登录以及jsonp原理_第3张图片

 

转载于:https://www.cnblogs.com/yyxq/p/9301658.html

你可能感兴趣的:(sso系统登录以及jsonp原理)