HTTP状态保持——Session和Cookie

HTTP协议本身是无状态的,无状态的意思是浏览器发起的每个HTTP请求,对于服务端而言都是彼此独立的,即服务端无法直接通过HTTP协议将用户的多次HTTP请求联系在一起。这就好比顾客跟自动售货机的关系一样,无论你在一台自动售货机上购买了多少次商品,自动售货机都没法“记住”你,也就是说你每一次在该售货机上购买商品的时候,自动售货机都会把你当成一个陌生的顾客来对待。

然而在Web应用的很多场景下需要维护用户状态才能正常工作。典型的应用就是购物车。当你在网上商城购买商品的时候,每看到一个喜欢的商品可以把它先加入购物车,然后继续浏览其他商品,等浏览完商品后再进行商品的结算。在这个过程中,你与服务器的通信是通过多次HTTP请求完成的,浏览器必须通过某种机制识别出你发出的所有HTTP请求是来自同个计算机的同个浏览器,或者来自同一个账户。否则服务器就没办法将购物车里的商品跟某个人联系起来,因此也无法实现购物车功能。这种维持HTTP状态的机制就是会话机制。

会话机制一般有两种实现方案,一种是基于Session实现,一种是基于Cookie实现。这两种方案的本质区别是前者是将用户状态信息保存在服务端,后者是将用户状态信息保存在客户端。那么什么又是用户状态信息呢?以前面的购物车为例,状态信息就是商品信息。

一、基于Session实现会话保持

基于Session实现会话保持的原理是:在会话的开始(即客户端第一次向服务器发送HTTP请求时),服务器会将会话状态保存起来(一般保存在本机内存,当然也可以保存在其他存储系统),然后分配一个会话标识(也叫SessionId)给客户端,这个会话标识一般保存在浏览Cookie里,以后每次浏览器发送HTTP请求的时候,都会带上这个会话标识到服务器,服务器拿到这个会话标识之后就可以把之前存储在服务端的状态信息与该会话联系起来,因此也就实现了会话保持。当然如果遇到浏览器禁用了Cookie的情况,则可以通过url重写的方式将会话标识放在url的参数里,这样也可以实现会话保持。

二、基于Cookie实现会话保持

基于Cookie实现会话保持与上述基于Session实现会话保持的最主要区别是前者完全将会话状态信息存储在浏览器Cookie中,这样一来每次浏览器发送HTTP请求的时候都会带上状态信息,因此也就可以实现状态保持。以上述购物车应用为例,服务端可以将商品信息加密(也可以不加密,但为了安全性,一般会此对状态信息进行加密处理)后保存在浏览器的Cookie中,这样一来服务端就能知道你在浏览的过程中添加了哪些商品到购物车中了。

三、两者的优缺点

基于Session的会话保持的优点是具有安全性,因为状态信息是保存在服务端的,缺点是不便于服务器的水平扩展。大型网站的后台一般都不止一台服务器,可能几台甚至上百台,浏览器发送的HTTP请求一般要先通过负载均衡器才能到达具体的后台服务器,这就会导致每次HTTP请求可能落到不同的服务器上,比如说第一次HTTP请求落到server1上,第二次HTTP请求落到server2上。而Session默认是存储在服务器本机内存的,当多次请求落到不同的服务器上时,上述方案就不能实现会话保持了。

基于Cookie的会话保持的优点是服务器不用保存状态信息,减轻服务端存储压力,也便于服务端做水平扩展。缺点是不够安全,因为状态信息是存储在客户端的,这意味着不能在会话中保存机密数据,另一个缺点是每次HTTP请求都需要发送额外的Cookie到服务端,会消耗更多带宽。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在JavaWeb中,实现网站用户登录功能通常涉及到以下几个关键步骤: 1. **前端页面设计**:创建登录界面,包括用户名输入框(username)、密码输入框(password),以及登录按钮。可以使用HTML、CSS和JavaScript进行前端开发。 2. **后端服务器处理**:后端使用Java和Servlet或Spring MVC框架接收用户的登录请求。通常会涉及以下步骤: - 用户名和密码的验证:检查输入的用户名和密码是否匹配数据库中的记录。你可以使用JDBC连接数据库查询用户信息,也可以使用ORM框架如Hibernate或MyBatis。 - 使用SessionCookie管理用户状态:如果验证通过,为用户创建一个Session,存储用户标识(通常是登录凭据的哈希值)或其他重要信息,这样后续请求可以识别用户。 3. **安全性考虑**:确保密码安全,一般会采用哈希+盐的方式加密存储,登录时对比哈希值。同时,防止SQL注入和XSS攻击。 4. **错误处理和反馈**:对输入错误或验证失败的情况,返回合适的错误消息给前端,并可能显示错误提示。 5. **登录/登出功能**:除了登录,还需要提供登出功能,清除SessionCookie,结束用户会话。 6. **登录日志记录**:为了审计和安全,应该记录用户的登录尝试和结果。 相关问题: 1. 如何在JavaWeb中防止跨站脚本攻击(XSS)? 2. 什么是SessionCookie的区别,它们在用户登录中的作用是什么? 3. 如何在Java中使用Spring Security来增强登录系统的安全性?

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值