Cookie和Session区别

Cookie和Session的定义

  1. Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息 。
  2. Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。

Cookie和Session的区别

  1. Cookie可以存储在浏览器或者本地,Session只能存在服务器
  2. session 能够存储任意的 java 对象,cookie 只能存储 String 类型的对象
  3. Session比Cookie更具有安全性(Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击)
  4. Session占用服务器性能,Session过多,增加服务器压力
  5. 单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie,Session是没有大小限制和服务器的内存大小有关。

Cookie的使用

  1. Cookie类中的常用方法
public void setMaxAge(int expiry)
public String getName()
public String getValue()
public void setValue(String newValue)
  1. 下面是一个显示用户上次登陆时间的经典小案例

protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       // 设置响应文本信息
       resp.setContentType("text/html;charset=utf-8");
       // 处理请求以及响应的乱码问题
       req.setCharacterEncoding("utf-8");
       resp.setCharacterEncoding("utf-8");
       // 从request中获取所有Cookie
       Cookie[] cookies = req.getCookies();
       
       boolean flag = false;
       // 遍历cookies
       for (Cookie cookie : cookies) {
           if (cookie.getName().equals("datetime")){
               Date date = new Date(Long.valueOf(cookie.getValue()));
               resp.getWriter().println("您上次的登陆时间是:" + date.toLocaleString());
               flag = true;
               break;
           }
       }
       if (!flag){
           resp.getWriter().println("您是首次登陆");
       }
       long currentTimeMillis = System.currentTimeMillis();
       // 响应cookie
       Cookie cookie = new Cookie("datetime", String.valueOf(currentTimeMillis));
       resp.addCookie(cookie);
   }
}
  1. Cookie中处理中文乱码的方式
// 在此处我是通过对中文数据进行URL编码解码的操作来完成的
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    resp.setContentType("text/html;charset=utf-8");
    req.setCharacterEncoding("utf-8");
    resp.setCharacterEncoding("utf-8");
    
    Cookie[] cookies = req.getCookies();
    for (Cookie cookie : cookies) {
        if (cookie.getName().equals("name")){
            resp.getWriter().println(URLDecoder.decode(cookie.getValue(), "utf-8"));
            System.out.println(URLDecoder.decode(cookie.getValue(), "utf-8"));
        }
    }
    Cookie cookie = new Cookie("name", URLEncoder.encode("张三","utf-8"));
    resp.addCookie(cookie);
}

Session的使用

  1. HttpSession中常用的方法
public String getId();
public ServletContext getServletContext();
public Object getAttribute(String name);
public void setAttribute(String name, Object value);
public void removeAttribute(String name);
public void invalidate();
public boolean isNew();
  1. Session中存储数据
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    request.setCharacterEncoding("utf-8");
    response.setCharacterEncoding("utf-8");
    response.setContentType("text/html;charset=utf-8");
    // 获取Session
    HttpSession session = request.getSession();
    // 存储信息
    session.setAttribute("person", new Person(111,"张三"));

    String id = session.getId();
    if (session.isNew()){
        response.getWriter().write("新创建的session id=" + id);
    } else {
        response.getWriter().println("session已经存在了 id=" + id);
    }

}
  1. 删除Session的两种方式
  • 手动删除
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
    HttpSession session = req.getSession();
    // 手动注销session
    session.invalidate();
}
  • 通过web.xml的方式实现定时删除
<session-config>
   <!--设置session的失效时间,以分钟为单位-->
   <session-timeout>1</session-timeout>
</session-config>
  • 7
    点赞
  • 21
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

别云超

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值