18.03.26,web学习第八十五天,商城day11,用户登录存入redis、token、ajax跨域、jsonp

85商城day11

1. 记单点登录的jsp

1Math.random(),因为是get请求,所以浏览器默认会缓存这个请

   求!,加上随机数之后,就会发出新的请求。

 18.03.26,web学习第八十五天,商城day11,用户登录存入redis、token、ajax跨域、jsonp

2. 校验手机号,用户名和密码

1)dao层由****实现

2)使用E3Result作为返回值

 18.03.26,web学习第八十五天,商城day11,用户登录存入redis、token、ajax跨域、jsonp

 18.03.26,web学习第八十五天,商城day11,用户登录存入redis、token、ajax跨域、jsonp

上述两个参数同时从路径上取,必须使用@pathVariable注解

3. 严禁使用js的原始alert,不好看!
4. 用户注册

1ctroller

 18.03.26,web学习第八十五天,商城day11,用户登录存入redis、token、ajax跨域、jsonp

2)Service

 18.03.26,web学习第八十五天,商城day11,用户登录存入redis、token、ajax跨域、jsonp

 18.03.26,web学习第八十五天,商城day11,用户登录存入redis、token、ajax跨域、jsonp

5. 用户登录,

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、登录成功。

2)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 + ":" + tokenSESSION_EXPIRE);

// 6、返回e3Result包装token。

return e3Result.ok(token);

}

3)加入工具类CookieUtils报错:servlet依赖进来

 18.03.26,web学习第八十五天,商城day11,用户登录存入redis、token、ajax跨域、jsonp

4)ctroller

因为在写入cookie的时候,需要httpresponsehttprequest,所以:直接在方法里将他们注入进来。

 18.03.26,web学习第八十五天,商城day11,用户登录存入redis、token、ajax跨域、jsonp

6.登录成功后在首页显示用户信息

1js是有限制的,跨域请求是拿不到数据的

2jsonp原理:

   <Script/>src属性可以跨域加载js文件的属性。

1>portoal-web页面写一个js代码发送ajax请求将取到的token发过去

1、当用户登录成功后,在cookie中有token信息。

2、从cookie中取token根据token查询用户信息。

3、把用户名展示到首页。

 

方案一:在Controller中取cookie中的token数据,调用sso服务查询用户信息。

方案二:当页面加载完成后使用jstoken的数据,使用ajax请求查询用户信息。

 

问题:服务接口在sso系统中。Sso.e3.com(localhost:8088),在首页显示用户名称,首页的域名是www.e3.com(localhost:8082),使用ajax请求跨域了。

 

Js不可以跨域请求数据。

什么是跨域:

1、域名不同

2、域名相同端口不同。

 

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

 

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

 18.03.26,web学习第八十五天,商城day11,用户登录存入redis、token、ajax跨域、jsonp

2>ctroller层接收请求调用service

其一写法:

 18.03.26,web学习第八十五天,商城day11,用户登录存入redis、token、ajax跨域、jsonp

其二写法:

 18.03.26,web学习第八十五天,商城day11,用户登录存入redis、token、ajax跨域、jsonp

注意其二写法应该给出produces,因为不限定返回类型,那么就会返回html/text而客户端需要的是application/json

3>service层查询redis

 18.03.26,web学习第八十五天,商城day11,用户登录存入redis、token、ajax跨域、jsonp

7. 对于jsonp

服务端:

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

2、业务逻辑处理。

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

 18.03.26,web学习第八十五天,商城day11,用户登录存入redis、token、ajax跨域、jsonp