Cookie技术的使用
Cookie对象:步骤
(1)创建Cookie对象,用于存储会话数据
new Cookie(java.lang.String name, java.lang.String value)
(2)修改Cookie对象
void setPath(java.lang.String uri)
void setMaxAge(int expiry)
void setValue(java.lang.String newValue)
(3)把cookie数据发送给浏览器保存
response.addCookie(cookie);
(4)浏览器带着cookie访问服务器,服务器接收cookie信息
request.getCookies();
非简化版本:
package cn.web001;
import java.io.IOException;
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;
public class ServletCookie extends HttpServlet {
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建Cookie对象,保存会话数据
Cookie cookie = new Cookie("name","miemie");
//把cookie数据发送给浏览器保存,通过响应头携带cookie数据给浏览器(set-cookie)
response.setHeader("set-cookie", "name=miemie");
//浏览器在下次访问的时候携带了cookie数据,通过请求头发送给服务器(cookie)
//服务器获取浏览器发送的cookie数据
String header = response.getHeader("name");
System.out.println(header);
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
package cn.web001;
import java.io.IOException;
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;
public class ServletCookie extends HttpServlet {
/**
* @see HttpServlet#doGet(HttpServletRequest request, HttpServletResponse response)
*/
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建Cookie对象,保存会话数据
Cookie cookie = new Cookie("name","miemie");
//把cookie数据发送给浏览器保存,通过响应头携带cookie数据给浏览器(set-cookie)
//response.setHeader("set-cookie", "name=miemie");
response.addCookie(cookie);
//浏览器在下次访问的时候携带了cookie数据,通过请求头发送给服务器(cookie)
//服务器获取浏览器发送的cookie数据
//String header = response.getHeader("name");
//System.out.println(header);
//简化版本
Cookie[] cookies = request.getCookies();
if(cookies!=null) {
for(Cookie cookie1:cookies) {
String name= cookie1.getName();
String value = cookie1.getValue();
System.out.println(name+"="+value);
}
}else {
System.out.println("nullcookie");
}
}
/**
* @see HttpServlet#doPost(HttpServletRequest request, HttpServletResponse response)
*/
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
}
(1)服务器创建Cookie对象,保存会话数据,把Cookie数据发送给浏览器
response.addCookie(cookie); (响应头:set-cookie: name=jacky)
(2)浏览器获取cookie数据,保存在浏览器缓存区,然后在下次访问服务器时携带cookie数据
(请求头: cookie: name=jacky)
(3)服务器获取浏览器发送的cookie数据
request.getCookies();
(1)cookie的数据类型一定是字符串,如果要发送中文,必须先对中文进行URL加密才可以发送。
(2)setPath(path): 修改cookie所在的有效路径。 如果把该cookie设置到某个有效路径下,然后当浏览器访问这个有效路径的时候,才会携带cookie数据给服务器。
(3) setMaxAge(整数) : 设置cookie的有效时间
正整数: 表示超过了正整数的数值的时间,cookie就会丢失(cookie保存浏览器的缓存。 目录)单位:秒
负整数: 表示如果浏览器关闭了,cookie就会丢失(cookie保存浏览器内存)。
0 : 表示删除同名的cookie 。
(4)cookie可以有多个,但是浏览器一般只允许存放300个Cookie,每个站点最多存放20个Cookie,每个Cookie的大小限制为4KB。
Cookie特点:
1)会话数据放在浏览器端
2)数据类型只能string,而且有大小限制的
3)相对数据存放不安全。
Session特点:
1)会话数据放在服务器端(服务器内存),占用服务器资源
2)数据类型任意类型,没有大小限制的。
3)相对安全
HttpSession对象:
1)创建HttpSession对象,用于保存会话数据
session = request.getSession(); 创建或获取session对象
2)修改HttpSession对象
void setMaxInactiveInterval(int interval) 设置session对象的有效时间
void invalidate() 手动销毁session对象
3)保存会话数据(作为域对象)
session.setAttribute(“name”,Object); 保存数据
session.getAttribute(“name”) 获取数据
session.removeAttribute(“name”) 删除数据
可以从session对象取出数据必须是存放数据的sessinon对象。
HttpSession session = request.getSession();含义((1)-(6))
(1)服务器创建Session对象,服务器会给这个session对象分配一个唯一的标记JSESSIONID。
(2)把JSESSIONID作为Cookie发送给浏览器。
(3)浏览器得到JSESSIONID保存下来,在下次访问时携带这个JSESSIONID去访问服务器。
(4)服务器得到JSESSIONID,在服务器内存中搜索是否存在指定JSSESSINOID的session对象。
(5)如果找到,则返回这个session对象。
(6)如果找不到,可能直接返回null,或者再创建新的session对象。
结论: 通过JSESSIONID在服务器中查询对应的session对象。
1.setMaxInactiveInterval(秒数): 设置session对象的有效时间
注意:不是浏览器关闭,session对象就销毁。
默认情况: 等待30分钟空闲时间,session对象才会销毁。
session.setMaxInactiveInterval(20);
<session-config>
<session-timeout>1session-timeout>
session-config>
2.可以让JSESSIONID不会随着浏览器关闭而丢失
/**
* 设置JSESSIONID的时间,不会随着浏览器关闭而丢失。
*/
Cookie c = new Cookie("JSESSIONID",session.getId());
c.setMaxAge(1*30*24*60*60);//1个月
response.addCookie(c);
3.直接手动销毁sessino对象
invalidate();
4.创建或得到session对象
request.getSession() / request.getSession(true)
创建或得到session对象。查询session对象,如果没有sessino对象,则创建新的session对象。
//创建或得到session对象
HttpSession session =
request.getSession(true);
request.getSession(false)
得到session对象。查询session对象,如果没有session对象,直接返回null。
//得到session对象
HttpSession session =
request.getSession(false);
if(session==null){
System.out.println("没有session对象");
}else{
//获取会话数据
String name =
(String)session.getAttribute("name");
System.out.println("name="+name);
}
总结:
会话管理: 浏览器与服务器之间会话过程中产生的会话数据
Cookie技术:会话数据保存在浏览器
核心的API:
(1)创建Cookie对象
Cookie c = new Cookie(“name”,“value”)
(2)发送给浏览器
respone.addCookie©;
(3)浏览器发送cookie给服务器,服务器接收cookie
Cookie[] cookies = request.getCookies()
Session技术: 会话数据保存在服务器(内存中)
核心API:
(1)创建或得到HttpSession对象
HttpSession session = request.getSession(true) 创建或得到
HttpSession session = request.getSession(false) 得到
(2)使用HttpSession保存和获取,删除会话数据
session.setAttribure(“name”,Object);
session.getAttribute(“name”);
session.removeAttrbute(“name”);