Session入门
概念
Session是服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。
为什么需要Session
我们用浏览器打开一个网页,用到的是HTTP协议,学过计算机的应该都知道这个协议,它是无状态的,什么是无状态呢?就是说这一次请求和上一次请求是没有任何关系的,互不认识的,没有关联的。但是这种无状态的的好处是快速。但是这带来一个问题,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你。但是平时我们浏览网页的时候,会遇到例如在“https://login.taobao.com/”只需要输入一次账号密码,后面浏览该网站的其他内部“https://www.taobao.com/?spm=a1”不需要重新登录的情况,这又是如何实现的呢?cookie可以实现吗?由于cookie 是存在用户端,而且它本身存储的尺寸大小也有限,最关键是用户可以是可见的,并可以随意的修改,很不安全。那如何又要安全,又可以方便的全局读取信息呢?实际上正是session起到的作用,事实上它并不是什么新技术,而且也不能脱离http协议以及任何现有的web技术。
session原理很简单,假设你访问网页时就像去澡堂,第一次进去你是没有钥匙的,这个时候你交了钱服务台就分配一把钥匙给你,你走到哪里都要带上,因为这是你身份的唯一标识,接下来你用这把钥匙可以去打开一个专有的储物柜存储你的衣物,游完泳,你再用钥匙去打开柜子拿出衣物,最后离开游泳池时,把钥匙归还,你的这次游泳的过程就是一次session,或者叫做会话,在这个例子中,钥匙就是session的key,而储物柜可以理解为存储用户会话信息的介质。
在web中如何实现session
想必看了上面的例子你会很容易理解,但是钥匙的问题如何解决,即什么东西可以成为一个标识让你每次请求都会自动带到服务器呢?如果你比较了解http协议,那么答案一目了然,就是cookie,cookie是把少量的信息存储在用户自己的电脑上,它在一个域名下是一个全局的。如果你想为用户建立一次会话,可以在用户授权成功时给他一个cookie,如果下次发现用户带了这个cookie,服务器就知道,哎呀,刚刚这位顾客来了。
对于第二个问题,即如何存储用户的信息,服务器知道会话id为abc的用户来了,那abc想存储自己的私人信息,比如购物车信息,如何处理?这个时候可以用内存、也可以用文件,也可以用数据库。
HttpSession对象
获取HttpSession对象:
HttpSession session = request.getSession();
使用HttpSession对象:
Object getAttribute(String name)
void setAttribute(String name, Object value)
void removeAttribute(String name)
案例1:数据共享
/**使用session进行数据共享‘
* @author liwenlong
* @data 2020/3/24
*/
@WebServlet("/sessionDemo1")
public class SessionDemo1 extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOEx