Cookie、Session
2021/10/17 23:10:51
本文主要是介绍Cookie、Session,对大家解决编程问题具有一定的参考价值,需要的程序猿们随着小编来一起学习吧!
Cookie、Session
1、会话
会话:用户打开浏览器,点击了很多超链接,访问多个web资源,关闭浏览器,这个过程可以称之为会话
有状态会话:用户访问过的网页,下次再次访问网页时,浏览器知道该用户访问过,不需重新验证
怎么证明某用户访问过某网站
-
服务端给客户端一个信件,下次客户端带上信件访问即可,即Cookie
-
服务端登记访问的客户,客户下次访问时服务端自动匹配客户,即Session
2、保存会话的两种技术
- Cookie
- 客户端技术(请求、响应)
- Session
- 服务端技术,利用这个技术可以保存,客户的会话信息,我们可以把数据或者信息放在Session中
- 应用场景
- 用户登录某网站后,下次不用登录就可以直接访问
3、Cookie
-
从请求中拿到cookie
//从请求中获取Cookie,来检验Cookie //注意:因为客户的Cookie是服务端给的,所以客户在第一次请求时无Cookie Cookie[] cookies = req.getCookies(); //获取并判断cookie的key cookie.getName().equals("name")) //获取cookie的值
-
服务端响应给客户端一个cookie
//生成Cookie对象 Cookie cookie = new Cookie("name",System.currentTimeMillis()+""); //设置cookie有效期为一天 cookie.setMaxAge(24*24*60); //给客户响应一个Cookie resp.addCookie(cookie);
-
cookie一般会保存在本地的用户目录下的AppData中
-
cookie存在上限
- 一个cookie只能保存一个信息
- 一个web站点可以给浏览器发送多个cookie,每个站点最多存放20个cookie
- cookie的大小有限制
- 浏览器的上限大概为300个cookie
-
删除cookie
-
不设置有效期,关闭浏览器cookie自动失效
-
设置cookie的有效期为0,即:
cookie.setMaxAge(0);
-
-
解决网络编程中数据乱码问题,如Cooike中的Value为中文;注意:这与请求、响应的乱码解决无关
-
先进行编码
cookie.getValue() = URLEncoder.encode("张某某","UTF-8")
-
输出时再解码
URLDecoder.decode(cookie.getValue(),"UTF-8")
-
-
cookie的实现
public class CookieDemo_01 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 //注意:因为客户的Cookie是服务端给的,所以客户在第一次请求时无Cookie Cookie[] cookies = req.getCookies(); if(cookies!=null){ out.write("你上次访问本页面的时间是:"); for (int i = 0; i < cookies.length; i++) { Cookie cookie = cookies[i]; if (cookie.getName().equals("name")) { long loginTime = Long.parseLong(cookie.getValue());//将字符串型的时间转换为长整型 Date date = new Date(loginTime);//将长整型时间转换回日期型 out.write(date.toLocaleString()); } } }else { out.write("这是你第一次访问本页面"); } //生成Cookie对象 Cookie cookie = new Cookie("name",System.currentTimeMillis()+""); //cookie有效期为一天 cookie.setMaxAge(24*24*60); //给客户响应一个Cookie resp.addCookie(cookie); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
4、Session(重点)
-
定义(什么是Session)
-
服务器给每个用户浏览器创建一个Session对象
-
一个Session独占一个浏览器
-
用户登录一个网站后,整个网站他都能访问
-
-
Session和Cookie的区别
- Cookie是把用户的数据写给浏览器,浏览器保存(可以保存多个)
- Session对象由浏览器创建
- Session是把用户的数据写到用户独占的Session中,服务器保存(保存重要的信息,减少服务器资源浪费)
-
使用场景
- 保存一个登录的用户信息
- 购物车信息
- 在一个网站经常使用的信息,把它保存在Session中
-
使用Session
-
获取Session并存入数据
public class SessionDemo_01 extends HttpServlet { /** *给session中存入数据 * */ @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"); //获取Session HttpSession session = req.getSession(); //给session中存入数据 session.setAttribute("name",new Person("张某某",16)); //获取session的ID String sessionId = session.getId(); //判断是否为新的session if(session.isNew()){ resp.getWriter().write("session创建成功,ID:"+sessionId); }else{ //session在浏览器打开的瞬间就存在了,关闭浏览器就自动清除 resp.getWriter().write("session已经存在,ID:"+sessionId); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
public class Person { /** * SessionDemo_01中的数据对象 * */ private String name; private int age; //无参构造 public Person() { } //有参构造 public Person(String name, int age) { this.name = name; this.age = age; } //getName public String getName() { return name; } //getAge public int getAge() { return age; } //setName public void setName(String name) { this.name = name; } //setAge public void setAge(int age) { this.age = age; } //重写toString方法,调用该方法打印对象的属性 @Override public String toString() { return "Person{" + "name='" + name + '\'' + ", age=" + age + '}'; } }
-
获取Session并读取控制台输出1中存入的数据
public class SessionDemo_02 extends HttpServlet { /** * 获取session中的数据 * */ @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"); //获取Session HttpSession session = req.getSession(); Person person = (Person) session.getAttribute("name"); System.out.println(person.toString()); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
注销Session
-
手动注销
public class SessionDemo_03 extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //获取session HttpSession session = req.getSession(); //取消掉session中的key(name) session.removeAttribute("name"); //注销session,session中的ID也会被注销,只不过服务端又会立即生成新的ID session.invalidate(); } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { doGet(req, resp); } }
-
自动注销,web.xml中配置
<!--设置session默认的失效时间--> <session-config> <!--session在1分钟后失效,以分钟为单位--> <session-timeout>1</session-timeout> </session-config>
-
-
这篇关于Cookie、Session的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!
- 2024-11-01UniApp 中组件的生命周期是多少-icode9专业技术文章分享
- 2024-11-01如何使用Svg Sprite Icon简化网页图标管理
- 2024-10-31Excel数据导出课程:新手从入门到精通的实用教程
- 2024-10-31Excel数据导入课程:新手入门指南
- 2024-10-31RBAC的权限课程:新手入门教程
- 2024-10-31Svg Sprite Icon课程:新手入门必备指南
- 2024-10-31怎么配置 L2TP 允许多用户连接-icode9专业技术文章分享
- 2024-10-31怎么在FreeBSD上 安装 OpenResty-icode9专业技术文章分享
- 2024-10-31运行 modprobe l2tp_ppp 时收到“module not found”消息提醒是什么-icode9专业技术文章分享
- 2024-10-31FreeBSD的下载命令有哪些-icode9专业技术文章分享