Cookie的使用,及与Session对比
程序员文章站
2023-01-19 15:13:40
Http协议的无状态性 无状态是指,当浏览器发送请求给服务器的时候,服务器响应客户端请求。但是当同一个浏览器再次发送请求给服务器的时候,服务器并不知道他就是刚才那个浏览器,简单的说就是服务器不会去记得你,所以就是无状态协议。(超文本传输协议是无状态的) 就像一个没有记忆功能的老板,你每次去他的店里买 ......
Http协议的无状态性
无状态是指,当浏览器发送请求给服务器的时候,服务器响应客户端请求。但是当同一个浏览器再次发送请求给服务器的时候,服务器并不知道他就是刚才那个浏览器,简单的说就是服务器不会去记得你,所以就是无状态协议。(超文本传输协议是无状态的)
就像一个没有记忆功能的老板,你每次去他的店里买个东西,他都觉得你是第一次来这里购买。
保存用户状态的两大机制
- session(针对服务端的技术)
- cookie(针对客户端的技术)
什么是Cookie
Cookie:是Web服务器保存在客户端的一系列文本信息。
注意是保存在客户端的。
比如说登录邮箱的时候提示:十天内免登陆;购物时候的“购物车”都是用Cookie来保存信息的,保存在客户端中。
但是也有缺点:容易泄露用户信息。
使用Cookie
创建Cookie对象
- Cookie newCookie=new Cookie(String key,Object value);
写入Cookie对象
- response.addCookie(newCookie);
读取Cookie对象
- Cookie[] cookies=request.getCookies();
Cookie是以文本文件保存在客户端的信息,所以他的value值本质上是一个字符串类型的
小例子
代码只贴出了body标签下的代码
login.jsp
<body> <h1>用户登录</h1> <hr> <% request.setCharacterEncoding("utf-8"); String username=""; String password = ""; Cookie[] cookies = request.getCookies(); if(cookies!=null&&cookies.length>0) { for(Cookie c:cookies) { if(c.getName().equals("username")) { username = URLDecoder.decode(c.getValue(),"utf-8"); } if(c.getName().equals("password")) { password = URLDecoder.decode(c.getValue(),"utf-8"); } } } %> <form name="loginForm" action="dologin.jsp" method="post"> <table> <tr> <td>用户名:</td> <td><input type="text" name="username" value="<%=username %>"/></td> </tr> <tr> <td>密码:</td> <td><input type="password" name="password" value="<%=password %>" /></td> </tr> <tr> <td colspan="2"><input type="checkbox" name="isUseCookie" checked="checked"/>十天内记住我的登录状态</td> </tr> <tr> <td colspan="2" align="center"><input type="submit" value="登录"/><input type="reset" value="取消"/></td> </tr> </table> </form> </body>
doLogin.jsp
<body> <h1>登录成功</h1> <hr> <br> <br> <br> <% request.setCharacterEncoding("utf-8"); //首先判断用户是否选择了记住登录状态 String[] isUseCookies = request.getParameterValues("isUseCookie"); if(isUseCookies!=null&&isUseCookies.length>0) { //把用户名和密码保存在Cookie对象里面 String username = URLEncoder.encode(request.getParameter("username"),"utf-8"); //使用URLEncoder解决无法在Cookie当中保存中文字符串问题 String password = URLEncoder.encode(request.getParameter("password"),"utf-8"); Cookie usernameCookie = new Cookie("username",username); Cookie passwordCookie = new Cookie("password",password); usernameCookie.setMaxAge(864000); passwordCookie.setMaxAge(864000);//设置最大生存期限为10天 response.addCookie(usernameCookie); response.addCookie(passwordCookie); } else { Cookie[] cookies = request.getCookies(); if(cookies!=null&&cookies.length>0) { for(Cookie c:cookies) { if(c.getName().equals("username")||c.getName().equals("password")) { c.setMaxAge(0); //设置Cookie失效 response.addCookie(c); //重新保存。 } } } } %> <a href="users.jsp" target="_blank">查看用户信息</a> </body>
user.jsp
<body> <h1>用户信息</h1> <hr> <% request.setCharacterEncoding("utf-8"); String username=""; String password = ""; Cookie[] cookies = request.getCookies(); if(cookies!=null&&cookies.length>0) { for(Cookie c:cookies) { if(c.getName().equals("username")) { username = URLDecoder.decode(c.getValue(),"utf-8"); } if(c.getName().equals("password")) { password = URLDecoder.decode(c.getValue(),"utf-8"); } } } %> <BR> <BR> <BR> 用户名:<%=username %><br> 密码:<%=password %><br> </body>
几个注意的点:
- response.addCookie(key,value);//将Cookie添加到客户端中
- request.setCharacterEncoding("utf-8");//设置编码格式为utf-8
- URLEncoder.encode(request.getParameter("username"),"utf-8");//可以防止中文乱码
这时候可以测试,把所有浏览器关掉再去打开doLogin页面发现username还是可以获取到,这样就可以说名是Cookie保存了用户名信息,而不是session(在session中,关闭浏览器,则会话结束,所有信息就丢失了。)
Session和Cookie的区别
浏览记录,访问习惯,兴趣等适合保存在cookie中,也就是客户端中,而session中保存的是一些重要信息。session的安全性比cookie要高。
上一篇: 搞笑损货,被损的相当狗血
下一篇: 我得称一下