简介
会话:
用于打开浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话可以包含多次请求和响应(同一浏览器发送的多次请求为一次会话,不同浏览器发送请求属于不同的会话)
会话跟踪:
一种维护浏览器状态的方法,服务器需要识别多次请求是哦否来自同一浏览器,以便在同一次会话的多次请求间共享数据(服务器无法识别每次请求是否来自同一浏览器)
HTTP协议是无状态的,每次浏览器向服务器时,服务器都会将该请求视为新的请求,因此我们需要会话跟踪技术。(设置为无状态是为了响应速度)
Cookie和session就是用来解决一次会话间多次请求间数据共享的问题。
实现方式:
1、客户端会话跟踪技术:Cookie
2、服务端会话跟踪技术:Session
Cookie基本使用
Cookie:客户端会话技术,将数据保存到客户端,以后每次请求都携带Cookie数据进行访问
Cookie基本使用
发送Cookie
1、创建Cookie对象,设置数据
Cookie cookie=new Cookie("key","value");
2、发送Cookie到客户端:使用response对象
response.addCookie(cookie);
1、在src下创建一个com包下CookieServlet类
package com;
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;
public class CookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//发送Cookie
//创建Cookie对象
Cookie cookie=new Cookie("username", "zhangsan");
//2、Cookie,response
resp.addCookie(cookie);
}
}
2、web.xml配置
<servlet>
<servlet-name>CookieServlet</servlet-name>
<servlet-class>com.CookieServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CookieServlet</servlet-name>
<url-pattern>/cookieServlet</url-pattern>
</servlet-mapping>
启动访问即可,f12查看
获取Cookie
3、获取客户端携带的所有Cookie,使用request对象
Cookie[] cookie=request.getCookie();
4、遍历数组,获取每一个Cookie对象:for
5、使用Cookie对象方法获取数据
cookie.getName();
cookie.getValue();
创建CookieServlet1类,再配置web.xml
package com;
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;
public class CookieServlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//3、获取cookie数组
Cookie[] cookies=req.getCookies();
//4、遍历数组
for( Cookie cookie1:cookies){
//5、获取数据
String name=cookie1.getName();
String value=cookie1.getValue();
System.out.println("name="+name+"\nvalue="+value);
System.out.println("-------------");
}
}
}
先访问cookieServlet,在访问cookieServlet1得
这就实现了,同一浏览器的两次访问(cookieServlet和cookieServlet1两次)数据共享
Cookie原理
Cookie的实现是基于HTTP协议的
响应头:set-cookie
请求头:cookie
访问时f12查看网络
Cookie使用细节
cookie存活时间
默认情况下,cookie存储在浏览器内存中,当浏览器关闭,内存释放,则cookie被销毁
setMaxAge(int seconds):设置Cookie存活时间
①正数:将Cookie写入浏览器所在的电脑的硬盘,持久化存储,到时间自动删除
②负数:默认值,Cookie在当前浏览器内存中,当浏览器关闭时,则Cookie被销毁
②零:删除对应Cookie
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//发送Cookie
//创建Cookie对象
Cookie cookie=new Cookie("username", "zhangsan");
//设置存活时间 比如一周
cookie.setMaxAge(60*60*24*7);
//2、Cookie,response
resp.addCookie(cookie);
}
Cookie存储中文
Cookie默认不能存储中文
如果需要储存,则需要进行转码:URL编码
默认情况不支持中文:
CookieServlet类下
public class CookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//发送Cookie
//创建Cookie对象
String value="张三";
//URL编码
value= URLEncoder.encode(value, "UTF-8");
Cookie cookie=new Cookie("username", value);
//设置存活时间 比如一周
cookie.setMaxAge(60*60*24*7);
//2、Cookie,response
resp.addCookie(cookie);
}
}
CookieServlet1类下
public class CookieServlet1 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//3、获取cookie数组
Cookie[] cookies=req.getCookies();
//4、遍历数组
for( Cookie cookie1:cookies){
//5、获取数据
String name=cookie1.getName();
String value=cookie1.getValue();
//URL解码
value=URLDecoder.decode(value,"UTF-8" );
System.out.println("name="+name+"\nvalue="+value);
System.out.println("-------------");
}
}
}
版权归原作者 执久呀 所有, 如有侵权,请联系我们删除。