Cookie&Session
Posted 超霸霸
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Cookie&Session相关的知识,希望对你有一定的参考价值。
Cookie&Session
一、会话技术
- 会话:一次会话中包含多次请求和响应
- 功能:在一次会话的范围内的多次请求间共享数据
- 方式:
- 客户端会话技术:Cookie
- 服务器端会话技术:Session
二、Cookie
1.概念
客户端会话技术,绑定数据
2.使用步骤
- 创建Cookie对象,绑定数据
- 发送Cookie对象
- 获取Cookie,拿到数据
@WebServlet("/CookieDemo1")
public class CookieDemo1 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//1.创建cookie对象
Cookie c = new Cookie("msg", "hello");
//2.发送cookie
response.addCookie(c);
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
@WebServlet("/CookieDemo2")
public class CookieDemo2 extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//3.获取Cookie
Cookie[] cs = request.getCookies();
//获取数据,遍历Cookies
if (cs != null) {
for (Cookie c : cs) {
String name = c.getName();
String value = c.getValue();
System.out.println(name + "---" + value);
}
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
3.实现原理
基于响应头set-cookie和请求头Cookie实现
4.Cookie的细节
-
一次性发送多个cookie:使用response调用多次addCookie方法发送cookie即可
Cookie c1 = new Cookie("msg", "hello"); Cookie c2 = new Cookie("name", "luffy"); response.addCookie(c1); response.addCookie(c2);
-
cookie在浏览器中的保存时长:
- 默认情况下,浏览器关闭后cookie数据被销毁
- 持久化存储:setMaxAge(int Seconds)
- 正数:将Cookie数据写到硬盘的文件中,在该时间内,关闭浏览器,cookie信息仍保留
- 负数:默认值
- 0:删除Cookie信息
Cookie c = new Cookie("msg", "hello"); c.setMaxAge(50); response.addCookie(c);
-
cookie存中文问题:
- tomcat 8之后,cookie支持中文数据
- 特殊字符(空格)不支持,需要使用URL编码,URL解码
URLEncoder.encode(str, "utf-8");//URL编码 URLDecoder.decode(str, "utf-8");//URL解码
-
cookie共享问题:
- 同一个服务器中:
- 在同一个tomcat服务器中,部署了多个web项目,不是同一个目录下的servlet之间的cookie不能共享(设置Appliaction context为目录)
- setPath(String path):设置cookie的获取范围,一般设置为
/
达到共享目的
c.setPath("/");
- 不同服务器之间:
- setDomain(String path):如果设置一级域名相同,则多个服务器之间cookie可以共享
- 同一个服务器中:
5.Cookie的特点和作用
- cookie存储数据在客户端浏览器
- 浏览器对于单个cookie的大小有限制(4kb)以及对同一个域名下的总cookie数量也有限制(20个)
- cookie一般用于存储少量不太重要的数据
- 注意作用:在不登陆的情况下,完成服务器对客户端的身份识别
6.Cookie案例
- 第一次登录时打印第一次登录,否则打印上一次登录时间
package cn.chao.web;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
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.net.URLDecoder;
import java.net.URLEncoder;
import java.text.SimpleDateFormat;
import java.util.Date;
@WebServlet("/Cookie_example")
public class Cookie_example extends HttpServlet {
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//这里必须设置才能显示中文
response.setContentType("text/html;charset=utf-8");
//1.获取所有Cookie
Cookie[] cookies = request.getCookies();
boolean flag = false;
//2.遍历所有Cookie
if (cookies != null) {
for (Cookie cookie : cookies) {
//3.判断Cookie名称是否等于lastTime
if ("lastTime".equals(cookie.getName())) {
flag = true;
//不是第一次登录
String lasttime = cookie.getValue();//上一次登录时间
lasttime = URLDecoder.decode(lasttime, "utf-8");//URL解码
response.getWriter().write("<h1>上一次的登录时间为:" + lasttime + "</h1>");
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日HH:mm:ss");
String nowtime = sdf.format(date);
nowtime = URLEncoder.encode(nowtime, "utf-8");//URL编码
cookie.setValue(nowtime);
response.addCookie(cookie);//必须发送回去
}
}
}
if (cookies == null || flag == false) {
//第一次登录
response.getWriter().write("<h1>第一次登录</h1>");
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日hh:mm:ss");
String nowtime = sdf.format(date);
nowtime = URLEncoder.encode(nowtime, "utf-8");
Cookie cookie = new Cookie("lastTime", nowtime);
cookie.setMaxAge(60 * 60 * 24 * 30);//设置周期为一个月
response.addCookie(cookie);
}
}
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
三、Session
1.概念
服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中:HttpSession
2.HttpSession
-
获取HttpSession对象:
HttpSession session=request.getSession();
-
使用HttpSession对象:
-
Object getAttribute(String name);
-
void setAttribute(String name,Object value);
-
void removeAttribute(String name);
-
//1.获取session
HttpSession session = request.getSession();
//2.存储数据
session.setAttribute("msg","hello");
//1.获取session
HttpSession session = request.getSession();
//2.获取数据
Object msg = session.getAttribute("msg");
System.out.println(msg);
3.原理
Session的实现是依赖于Cookie的
4.细节
-
客户端关闭,服务器不关闭,两次获取的session是否为同一个
- 默认情况下不是同一个
- 如果需要相同,则可以创建Cookie,键为JSESSIONID,设置最大存活时间,让cookie持久化保存
//2.期望客户端关闭后,session也能相同 Cookie c = new Cookie("JSESSIONID", session.getId()); c.setMaxAge(60 * 60); response.addCookie(c);
-
客户端不关闭,服务器关闭后,两次获取的session是否为同一个
- 不是同一个,但是要确保数据不丢失,tomcat自动完成以下工作
- session的钝化:在服务器正常关闭前,将session对象系列化到硬盘上
- session的活化:在服务器启动后,将session文件转化为内存中的session对象
- 不是同一个,但是要确保数据不丢失,tomcat自动完成以下工作
-
session什么时候被销毁
- 服务器关闭
- session对象调用
invalidate()
方法 - session默认失效时间为30分钟
//选择性修改配置 <session-config> <session-timeout>30</session-timeout> </session-config>
5.Session的特点
- session用于存储一次会话的多次请求的数据,存在于服务器端
- session可以存储任意类型,任意大小的数据
- session与cookie的区别:
- session存储数据在服务器端,cookie在客户端
- session没有数据大小限制,cookie有
- session数据安全,cookie相对不安全
以上是关于Cookie&Session的主要内容,如果未能解决你的问题,请参考以下文章