Cookie和Session

Cookie和Session
无状态的HTTP协议

http协议采用连接–请求–应答–关闭连接的模式,当客户端发出请求时,服务器才会建立连接,一旦客户端的请求结束,服务器便会中断连接,当客户端下一次请求时,服务器会把这次请求看作是一种新的请求,与之前的请求无关的请求。

但对于交互式的web应用保存用户的状态非常重要,也就是说,要让服务器记得每一次来访的客户端。要解决这个问题其实有很多做法。如将客户端信息存储在Context对象中,但这有一个明显的弊端,因为Context对象是全局管理者对象,多个客户端共享这一个对象,必然会引起多线程的安全问题。另一个想法是将客户端的数据存储在Request对象中,通过请求转发来实现数据共享,因为在请求转发过程中,只会生成一个Request对象,但这也有一个弊端,如购物网站中,如果采取这样的方式,你刚点完加入购物车,就会跳转到结账页面,用户体验很差。因此引入了绘画跟踪技术。

Cookie技术

Cookie技术是一种在客户端保持会话跟踪的解决方案。Cookie是指网站为了辨别用户身份,,将一小块数据由服务器发送到用户浏览器,当浏览器再次请求同一服务器时会携带并发送Cookie到服务器,此时服务器通过解析Cookie便可以得到浏览器的信息。

Cookie的作用方面
  • 会话状态管理(用户登录状态,购物车,游戏分数等)
  • 个性化设置(主题设置)
  • 浏览器行为跟踪
Cookie对象的使用
  • 创建
Cookie cookie = new Cookie("name","value");

两个参数都必须是String类型,

  • 服务器向客户端响应Cookie
response.addCookie(cookie);
  • 获取并遍历浏览器所有Cookie’

Cookie[] cookies = request.getCookie();
if(cookies != null){
   for(Cookie c : cookies){
       out.println(c.getName() + "==" + c.getValue);
   }
}
  • 设置Cookie的访问路径
    一般情况Cookie只能被创建它的应用获取,setPath方法可以重新指定其访问路径。

cookie.setPath("\");
  • 设置Cookie的存活时间
    默认是浏览器进程的生命周期,因此这种Cookie也称为临时Cookie。通过设置时间可以将Cookie长时间存在磁盘中。
cookie.setMaxAge(3600)   // 以s为单位
  • 案列(记录用户最近访问时间)
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;


public class TestCookie extends HttpServlet {
    protected void doGet(HttpServletRequest request, 
    HttpServletResponse response) throws ServletException, IOException {
        response.setContentType("text/html;charset=utf-8");
        request.setCharacterEncoding("UTF-8");
        PrintWriter writer = response.getWriter();

        Cookie[] cookies = request.getCookies();
       
        if(cookies != null &&  cookies.length > 0){
            for(Cookie c : cookies){
                if("time".equals(c.getName())){
                    writer.print("上次访问时间" + 
                    (new Date(Long.parseLong(c.getValue()))));
                }
            }
        }else{
            writer.write("你是第一次访问。");
        }
        Cookie cookie = new Cookie("time","" + System.currentTimeMillis());
        cookie.setMaxAge(3600);
        response.addCookie(cookie);

    }
    protected void doPost(HttpServletRequest request, 
    HttpServletResponse response) throws ServletException, IOException {
        doGet(request,response);
    }
}
Session技术

Session是一种在服务器端保持会话跟踪的技术,服务器创建Session对象时会为其分配一个唯一的会话标识SessionID,以“JESSIONOID”的属性名保存在客户端Cookie中,因此可以说Session也是基于Cookie的。
在用户随后的访问中,服务器通过浏览器携带的Cookie中的Session的ID号来区别不同的用户,从而实现对每个用户的会话跟踪。

Session对象
  • 创建 / 获取会话对象
    session对象由服务器自动创建,通过getSession方法可以得到
HttpSession session = request.getSession(true);
  • 存取会话属性
session.setAttribute("name","value");
session,getAttribute("name");
  • 设置最大存活时间
session.setMaxInactiveInterval(3600)  // 以s为单位
session的生命周期

Session保存在服务器端,Session在用户第一次访问服务器的时候自动创建,也可以使用getSession强制创建,当session超出了超时时间,就会自动失效。

Session和Cookie的区别
  • Cookie数据存储在客户的浏览器上,而Session存储在服务器上
  • Cookie的安全性能不强,隐私容易被盗取。
  • Cookie中只能存储字符串,而Session中能存储任意类型。
  • 存储大小不同,单个Cookie只能存储4KB。
URL重写

因为Session是基于Cookie的,Cookie中存储着Session的ID号,因此当浏览器禁用Cookie后,不仅Cookie技术不能使用Session也不能使用,但同过URL重写技术可以解决这个问题。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值