基本介绍
1.什么是会话
会话可以简单理解为:用户开一个浏览器,点击多个超链接,访问多个Web资源,然后关闭浏览器。整个过程称为一个会话
2.会话过程中要解决的一些问题
1.每个用户再使用浏览器与客户端进行会话的过程中,不可避免会各自产生一些数据,服务器要想办法为每个用户保存这些数据。
2.例如:多个用户点击超链接通过一个servlet各自购买一些商品,服务器应该会想办法把每一个用户购买的商品保存在各自的地方,以便于这些用户点击结账servlet时,结账servlet可以得到用户各自购买的商品为用户结账。
会话的两种技术
Cookie基本介绍
1.cookie是什么
Cookie是客户端技术,服务器把每个用户的数据以cookie的形式写给用户各自的浏览器。当用户使用浏览器再去访问服务器中的
Web资源时,就会带着给自的数据去。这样,Web资源处理的就是用户各自的数据了
cookie的简单示意图
1.Cookie是服务器在客户端保存用户信息,比如登录名、浏览历史等,就可以以cookie保存(不建议保存密码等敏感数据,不安全)
2.Cookie信息就像小甜饼一样,数据量并不大,服务器端在需要时就可以从客户端读取
3.强调说明:cookie数据是保持在浏览器的
2.cookie可以用来做什么
1.保存上次登陆的时间等信息
2.保存用户名、密码(加密处理),在一定时间不用重新登录
3.网站的个性化,比如制定网站的服务、内容;
3.cookie的常用方法
见API,在Javax.servlet.http下
2.cookie底层实现机制-创建和读取cookie
1.创建cookie
package com.test.cookie;
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;
import java.io.PrintWriter;
/**
* 演示如何创建cookie,并保存到浏览器
*/
public class CreateCookie extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("CreateCookie 被调用...");
//1.创建一个cookie对象
//username是该cookie的名字,是唯一的,可以理解为key
//"张三"是该cookie的值
//可以创建多个cookie对象
//此时,该cookie还在服务器端,还没有到浏览器
Cookie cookie = new Cookie("username", "张三");
response.setContentType("text/html;charset=utf-8");
//2.将cookie发送给浏览器,让浏览器将该cookie保存起来
response.addCookie(cookie);
PrintWriter writer = response.getWriter();
writer.write("<h1>创建cookie成功</h1>");
writer.flush();
writer.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
2.获取cookie
package com.test.cookie;
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;
import java.io.PrintWriter;
/**
* 读取从浏览器发送来的cookie信息[底层仍让是http协议]
*/
public class ReadCookies extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("ReadCookies 被调用...");
//1.通过request对象读取cookie信息
Cookie[] cookies = request.getCookies();
//2.遍历cookie
if (cookies != null && cookies.length != 0) {
for (Cookie cookie : cookies) {
System.out.println("cookie name="+cookie.getName()+
"Value=" + cookie.getValue());
}
}
//3.给浏览器返回信息,提示已经成功获取cookie信息
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.println("<h1> 读取cookie成功 </h1>");
//4.关闭资源
writer.flush();
writer.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
3.获取指定的cookie
需求:在服务器端怎样获取指定的cookie
1.给定Cookie的name,返回该cookie的值
2.如果不存在该cookie,则返回null
工具类
package com.test.cookie;
import javax.servlet.http.Cookie;
public class CookieUtils {
//编写一个方法,返回指定名字的cookie值
public static Cookie readCookieByName(String name, Cookie[] cookies) {
//判断传入的参数是否正确
if (name == null || "".equals(name) || cookies==null || cookies.length==0) {
return null;
}
//遍历cookies
for (Cookie cookie : cookies) {
if(cookie.equals(cookie.getName())){
return cookie;
}
}
return null;
}
}
实现类
package com.test.cookie;
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;
import java.io.PrintWriter;
public class ReadCookieByName extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// System.out.println("ReadCookieByName 被调用了...");//测试是否能被调用
//得到指定的cookie的value
//1.先得到浏览器携带的所有cookie
Cookie[] cookies = request.getCookies();
//2.使用工具类获取指定的cookie
Cookie cookieByName = CookieUtils.readCookieByName("李四", cookies);
if(cookieByName!=null){
System.out.println("得到了指定的cookie值,name="+cookieByName.getName()
+"Value="+cookieByName.getValue());
}else{
System.out.println("没有找到该cookie");
}
//3.给浏览器返回信息,提示已经成功获取cookie信息
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.println("<h1> 完成读取cookie任务 </h1>");
//4.关闭资源
writer.flush();
writer.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request,response);
}
}
注意:需要现运行CreateCookie后在运行ReadCookieByName
4.修改cookie
需求:如何修改cookie
1.给定一个cookie的name,找到该cookie,如果找到,则修改该cookie的值为“huihua”
2.如果没有找到该cookie,则提示没有该cookie
代码(创建并修改指定cookie)
package com.test.cookie;
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;
import java.io.PrintWriter;
public class UpdateCookie extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("UpdateCookie 被调用了...");
//1.根据name 查找cookie
String cookieName = "name";
Cookie[] cookies = request.getCookies();
Cookie cookie = CookieUtils.readCookieByName(cookieName, cookies);
if (null == cookie) {//代表当前浏览器中没有该cookie
System.out.println("当前访问 服务端的 浏览器没有该cookie");
} else {
cookie.setValue("huihua");
}
System.out.println("=====修改后的cookies信息=====");
//遍历cookie
for (Cookie cookie1 : cookies) {
System.out.println("cookie name=" + cookie1.getName()
+ "Value=" + cookie1.getValue());
}
//3.给浏览器返回信息,提示已经成功获取cookie信息
response.setContentType("text/html;charset=utf-8");
//4.如果希望浏览器本地的cookie也修改,则需要使用response.addCookie(cookie);
if (cookie != null) {
response.addCookie(cookie);
}
PrintWriter writer = response.getWriter();
writer.println("<h1> 完成 更新cookie任务 </h1>");
writer.flush();
writer.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
代码(如果出现同名cookie的情况,直接覆盖)
package com.test.cookie;
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;
import java.io.PrintWriter;
public class UpdateCookie extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
System.out.println("UpdateCookie 被调用了...");
//1.根据name 查找cookie
String cookieName = "name";
Cookie[] cookies = request.getCookies();
//如果直接创建一个同名cookie
Cookie userNameCookie = new Cookie("username", "hahaha");
Cookie cookie = CookieUtils.readCookieByName(cookieName, cookies);
if (null == cookie) {//代表当前浏览器中没有该cookie
System.out.println("当前访问 服务端的 浏览器没有该cookie");
} else {
cookie.setValue("huihua");
}
System.out.println("=====修改后的cookies信息=====");
//遍历cookie
for (Cookie cookie1 : cookies) {
System.out.println("cookie name=" + cookie1.getName()
+ "Value=" + cookie1.getValue());
}
//3.给浏览器返回信息,提示已经成功获取cookie信息
response.setContentType("text/html;charset=utf-8");
//4.如果希望浏览器本地的cookie也修改,则需要使用response.addCookie(cookie);
if (cookie != null ) {
response.addCookie(cookie);
}
//把新创建的userNameCookie重写保存到浏览器
//如果出现同名,相当于覆盖
if(userNameCookie!=null){
response.addCookie(userNameCookie);
}
PrintWriter writer = response.getWriter();
writer.println("<h1> 完成 更新cookie任务 </h1>");
writer.flush();
writer.close();
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}