Cookie和Session
目录
1.Cookie
1.1.Cookie理解
Cookie是储存在用户本地终端上的数据。
首先在讲解Cookie,Cookie存储在本地的服务端,在上文已经体现了,但是Cookie的存储也会在浏览器上进行体现,
下图是我从火狐浏览器截取的我的Cookie的数据
对应的是站点(个人理解就是不同的站点存在不同的Cookie,在浏览器发送请求的时候,同时也会把Cookie发送给服务端。)
下图是我在浏览力扣网站的Cookie (验证了服务的每次请求都会带着对应的Cookie)
也可以使用命令获取当前的Cookie如下图所示:
使用的命令是:
javascript:alert (document. cookie)
1.2.对Cookie的验证
首先需要创建一个Servlet类。
package edu.wan.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.*;
import java.io.IOException;
import java.io.PrintWriter;
public class CookieServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码格式
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/hmtl;charset=utf-8");
//创建一个Cookie,并把这个Cookie放到resp当中去
Cookie cookie = new Cookie("name","wan");
//如果没有进行设置的化 这个cookie的有效期就是session
cookie.setMaxAge(20); //单位是秒
resp.addCookie(cookie);
//从req获取Cookie,并循环获取cookie名字位name的数据
Cookie[] cookies = req.getCookies();
PrintWriter out = resp.getWriter();
for (int i = 0; i < cookies.length; i++) {
Cookie cookie1 = cookies[i];
if (cookie1.getName().equals("name")){
out.write("获取到了cookie,cookie的值是"+cookie1.getValue());
}
}
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
首先我们预测下,当第一次请求的时候,页面肯定时没有"name"值的Cookie,所以页面并没有写入任何东西,应该展示的是一个空页面(但是第一次访问的时候设置了Cookie的值),当我第二次进行这个网址的访问之后,就会展示出输出到前台的内容。
测试结果如下:
当我第一次访问的时候,就是一个空白页面
第二次单机访问的时候
请求中会带着参数如下
Cookie存储到终端上,存储的地址在
注册表的:
HKEY_CRURRENT_USER\SOFTWARE\MICROSOFT\WINDOWS\CURRENTVESION\EXPLORER\USER SHELL FOLDERS Cookies 的Value的值是实际上Cookie存储的地方。
Cookie实现的功能:
- 记住密码。
- 选择账号自动带出密码。
2.Session
2.1.Session理解
Session存储在网页的服务器端。
首先Session可以存储信息,在服务器启动的时候,就会创建Session。
注:我理解的Session是由Tomcat(部署的服务器进行提供的)并且只有在不同的浏览器获取的Session是不一致的,在一个浏览器打开新的网页,Session是不会改变的。
使用Edge浏览器获取到的SessionId
使用Google浏览器获取到的SessionId
打开一个新网页,获取到的SessionId
2.2.Session测试
把数据存储到Session中
package edu.wan.Servlet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
public class SessionServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置编码格式
req.setCharacterEncoding("utf-8");
resp.setCharacterEncoding("utf-8");
resp.setContentType("text/hmtl;charset=utf-8");
//从请求中获取session
HttpSession session = req.getSession();
//往session中存入数据
session.setAttribute("name","Wan");
//获取session的id
String id = session.getId();
PrintWriter out = resp.getWriter();
out.write("获取到的sessionid是:"+id);
out.close();
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
在第二个Servlet中获取Session并且打出对应的值
如果SessionId 没有改变的化,就会取出Session中的name。
Session可以解决分布式服务的Session共享问题。
首先在使用Nginx做反向代理的时候,有两个或者多个Tomcat提供服务,这样的化就会存在我访问Tomcat1获取的是一个Sessionid,访问Tomcat2返回的是另一个SeesionId,
假如服务有一个登录的要求,我在Tomcat1进行账号的输入和验证,但是我在登录Tomcat2的时候是另一个SessionId,所以就会有登录多次的问题。
如果要解决这个问题,就可以使用相同的SessionId,就是当登录Tomcat1验证之后,把当前的Sessionid给Tomcat2这样就实现了Session共享的问题了。