目录
一、什么是 Cookie?
二、如何创建Cookie?
// 创建Cookie 对象
Cookie cookie = new Cookie("key1","value1");
// 通知浏览器 创建 cookie 。这一步千万不能省、。
response.addCookie( cookie );
按F12可查看 Cookie
Cookie 是通过 响应头 中的 Set-Cookie 中创建的。所以 最后一步:response.addCookie 是千万不能少的,少了会创建不成功。
也可一次创建多个 Cookie,创建一个 addCookie 一次。、
三、获取 Cookie
// 获取 Cookies,返回一个数组
Cookie[] cookies = request.getCookies();
如果想要得到某个 cookie 是没有匹配的方法的,需要将 cookies 数组进行遍历,然后进行判断。
在开发中使用的时候,一般是将 查找 cookie 的方法 封装一个工具类:
public class CookieUtils {
/**
*
* @param name 查找 cookie 的名字
* @param cookies cookie数组
* @return
*/
public static Cookie findCookies(String name,Cookie[] cookies){
if (name == null || cookies == null || cookies.length == 0){
return null ;
}
for (Cookie cookie : cookies) {
if (name.equals(cookie.getName())){
return cookie ;
}
}
return null ;
}
}
四、修改 Cookie 的值
Cookie底层其实就是 map,第一种方案就是:key 重复,覆盖 value
//修改 Cookie 值
protected void update(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 第一种方案:
//获取 cookie 对象
Cookie cookie = new Cookie("key1","newValue1");
// 增加 到浏览器中。覆盖原来 名字为 key1的 value
response.addCookie(cookie);
// 第二种方案:
//查找到某个 cookie
Cookie cookie1 = CookieUtils.findCookies("key2", request.getCookies());
if (cookie1 != null){
//对 value 进行修改
cookie1.setValue("newValue2");
//增加到浏览器中
response.addCookie(cookie1);
}
response.getWriter().write("cookie 值已经修改好");
}
对于要修改的值不应包含空格、方括号、圆括号、等号、逗号、双引号、斜杠、问号、at 符号、冒号和分号。空值在所有浏览器上的行为不一定相同。
五、设置 Cookie 的存活时间
// 当 MaxAge 是负数时
protected void cookie_life (HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = new Cookie("key3","value3");
cookie.setMaxAge(-1); // 设置 -1 浏览器一关闭就会删除,默认就是-1.
response.addCookie(cookie);
}
//当 MaxAge 是 0 时
protected void deleteNow(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = CookieUtils.findCookies("key1", request.getCookies());
if (cookie != null) {
cookie.setMaxAge(0); //设置0 立马删除
response.addCookie(cookie);
response.getWriter().write("key1已经被删除");
}
}
protected void cookie_life_3600(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
Cookie cookie = CookieUtils.findCookies("key2", request.getCookies());
if (cookie != null){
// 设置 指定的存活时间。
cookie.setMaxAge(60*60);
response.addCookie(cookie);
response.getWriter().write("将 key2 的生存周期设置为 3600 s");
}
}
六、设置Cookie的路径
protected void cookie_path(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//创建cookie对象
Cookie cookie = new Cookie("key4","value4");
// 设置 cookie 的路径,只有符合这个路径才能获取到 cookie
cookie.setPath(request.getContextPath() + "/a"); //设置cookie 的路径为:/工程路径/a
response.addCookie(cookie);
}
在 谷歌 浏览器中,如果你的请求地址不符合 cookie 的路径,为了安全考虑 他是不会给你显示 cookie 的。
不符合 Cookie路径:
符合 Cookie 路径:
七、Cookie 免用户名登录
当用户第一次访问时,输入用户名密码,第二访问不需要输入用户名,自动给你获取了。就是免用户名登录
login.jsp 页面:
LoginServlet :登录成功后,将用户名保存到 cookie 中,登录失败是不会保存的。
public class LoginServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//获取请求参数
String username = request.getParameter("username");
String password = request.getParameter("password");
if ("admin".equals(username) && "admin".equals(password)){
//登录成功后,将用户名保存到 cookie 中
Cookie cookie = new Cookie("username",username);
cookie.setMaxAge( 60 * 60 * 24 * 7); //用户名保留七天
response.addCookie(cookie);
System.out.println("登录成功");
}else{
System.out.println("登录失败");
}
}
}
当你第二次访问登录界面时,用户名就会自动从 cookie中获取。
八、什么是 Session ?
1、Session 是一个接口(HttpSession)。
2、Session 就是会话。它是用来维护一个客户端和服务器之间关联的一种技术。
3、每个客户端都有自己的一个 Session 会话。
4、Session 会话中,我们经常用来保存用户登录之后的信息。、
5、Cookie 是保存在 浏览器中,Session 是保存在 服务器中。
九、如何创建 Session 和 获取 Session ?
创建 和 获取 都是一样的:
request.getSession()
第一次调用是:创建 Session 会话
之后调用都是:获取前面创建好的 Session 会话对象。
session.isNew(); 判断到底是不是刚创建出来的(新的)
true 表示刚创建
false 表示获取之前创建
每个会话都有一个身份证号。也就是 ID 值。而且这个 ID 是唯一的。
session.getId() 得到 Session 的会话 id 值。
public class SessionServlet extends BaseServlet {
protected void createAndGetSession(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
// 第一次:创建 session
HttpSession session = request.getSession();
// 判断 session 是否是新创建的
boolean aNew = session.isNew();
//获取 session 的 id
String id = session.getId();
response.getWriter().write("session 的 ID:"+id);
response.getWriter().write("session 是否是新创建的:"+ aNew);
}
}
十、往 Session 域中的存 和 取
和之前学的 session域存放数据一样。
// session 域中存数据
request.getSession().setAttribute("key1","value1");
//从 session 域中取出数据
Object key1 = request.getSession().getAttribute("key1");
十一、Session 的生命周期控制
![](https://img-blog.csdnimg.cn/3094aec019f144f7accc36d22d568ba7.png?x-oss-process=image/watermark,type_d3F5LXplbmhlaQ,shadow_50,text_Q1NETiBAMjAyMuWKoOayueWRgA==,size_15,color_FFFFFF,t_70,g_se,x_16)
设置 session 生存周期的俩种方法:
1、配置工程下的 web.xml 文件:
使 本工程 下的所有 session 的声明周期都设置为 20 min
<session-config>
<session-timeout>20</session-timeout>
</session-config>
2、使用 setMaxInactiveInterval(int interval) 方法
使用这个方法只能设置单独的 session 生命周期。
protected void setMaxInactiveInterval(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
HttpSession session = request.getSession();
session.setMaxInactiveInterval(3);
response.getWriter().write("将 session 的生命周期设置为 3 s");
}
Session 超时概念:只要不断的发送请求就永远不会超时,俩次请求之间的时长超过设置的时间就会超时
十二、 Session 和 浏览器 的技术关系
Session 是用于 服务器端记录信息的,Cookie 是用于浏览器记录信息的。
如果浏览器有 Cookie 信息:每次发送请求都会把 Cookie 信息发送给服务器。
就是一串这样的信息:JSESSIONID=C4ABD831BD83E5FE59F621B8AEF6E4FA;
服务器会根据这个 ID 找到 内存中的 session 并返回浏览器中。
如果浏览器没有 Cookie 信息:服务器会 重新创建出来一个 session对象,并发送给浏览器。