java cookie 客户端 生成唯一_为什么设置cookie后不能马上读取到值

setcookie('a','value');

print $_COOKIE['a'];

第一次访问时,报错:

a19ad93ed64ad638db443b249ce16a8d.png

报错的原因是$_COOKIE['a']的值不存在。第二次访问:

2688eb9f1002a456addaca830cff893f.png

问:为什么第一次访问的时候,会没有cookie呢??我不是先设置,再获取吗??

答:使用firefox的firebug查看”网络“:

da3a9159787b173607a8a67a55374d3d.png

客户端:

可以看到,浏览器(客户端)向服务器发出一次请求,发出请求的时候,在请求头信息中带上了各种参数,告诉服务器,我要接收什么样的文本(Accept)、什么编码格式(Accept-Encoding)、什么语言(Accept-Language)等等,当然,还把Cookie也传到了服务器(Cookie)。

服务器端:

第一步:setcookie('a','value')

因为cookie是设置在客户端的,setcookie函数自己并不能设置cookie,它只能通过头信息的方式告诉浏览器说:兄弟,我要设置一个cookie,键为a,值为value,你在你那里帮我设置一下。你也可以理解为:”来,朕今天高兴,赏你一个小甜饼“。

第二步:$_COOKIE['a']$_COOKIE['a']

很简单,执行的操作就是在浏览器带过来的cookie字符串中搜索键为a的cookie,并返回它的值。

9aa8082a4d1a1f86933bb25e1c0445b8.png

很明显,这个”键为a“的cookie不可能找到,因为客户端访问服务器的时候,这个cookie压根就不存在,而前面第一步设置cookie的头信息,也还没有返回给客户端(php要从上到下把语句执行完才会返回给客户端)

第三步:服务器返回信息

其中,返回的头信息中带有”Set-Cookie a=value“,浏览器收到这个头信息,把cookie存放到电脑的某个文件中,对于不同浏览器cookie的存放位置貌似不同,这个不在本文的范围。

115213a15e4021e2c9c7c2088057ebbb.png

刷新浏览器,再次访问服务器的时候,同样,也会把很多头信息带给服务器,只不过这次带过去的cookie中,就多了一个a=value了。所心$_COOKIE['a']自然就能从cookie字符串中找到这个键为a的cookie的值。

e7d621cef33fa68184d6bc0ac2e30ea0.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是一段完整的JSP代码,实现了用户登录身份验证和登录、登出等操作,并增加了两个登录选项:记住密码和自动登录。注意,这里只是演示代码,实际项目中还需要进行安全性和可靠性方面的优化。 ``` <%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>用户登录</title> </head> <body> <% String username = ""; String password = ""; boolean rememberMe = false; boolean autoLogin = false; String action = request.getParameter("action"); if (action != null && action.equals("logout")) { // 用户注销,删除保存在客户端cookie和session Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if (cookie.getName().equals("username")) { cookie.setMaxAge(0); response.addCookie(cookie); } if (cookie.getName().equals("password")) { cookie.setMaxAge(0); response.addCookie(cookie); } } } session.invalidate(); response.sendRedirect("login.jsp"); } else if (action != null && action.equals("login")) { // 用户登录,验证用户名和密码 username = request.getParameter("username"); password = request.getParameter("password"); rememberMe = "on".equals(request.getParameter("rememberMe")); autoLogin = "on".equals(request.getParameter("autoLogin")); if (username != null && username.equals("admin") && password != null && password.equals("admin")) { session.setAttribute("username", username); if (rememberMe) { // 保存用户名和密码到cookie中,有效期为7天 Cookie cookie1 = new Cookie("username", username); cookie1.setMaxAge(7 * 24 * 60 * 60); response.addCookie(cookie1); Cookie cookie2 = new Cookie("password", password); cookie2.setMaxAge(7 * 24 * 60 * 60); response.addCookie(cookie2); } if (autoLogin) { // 生成自动登录的cookie,有效期为30天 String token = java.util.UUID.randomUUID().toString(); Cookie cookie = new Cookie("token", token); cookie.setMaxAge(30 * 24 * 60 * 60); response.addCookie(cookie); } response.sendRedirect("welcome.jsp"); } else { out.println("<script>alert('用户名或密码错误,请重新输入!');</script>"); out.println("<meta http-equiv='refresh' content='0;url=login.jsp'>"); } } else { // 用户首次访问,尝试从cookie读取用户名和密码 Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if (cookie.getName().equals("username")) { username = cookie.getValue(); } if (cookie.getName().equals("password")) { password = cookie.getValue(); } } } } %> <h1>用户登录</h1> <form method="post" action="login.jsp?action=login"> 用户名:<input type="text" name="username" value="<%=username%>"><br> 密码:<input type="password" name="password" value="<%=password%>"><br> 记住密码:<input type="checkbox" name="rememberMe" <%=rememberMe?"checked":""%>><br> 自动登录:<input type="checkbox" name="autoLogin" <%=autoLogin?"checked":""%>><br> <input type="submit" value="登录"> </form> </body> </html> ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值