为什么要保持登录状态?

前端开发登录状态的保持,主要有两种方法:cookie+session 和 token技术

登录状态保持,起源于http的无状态,无记忆

  1. 最早的时候,web的作用就是网页的浏览。 服务器只用提供简单的网页浏览器操作即可,不用记住刚刚谁发了请求,更没有登录,注册之类的操作

  2. http设计之初就是无状态的

  3. http无状态: http不会记住每一次的请求 就跟公交车司机不会记住乘客一样

  4. 这段时间很嗨皮,业务逻辑非常简单。

cookie+session实现登录状态保持

1.随着交互型的网页的兴起,在线购物网站,需要登录的网站变得越来越多。但是http是无状态的

2.通过cookie+session实现状态保持

3.服务端登录的时候,给分配一个session用于存储数据,同时将sessionID返回给浏览器

4.浏览器通过cookie把sessionID存储起来,下次访问时携带上

5.服务端就可以通过sessionID来确定用户是否登录【喝咖啡的例子】

cookie+session实现状态保持的缺点

1.通过cookie+sesion技术实现了状态的保持,大家都很嗨皮

2.服务端不嗨皮了,原因如下:

-每个人登录都需要在服务端开辟一块空间来信息,如果访问的人越来越多了,该怎么办?

-浪费了大量的内存,对于服务器来说是一个很大的开销。

-手机端很多浏览器不支持cookie或者是禁用cookie

-如果要集群了,会很麻烦

集群+session持久化

1.因为需要访问的用户越来越多,一台服务器扛不住压力了

2.那就准备2台,3台,甚至是更多的服务器进行服务

3.问题:如果小明的请求第一次访问了A服务器,下一次访问了B服务器怎么办?

4.可以通过session共享解决,也就是在每一台服务器中都共享所有的用户信息,这样就占用了更多的服务器内存

5.通过数据持久化解决,使用缓存(redis/Memcached),将所有的session存储到数据库中,所有的session都统一去数据库中进行查找

6.服务端也嗨皮了,但是数据库服务器崩了咋办???

登录状态保持-token技术
token的基本介绍

1.想想,我们为什么要存储session呢,浪费大量的内存,要是不存该有多好啊,但是不存储session,我怎么验证合法用户?关键点就在于验证服务端不存储任何的数据,我还能验证你的真实身份

2.新的想法产生了:当小明登录系统的时候,根据小明的用户名生成一个token(令牌),把令牌交给小明,服务端不做任何存储。下次小明登录时,小明带上token进行访问,服务端对token进行校验,当然这个令牌必须是通过一定的算法进行严格加密的,只有服务器才能解析校验

3.校验token比存储session省事多了

token的优势

  1. token无状态,服务端不用存储token,服务端只需要签发和校验token即可。

  2. 集群:token是无状态,集群的时候,算法一致,无论访问哪台服务器,都是一样的

  3. 性能: 解析token效率比查询数据库高的多

  4. 跨站点:只要服务端算法一致,token就可以夸站点登录

  5. 移动端:在移动端开发中,使用cookie非常麻烦,使用token验证非常常见

token的使用

1.客户端收到服务器返回的JWT,可以储存在Cookie里面,也可以储存在localStorage。

2.此后,客户端每次与服务器通信,都要带上这个JWT。你可以把它放在Cookie里面自动发送,但是这样不能跨域,所以更好的做法是放在HTTP请求的头信息Authorization字段里面。

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 Spring Boot 中,可以通过以下步骤来保持登录状态: 1. 用户登录成功后,将用户信息存储到服务器端的 Session 中。 2. 在每个需要登录验证的页面或接口中,判断当前用户是否已经登录,如果没有登录,则跳转到登录页面或返回未登录的错误信息。 3. 在用户退出登录时,清除服务器端的 Session 中存储的用户信息。 具体实现方式可以参考以下步骤: 1. 在用户登录成功后,将用户信息存储到服务器端的 Session 中,例如: ```java @Controller public class LoginController { @PostMapping("/login") public String login(@RequestParam("username") String username, @RequestParam("password") String password, HttpSession session) { // 验证用户名和密码是否正确 if (username.equals("admin") && password.equals("admin123")) { // 登录成功,将用户信息存储到 Session 中 session.setAttribute("user", new User(username, password)); // 跳转到首页或其他需要登录验证的页面 return "redirect:/index"; } else { // 登录失败,返回错误信息 return "redirect:/login?error"; } } } ``` 2. 在需要登录验证的页面或接口中,判断当前用户是否已经登录,例如: ```java @Controller public class IndexController { @GetMapping("/index") public String index(HttpSession session) { // 判断用户是否已经登录 User user = (User) session.getAttribute("user"); if (user == null) { // 用户未登录,跳转到登录页面 return "redirect:/login"; } else { // 用户已登录,显示首页 return "index"; } } } ``` 3. 在用户退出登录时,清除服务器端的 Session 中存储的用户信息,例如: ```java @Controller public class LogoutController { @PostMapping("/logout") public String logout(HttpSession session) { // 清除 Session 中的用户信息 session.removeAttribute("user"); // 跳转到登录页面 return "redirect:/login"; } } ``` 通过以上实现方式,可以在 Spring Boot 中保持登录状态。需要注意的是,在实现过程中需要考虑安全性和可扩展性。例如,可以使用加密算法对用户密码进行加密,或使用 JWT 等技术实现无状态登录,从而提高系统的安全性和可扩展性。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值