相同点:
两者都用来跟踪客户端身份
不同点:
1、数据存储位置:cookie数据存放在客户的浏览器上,session数据放在服务器上。
2、安全性:cookie不是很安全,别人可以分析存放在本地的cookie并进行cookie欺骗,考虑到安全应当使用session。
3、服务器性能:session会在一定时间内保存在服务器上。当访问增多,会比较占用你服务器的性能,考虑到减轻服务器性能方面,应当使用cookie。
4、数据大小:单个cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个cookie。
5、信息重要程度:可以考虑将登陆信息等重要信息存放为session,其他信息如果需要保留,可以放在cookie中。
注意:
Cookie:
- Cookie有效期时间设为0的话每次关闭会话就清除Cookie
- 一个Cookie只能保存一个信息(一个键值对)
Cookie c=new Cookie(String,String) - 浏览器Cookie有上限(300)
Cookie把数据写给浏览器,浏览器来保存 - 第一次访问,服务器给用户发送一个cookie,下次访问时携带cookie访问,便知道是否首次访问
package com.csf.Cookie;
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;
public class Cookie1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
PrintWriter out = resp.getWriter();
Cookie[] cookies = req.getCookies();;
if (cookies!=null){
out.println("欢迎你再次访问本网站,您上次访问时间为:");
for (int i=0;i<cookies.length;i++){
if (cookies[i].getName().equals("LastLoginTime")){
out.println(cookies[i].getValue());
}
}
}else {
out.println("您首次登录本网站");
}
Cookie c=new Cookie("LastLoginTime",System.currentTimeMillis()+"");
resp.addCookie(c);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
super.doPost(req, resp);
}
}
Session:
- 服务器会给每一个用户(浏览器)分配一个Session对象,给一个唯一不变(再关闭会花前)的ID(服务器创建
- 可通过Maven配置session失效时间,分钟为单位
- Session把用户数据写道Session中,服务器保存
- 访问服务器是登记SessionID,返回给用户,存储东西时用服务器中的Session,所以不同用户中的ID不同所看到的存储数据也不同
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
HttpSession session = req.getSession();
session.setAttribute("name","lqt"); 由session写入数据
PrintWriter writer = resp.getWriter();
if (session.isNew()){
writer.println("已经创建了ID:"+session.getId());
}else {
writer.println("创建了ID:"+session.getId());
}
String name = (String) session.getAttribute("name"); 获得键值对的值
PrintWriter writer = resp.getWriter();
writer.println(name);
String name = (String) session.getAttribute("name");
session.removeAttribute(name); 移除相应的键值对
session.invalidate(); 手动关闭Session
|