1. 基于Session实现登录
2. 知识储备和课程内容
2.1 Cookie和Session
- Cookie
- Cookie 是存储在用户计算机上的小型文本文件,由服务器发送到浏览器,并保存在用户的本地计算机上。
- 每当用户访问网站时,浏览器都会将相关的 Cookie 发送回服务器,这样服务器就可以根据其中的信息来识别用户。
- Cookie 主要用于跟踪用户的偏好和行为,如记住用户的登录状态、购物车内容、语言偏好等。
- Cookie 可以设置过期时间,可以是会话级别的(浏览器关闭时过期)或者持久性的(在设定的过期时间之前一直有效)。
- Session
- Session 是在服务器端保存的关于用户会话的信息,通常存储在服务器的内存中或者数据库中。
- 当用户访问网站时,服务器会为每个用户创建一个唯一的会话标识符(Session ID),并将该标识符存储在 Cookie 中,发送给用户的浏览器。
- 用户的请求会带着这个 Session ID,服务器据此可以识别用户,并根据之前存储在服务器上的相关信息来处理用户的请求。
- Session 通常用于存储用户的登录状态、购物车内容等信息,它可以存储更多的数据并且相对更安全,因为信息存储在服务器上,用户无法直接修改。
2.2 ThreadLocal
ThreadLocal 是 Java 中的一个类,用于在多线程环境下维护线程局部变量。每个线程都有自己独立的 ThreadLocal 实例,可以通过该实例存储和获取线程本地的变量。这意味着同一个变量在不同线程中可以有不同的值,且各个线程之间互不干扰。
- 线程隔离性:在多线程环境下,如果多个线程共享同一个变量,可能会出现竞态条件或线程安全性问题。使用 ThreadLocal 可以将变量与线程绑定,确保每个线程都有自己独立的变量副本,从而避免了线程之间的竞争和干扰。
- 线程封闭性:有些数据是与线程紧密相关的,不应该被其他线程访问或修改。ThreadLocal 提供了一种简单的方式来实现线程封闭性,确保数据只能被创建它的线程访问。
- 上下文传递:有些情况下,需要在同一个线程的不同方法或组件之间传递数据,而不希望通过方法参数或全局变量来实现。ThreadLocal 可以用来在同一个线程的不同执行上下文中传递数据,使得数据共享更加方便。
2.3 集群的session共享问题
多台Tomcat并不共享session存储空间,当请求切换到不同tomcat服务时导致数据丢失的问题.
session的替代方案应该满足:
- 数据共享
- 内存存储
- key,value结构
2.4 基于Redis实现共享session登录
一般不适用手机号作为token
2.5 解决状态登录刷新
目前这个拦截器只对一些特定的界面生效,如果用户一直访问不被拦截的界面。则过一段时间之后就会过期,这是不符合预期的行为。
3. 问题汇总
3.1 Mac M2不能运行给的nginx.exe
自行下载nginx,
# 安装 nginx
brew install nginx
# 查看 安装目录和配置文件的目录
brew info nginx
把资料的nginx-1.18.0.2里的html文件夹直接覆盖到 nginx的安装目录的HTML文件
把资料的Nginx-1.18.0.2里的conf文件夹里的nginx-conf文件 覆盖 你安装的nginx的配置文件里的nginx-conf文件
sudo nginx -s reload
重启nginx 再去访问就成功了。
可能会报错:nginx: [error] open() "/opt/homebrew/var/run/nginx.pid" failed (2: No such file or directory)
报错的话按下面的改(指定配置文件):
sudo nginx -c /opt/homebrew/etc/nginx/nginx.conf
再次:sudo nginx -s reload
重启nginx 再去访问就成功了。
3.2 登录成功后跳转回首页
这个是前端代码有问题,修改一下即可。
修改后login方法如下:
同时后端MvcConfig代码也存在问题,应该删除”user/me“,使其能够被拦截器拦截。