Cookie&Session
会话技术
会话:一次会话中包含多次请求和响应
- 一次会话:浏览器第一次给服务器资源发送请求,会话建立,直到有一方断开为止
功能:
- 客户端会话技术:
Cookie
- 服务器端会话技术:
Session
Cookie
-
概念:客户端会话技术,将数据保存到客户端
-
使用步骤:
- 创建
Cookie
对象,绑定数据new Cookie(String name,String value)
- 发送
Cookie
对象response.addCookie(Cookie cookie)
- 获取
Cookie
对象数组,拿到数据Cookie[] request.getCookies()
- 创建
-
常用方法
方法声明 功能描述 String getName() 获取Cookie对象的name String getValue() 获取Cookie对象的value void setName(String name) 设置Cookie对象的name void setValue(String value) 设置Cookie对象的value -
注意细节:
- 一次可以发送多个
Cookie
对象- 创建多个
Cookie
对象,使用response
调用多次addCookie
方法发送Cookie
对象即可
- 创建多个
Cookie
对象默认情况下保存时间为浏览器关闭前Cookie
对象持久化存储:setMaxAge(int seconds)
- seconds 是正数:将
Cookie
信息存储到硬盘,存活seconds秒,时间到后,自动删除Cookie
文件 - seconds 是负数:默认值
- seconds 是零:删除
Cookie
信息
- seconds 是正数:将
Cookie
能不能存中文?- 在Tomcat 8 之前
Cookie
不能直接存储中文数据。(需要URL编码) - 在Tomcat 8之后
Cookie
支持中文数据,但不支持特殊字符。(建议URL编码)
- 在Tomcat 8 之前
- 一次可以发送多个
-
Cookie
的共享问题-
同一Tomcat服务器中的
Cookie
共享问题?- 多个web项目之间的
Cookie
数据默认不能共享 setPath(String path)
:设置Cookie
的获取范围。默认设置为当前的虚拟目录,如果要共享,将 path 设置为/
- 多个web项目之间的
-
不同Tomcat服务器中的
Cookie
共享问题?setDomain(String path)
:如果设置一级域名相同,那么多个服务器之间的Cookie
可以共享- 例子:
setDomain(".baidu.com")
,那么tieba.baidu.com
和news.baidu.com
中Cookie
可以共享
- 例子:
-
Cookie
的特点Cookie
存储数据在客户端浏览器- 单个
Cookie
大小有限制(4kb),同一域名下的总Cookie
数量有限制(20个)
-
Cookie
的作用Cookie
一般用于存储少量的不太敏感的数据- 在不登录的情况下,完成服务器对客户端的身份识别
-
案例:记住上一次访问时间
需求:
- 访问一个Servlet,如果是第一次访问,则提示:您好,欢迎您首次访问。
- 如果不是第一次访问,则提示:欢迎回来,您上次访问时间为:显示时间字符串
Cookie
实例代码:
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("/LoginServlet")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//设置响应的消息体的数据格式以及编码
response.setContentType("text/html;charset=utf-8");
Cookie[] cookies = request.getCookies();
boolean flag = false;
//已经访问过
if(cookies!=null && cookies.length>0){
for (Cookie cookie : cookies) {
String name = cookie.getName();
//判断名称是否是:lastTime
if("lastTime".equals(name)){
flag = true;
//设置Cookie的value
//获取当前时间的字符串,重新设置Cookie的值,重新发送cookie
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日,hh时mm分ss秒");
String str_date = sdf.format(date);
System.out.println("编码前:"+str_date);
//URL编码
str_date = URLEncoder.encode(str_date, "utf-8");
System.out.println("编码后:"+str_date);
cookie.setValue(str_date);
//设置cookie的存活时间
cookie.setMaxAge(30);
response.addCookie(cookie);
//响应数据
//获取Cookie的value
String value = cookie.getValue();
System.out.println("编码前:"+value);
//URL解码:
value = URLDecoder.decode(value,"utf-8");
System.out.println("解码后"+value);
response.getWriter().write("<h1>欢迎回来,您上次访问时间为"+value+"</h1>");
break;
}
}
}
//第一次访问
if(cookies == null || cookies.length == 0|| flag == false){
//设置Cookie的value
//获取当前时间的字符串,重新设置Cookie的值,重新发送cookie
Date date = new Date();
SimpleDateFormat sdf = new SimpleDateFormat("yyyy年MM月dd日,HH时mm分ss秒");
String str_date = sdf.format(date);
System.out.println("编码前:"+str_date);
//URL编码
str_date = URLEncoder.encode(str_date,"utf-8");
System.out.println("编码后:"+str_date);
Cookie cookie = new Cookie("lastTime", str_date);
//设置cookie的存活时间
cookie.setMaxAge(30);
response.addCookie(cookie);
response.getWriter().write("<h1>您好,欢迎您首次访问</h1>");
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
this.doPost(request, response);
}
}
JSP
- 概念:java Servlet Pages:java服务器端页面,本质上是一个
Servlet
- JSP页面中可以同时有HTML标签和java代码,用于简化书写
-
使用方式:
方式 功能描述 <% java代码 %>
Java代码等效于在Service方法中执行 <%! java代码 %>
java代码 <%= java代码 %>
java代码会直接输出到页面上 -
JSP的内置对象:
-
在jsp页面中的对象不需要获取和创建,可以直接使用
-
jsp一共有9个内置对象。
-
request
-
response
-
out
:字符输出流对象。可以将数据输出到页面上。out.write()
与response.getwriter()
区别:response.getWriter()
数据输出永远在out.write()
在前
-
-
Session
-
概念:服务器端会话技术,在一次会话的多次请求间共享数据,将数据保存在服务器端的对象中。
HttpSession
-
使用步骤:
-
获取
HttpSession
对象:HttpSession session = request.getSession();
-
使用
HttpSession
对象:方法声明 功能描述 Object getAttribute(String name) void setAttribute(String name,Object value) void removeAttribute(String name)
-
-
注意细节:
-
客户端关闭后,服务器不关闭,两次获取的
session
是否为同一个-
默认情况下不是同一个
-
如果需要相同,则可以创建
Cookie
,键为JSESSIONID
,设置最大存活时间,让Cookie
持久化保存。Cookie c = new Cookie("JSESSIONID",session.getID()); c.setMaxAge(60*60); response.addCookie(C);
-
-
客户端不关闭,服务器关闭后,两次获取的
session
是同一个吗?- 不是同一个,但是要确保数据不丢失。Tomcat自动完成以下工作
session
的钝化:在服务器正常关闭之前,将session
对象系列化到硬盘上session
的活化:在服务器启动后,将session
文件转化为内存中的session
对象即可。
- 不是同一个,但是要确保数据不丢失。Tomcat自动完成以下工作
-
session
什么时候被销毁?-
服务器关闭
-
session
对象调用invalicate()
-
session
默认失效时间30分钟<!-- 选择性配置修改 --> <session-config> <session-timeout>30</session-timeout> </session-config>
-
-
-
session
的特点-
session
用于存储一次会话的多次请求的数据,存储服务器端 -
session
可以存储任意类型,任意大小的数据session
和Cookie
的区别:session
存储数据在服务器端,Cookie
在客户端session
没有数据大小限制,Cookie
有限制session
数据安全,Cookie
相对不安全
-