前言
目前登录页面+后端登录功能,存在的问题?
- 访问敏感资源(前端的敏感资源,后端的敏感资源),未登录不允许访问,前端页面可以跳转到登录页面,后端接口(servlet):返回401状态码(Unauthorized未授权的访问),返回json数据。
- 技术实现:Session和Cookie,目前比较好的解决方案是(Filter);次一点的解决方案:
(1)提供一个校验用户是否登录的接口,每次前端都请求。
(2)每个Servlet都去验证一下是否登录。
1.cookie
1.1 cookie概念
- 定义:cookies是存储在客户端计算机上的文本文件,并保留了用户的各种跟踪信息。
- 作用:用于客户端本地保存数据(一般是用户信息)。
- 用于场景:免登录(remember me)
1.2 cookie工作原理
- 客户端向服务区发起登录请求;
- 服务器脚本向浏览器发送一组Cookies。例如:姓名、年龄或识别号码;
- 浏览器将这些信息存储在本地计算机上,以备将来使用;
- 当下一次浏览器向Web服务器发送任何请求时,浏览器会把这些Cookies信息发送到服务器,服务器将使用这些信息来识别用户。
2.Session
2.1 概念
- 定义:session 是存储在服务器上的文本文件,并保留了用户的各种跟踪信息。会话,登录后,注销前且未注销,都属于一次会话。
- 作用:会话保持,如完成用户的登录与状态保持,因为在服务器端,所以相对安全一些。
登录时,服务端保存一个用户的会话(Session),访问敏感资源的时候,校验是否有Session。
2.2实现原理
2.3 Servlet对象
HttpSession对象
- Servlet还提供了HttpSession接口,该接口提供了一种跨多个页面请求或访问网站时识别用户以及存储有关用户信息的方式。
- Servlet容器使用这个接口来创建一个HTTP客户端和HTTP服务器之间的session会话。会话持续一个指定的时间段,跨多个连接或页面请求。
- 每次敏感资源访问时,都会获取HttpSession
- 如果获取到,并且session.getAttribute(键)有数据,就是登录(系统通过请求的会员卡查询身份证)否则拒绝访问。
- 我们可以通过调用HttpServletRequest的公共方法getSession()来获取HttpSession对象,如下所示:
HttpSession session=request.getSession();
//重载
HttpSession session=request.getSession(boolean create);
HttpSession对象的方法
public Object getAttribute(String name);
//该方法返回在该session会话中指定的对象,如果没有指定名称的对象,则返回null
public void removeAttribute(String name);
//该方法将从该session会话中移除指定名称的对象(注销功能)
public void setAttribute(String name,Object value);
session.setAttribute(键,用户信息);
//使用该方法可以绑定卡和身份证
//该方法使用指定的名称绑定一个对象到该session对象
3.cookie vs session
两者有什么区别呢?
- Cookie以文本文件格式存储在浏览器中,而session存储在服务端
- 因为每次发起 Http 请求,都要携带有效Cookie信息,所以Cookie一般都有大小限制,以防止增加网络压力,,一般不超过4k。
- 可以轻松访问cookie值但是我们无法轻松访问会话值,因此session方案更安全。