Cookie和Session的定义
- Cookie,有时也用其复数形式 Cookies。类型为“小型文本文件”,是某些网站为了辨别用户身份,进行Session跟踪而储存在用户本地终端上的数据(通常经过加密),由用户客户端计算机暂时或永久保存的信息 。
- Session:在计算机中,尤其是在网络应用中,称为“会话控制”。Session对象存储特定用户会话所需的属性及配置信息。这样,当用户在应用程序的Web页之间跳转时,存储在Session对象中的变量将不会丢失,而是在整个用户会话中一直存在下去。当用户请求来自应用程序的 Web页时,如果该用户还没有会话,则Web服务器将自动创建一个 Session对象。当会话过期或被放弃后,服务器将终止该会话。Session 对象最常见的一个用法就是存储用户的首选项。
Cookie和Session的区别
- Cookie可以存储在浏览器或者本地,Session只能存在服务器
- session 能够存储任意的 java 对象,cookie 只能存储 String 类型的对象
- Session比Cookie更具有安全性(Cookie有安全隐患,通过拦截或本地文件找得到你的cookie后可以进行攻击)
- Session占用服务器性能,Session过多,增加服务器压力
- 单个Cookie保存的数据不能超过4K,很多浏览器都限制一个站点最多保存20个Cookie,Session是没有大小限制和服务器的内存大小有关。
Cookie的使用
- Cookie类中的常用方法
public void setMaxAge(int expiry)
public String getName()
public String getValue()
public void setValue(String newValue)
- 下面是一个显示用户上次登陆时间的经典小案例
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();
boolean flag = false;
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 = new Cookie("datetime", String.valueOf(currentTimeMillis));
resp.addCookie(cookie);
}
}
- Cookie中处理中文乱码的方式
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的使用
- 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();
- 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");
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);
}
}
- 删除Session的两种方式
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession();
session.invalidate();
}
<session-config>
<session-timeout>1session-timeout>
session-config>