会话技术-Cookie
基本介绍
1.什么是会话?
会话可简单地理解为: 用户开启一个浏览器, 点击多个超链接, 访问服务器多个web资源, 然后关闭浏览器, 整个过程称之为一个会话.
2.会话过程中要解决哪些问题?
1)每个用户在使用浏览器与服务器进行会话的过程中, 不可避免地会产生一些数据, 服务器要想办法帮每个用户保存这些数据.
2)例如: 多个用户点击超链接通过一个servlet各自购买了一个商品, 服务器应该想办法把每一个用户购买的商品保存在各自的地方, 以便于这些用户点结账servlet时, 结账servlet可以得到用户各自购买的商品为用户结账.
会话的两种技术
cookie, Session.
cookie有什么用?
1.大家在访问某个网站的时候, 是否能看到提示你上次登陆网站的时间, 而且要注意的是不同用户上次登陆的时间肯定是不一样的, 这是怎么实现的?
2.大家访问某个购物网站的时候, 是否能看到提示你曾经浏览过的商品, 不同用户浏览的商品肯定不一样, 这是怎么实现的?
3.解决之道-cookie技术
cookie(小甜饼)是客户端技术, 服务器把每个用户的数据以cookie的形式写给用户各自的浏览器. 当用户使用浏览器再去访问服务器中的web资源时, 就会带着各自的数据去. 这样, web资源处理的就是用户各自的数据了.
cookie介绍
二说cookie
1.cookie是服务器在客户端保存的用户信息, 比如登录名, 浏览历史等, 就可以以cookie的方式保存.
2.cookie信息就像是小甜饼(cookie 中文)一样, 数据量并不大, 服务器端在需要的时候可以从客户端/浏览器(通过http协议)读取.
3.这个就是edge浏览器里的cookie信息.
4.再次强调, cookie数据是保存在浏览器的.
cookie可以用来干啥
1.保存上次登陆时间等信息.
2.保存用户名, 密码, 在一定时间内不用重新登陆.
3.网站的个性化, 比如定制网站的服务, 内容.
cookie常用方法
1.cookie有点像一张表(K-V), 分两列, 一个是名字, 一个是值, 数据类型都是String, 都是小量的数据, 如图
2.如果创建一个cookie(在服务端创建的)
cookie cookie = new cookie(String name, String val);
cookie.setMaxAge();//保存时间
3.如何将一个cookie添加到客户端
response.addcookie(cookie);
4.如何读取cookie(在服务端读取cookie信息)
request.getcookies();
cookie底层实现机制-创建和读取cookie
需求: 演示Cookie底层实现机制, 创建和读取Cookie.
代码实现
1.新建java项目 cookie-session
2.引入servlet-api.jar
4.创建src/com/zzw/cookie/CreateCookie.java
/**
* 演示如何创建cookie,并保存到浏览器
*/
public class CreateCookie extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("CreateCookie doPost 被调用...");
//1.创建一个Cookie对象
// username是该cookie的名字,是唯一的,可以理解为key; zzw 是该cookie的值
// 可以创建多个Cookie对象,这里只创建了一个. 这时cookie在服务器端, 还没有在浏览器端
Cookie username = new Cookie("username", "zzw");
Cookie email = new Cookie("email", "[email protected]");
//2.将cookie发送给浏览器, 让浏览器将该cookie保存
response.setContentType("text/html;charset=utf-8");
response.addCookie(username);
response.addCookie(email);
PrintWriter writer = response.getWriter();
writer.print("<h1>创建cookie成功!</h1>");
writer.flush();
writer.close();
}
}
配置web.xml
<servlet>
<servlet-name>CreateCookie</servlet-name>
<servlet-class>com.zzw.cookie.CreateCookie</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>CreateCookie</servlet-name>
<url-pattern>/createCookie</url-pattern>
</servlet-mapping>
5.浏览器访问 https://localhost:8080/cookie_session/createCookie, 使用浏览器抓包分析 创建 Cookie 的底层机制
6.创建src/com/zzw/cookie/ReadCookie.java
public class ReadCookies extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
/*读取浏览器/客户端发送来的cookie信息*/
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("ReadCookies 被调用...");
//1.通过request对象获取cookie信息
Cookie[] cookies = request.getCookies();
//2.遍历cookies信息,先判断一下
if (cookies != null && cookies.length != 0) {
for (Cookie cookie : cookies) {
System.out.println("cookie: 名字=" + cookie.getName() + ", 值=" + cookie.getValue());
}
}
//3.给浏览器返回信息
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.print("<h1>读取cookies信息成功</h1>");
writer.flush();
writer.close();
}
}
配置web.xml
<servlet>
<servlet-name>ReadCookie</servlet-name>
<servlet-class>com.zzw.cookie.ReadCookie</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>ReadCookie</servlet-name>
<url-pattern>/readCookie</url-pattern>
</servlet-mapping>
7.浏览器访问 https://localhost:8080/cookie_session/readCookie, 使用浏览器抓包分析 创建 Cookie 的底层机制
8.不同会话, jsessionid不同.
1.提示: 访问Servlet(比如 http://localhost:8080/cs/updatecookie)不会生成JSESSIONID, 访问http://localhost:8080/cs/才会生成
2.要关闭浏览器再开一个新的, 才能产生一个新的session会话
应用实例-读取指定cookie和修改cookie
1.创建src/com/zzw/cookie/utils/CookieUtils.java
public class CookieUtils {
//编写一个方法, 返回指定名字的cookie
public static Cookie readCookieByName(String name, Cookie[] cookies) {
//判断输入的参数格式是否正确
if (name == null || "".equals(name) || cookies == null || cookies.length == 0) {
return null;
}
//遍历cookie数组
for (Cookie cookie : cookies) {
if (name.equals