Cookie
1.会话
会话:指用户打开了一个浏览器,点击了很多超链接,访问了多个Web资源,后关闭浏览器,这个过程可以称之为“会话”。
有状态的会话:例如一个学生来过咱们班的教室,下次再来的时候,我们就能记住他来过。这个就是有状态的会话。
Eg:
一个网站如何证明你来过?
客户端<——>服务端
1.服务端会给客户一个 信件,客户端下次访问的时候,带上这个信件,就可以被认出来了。(Cookie)。
2.服务器登记你来过了,下次再访问的时候,会自动匹配你(Session)。
2保存会话的两种技术:
Cookie:
- 客户端技术(具有响应,请求)
Session:
- 服务器技术,利用此技术,我们可以保存,用户的会话信息,我们可以把信息或者数据放在Session中。
常见场景:
网站登录后,关闭浏览器再打开此网页,一般情况下第二次进入都不用再次登录了,账户信息会被记住。
3.Cookie
总结:
1.从请求中拿到Cookie信息。
2.服务器响应给客户端Cookie。
代码总结:
Cookie[] cookies = req.getCookies();//Cookie的获取。
Cookie cookie = cookies[i];
cookie.getName()//获取Cookie中的Key
cookie.getValue()//获取Cookie中的Value
new Cookie("Last_LoginTime", System.currentTimeMillis() + "");//新建一个Cookie
cookie.setMaxAge(24*60*60)//设置Cookie的有效期,这里24*60*60表示一天
resp.addCookie(cookie);//响应给客户端一个Cookie
举例:
Servlet:
package com.edwin.servlet;
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 javax.xml.crypto.Data;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
/**
* @author Edwin D
* @date 2020.6.6 上午 8:28
*/
//保存用户上次访问的时间
public class CookieDemo01 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
// 服务器会保存你上次来时的时间,把这个时间封装成一个信件,下次你带来,就会知道是你来了。
// 解决中文乱码问题
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");//解决网页页面乱码
PrintWriter out = resp.getWriter();
// Cookie需要服务器从客户端获取。
Cookie[] cookies = req.getCookies();
// 自动创建时用数组,说明Cookie可能存在多个。
// 判断Cookie是否存在
if (cookies != null) {
// 如果存在的操作
out.write("上次访问的时间为:");
for (int i = 0; i < cookies.length; i++) {
Cookie cookie1 = cookies[i];
if (cookie1.getName().equals("Last_LoginTime")) {
// 获取Cookie中的值
long Last_LoginTime = Long.parseLong(cookie1.getValue());
Date date = new Date(Last_LoginTime);
out.write(date.toLocaleString());
System.out.println("上次访问的时间为:"+date.toLocaleString());
}
}
} else {
// 不存在的操作
out.write("这是您第一次访问本网站!");
}
// 服务器给用户响应一个Cookie
Cookie cookie2 = new Cookie("Last_LoginTime", System.currentTimeMillis() + "");
cookie2.setMaxAge(24*60*60);
resp.addCookie(cookie2);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
Xml:
<servlet>
<servlet-name>Cookie1</servlet-name>
<servlet-class>com.edwin.servlet.CookieDemo01</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Cookie1</servlet-name>
<url-pattern>/Cookie1</url-pattern>
</servlet-mapping>
输出:
细节问题:
1.Cookie一般会保存在本地的用户目录下APPdata。
2.一个网站的Cookie是否存在上限?
-
一个Cookie只能保存一个信息。
-
一个Web站点可以给用户浏览器发送多个Cookie,最多存放20个。
-
Cookie大小有限制:最大4KB。
-
300个Cookie是浏览器的上限。
删除Cookie:
1.不设置有效期,关闭浏览器后,会自动失效。
2.设置有效期为:0,效果同上。
代码:
Servlet:
package com.edwin.servlet;
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 javax.xml.crypto.Data;
import java.io.IOException;
import java.io.PrintWriter;
/**
* @author Edwin D
* @date 2020.6.6 上午 10:22
*/
//保存用户上次访问的时间
public class CookieDemo02 extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie cookie = new Cookie("Last_LoginTime", System.currentTimeMillis() + "");
cookie.setMaxAge(0);//清除代码。
resp.addCookie(cookie);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
XML:
<servlet>
<servlet-name>Cookie2</servlet-name>
<servlet-class>com.edwin.servlet.CookieDemo02</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>Cookie2</servlet-name>
<url-pattern>/Cookie2</url-pattern>
</servlet-mapping>
操作前:
操作后:
编码,解码:
用于特殊情况下的乱码解决。
//编码
Cookie cookie = new Cookie("name", URLEncoder.encode("Edwin 段","Utf-8");
//解码
out.write(URLEncoder.encode(cookie1.getValue(),"Utf-8");
参考文献
《【狂神说Java】JavaWeb入门到实战》
2020.06.07