cookie和session的的区别以及使用示例? 编辑
这俩货平时非常低调,不是很出挑。Session相对来说稍微会好一些,Java程序猿们日常多少会接触点,用Session域存取对象啥的。但这个Cookie,估计大部分Java程序猿,平时不要说用到,连这个单词都很少敲。而且Cookie说起来吧,位置有点特殊。前端的人觉得它和后端沾亲带故,后端的人觉得这玩意就是前端搞的,关我屁事。如此一来,谁都没把它当回事儿。
1.cookie和session的的区别?
- 简而言之上的区别:
性质 | cookie | session |
---|---|---|
不同点 | 默认存储在客户端浏览器内存,浏览器关闭,会话结束 | 默认存在服务端,session失效,会话结束 |
安全性 | 不安全,别人可以查看你的电脑窃取你浏览器中的用户名和密码明文,所以现在登录也有使用手机短信验证码登录的 | 相对来说比较安全 |
相同点 | 用来跟踪浏览器用户身份的会话方式 | 用来跟踪浏览器用户身份的会话方式 |
2. Cookie的代码示例
服务器端如何将Cookie发给浏览器呢?
点击查看代码
import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * @author ying * @version 1.1 * @className SendCookieServlet * @description TODO * @date 2021/11/20 11:13 **/ public class SendCookieServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1、创建cookie对象 Cookie cookie1 = new Cookie("name", "bravol988"); Cookie cookie2 = new Cookie("time", "6pm"); Cookie cookie3 = new Cookie("table", "69"); //2、把cookie发送给客户端 response.addCookie(cookie1); response.addCookie(cookie2); response.addCookie(cookie3); } @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
因为现在客户端已经有Cookie了,所以往后每次访问该服务器,都会带上这个Cookie。那么,如何在服务器端得到客户端带来的Cookie呢?
点击查看代码
import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * @author ying * @version 1.1 * @className GetCookieServlet * @description TODO * @date 2021/11/20 11:25 **/ public class GetCookieServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1.从浏览器HTTP请求中获取Cookie //获得客户端携带的cookie的数据 Cookie[] cookies = request.getCookies(); //通过cookie名称获得想要的cookie if (cookies != null) { for (Cookie cookie : cookies) { //获得cookie的名称 String cookieName = cookie.getName(); // 打印名为name、time、table的cookie值 if (cookieName.equals("name") || cookieName.equals("time") || cookieName.equals("table")) { String cookieValue = cookie.getValue(); // 2.打印Cookie值 System.out.println(cookieValue); } } } } }
上面代码中,服务器向浏览器响应的Cookie就是会话Cookie。会话Cookie被保存在浏览器的内存中,当浏览器关闭时,内存被释放,内存中的Cookie自然也就烟消云散。
这样太麻烦了,关闭浏览器引发Cookie消失,下次还要重新登录。能不能向客户端响应持久性Cookie呢?答案是可以的,只要设置Cookie的持久化时间即可!
点击查看代码
import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * @author ying * @version 1.1 * @className SendCookieServlet * @description TODO * @date 2021/11/20 11:13 **/ public class SendCookieServlet extends HttpServlet { private static final long serialVersionUID = 1L; @Override public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //1、创建cookie对象 Cookie cookie = new Cookie("name", "bravol988"); //2、为cookie设置持久化时间,10分钟(cookie信息在硬盘上保存的时间) cookie.setMaxAge(10 * 60); //3、把cookie发送给客户端 response.addCookie(cookie); } @Override public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
小结:
- 不设置MaxAge,默认响应会话Cookie(MaxAge<0),存在浏览器内存。Cookie随浏览器关闭而消失
- 设置MaxAge>0,响应持久性Cookie,会存在电脑硬盘的特定文件夹下(浏览器自定义的)
- 设置特定Cookie的MaxAge=0,则会删除已经存在客户端的此Cookie
3. Session的代码示例
相比较Cookie存在客户端,Session则是服务端的东西。其本质上类似于一个大Map,里面的内容,以键值对的形式存储。
这回,我们不再把"name=brava1988;time=6pm;table=69"这样的数据作为Cookie放在请求头/响应头里传来传去了,而是只给客户端传一个JSESSIONID(其实也是一个Cookie)!此时,真正的数据存在服务器端的Session中,Cookie中只是存了Session的id,即JSESSIONID。下次访问该网站时,把JSESSIONID带上,即可在服务器端找到对应的Session,也相当于“带去”了用户信息。
点击查看代码
import javax.servlet.http.*; import java.io.IOException; /** * @author ying * @version 1.1 * @className SessionServlet1 * @description TODO * @date 2021/11/20 11:48 **/ public class SessionServlet1 extends HttpServlet { private static final long serialVersionUID =1L; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //创建属于该客户端(会话)的私有的session区域 /* request. getsession ()方法内部会判断该客户端是否在服务器端已经存在session * 如果该客户端在此服务器不存在session * 那么就会创建一个新的session对象如果该客户端在此服务器已经存在session获得已经存在的该session返回 */ HttpSession session = request.getSession(); session.setAttribute("name", "bravol988"); session.setAttribute("time", "6pm"); session.setAttribute("table", "69"); String id = session.getId();//该session对象的编号id //手动创建一个存储 JsEssIoNID 的cookie为该cookie设置持久化时间 Cookie cookie = new Cookie(" JSESSIONID ", id); cookie.setMaxAge(60 * 10); //Cookie只保存 JSESSIONID ,不保存敏感信息 response.addCookie(cookie); response.getWriter().write(" JSESSIONID :" + id); } }
点击查看代码
import javax.servlet.http.*; import java.io.IOException; /** * @author ying * @version 1.1 * @className SessionServlet1 * @description TODO * @date 2021/11/20 11:48 **/ public class SessionServlet1 extends HttpServlet { private static final long serialVersionUID = 1L; @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //创建属于该客户端(会话)的私有的session区域 /*request. get8ession ()方法内部会判断该客户端是否在服务器端已经存在session * 如果该客户端在此服务器不存在session那么就会创建一个新的session对象 * 如果该客户端在此服务器已经存在session获得已经存在的该session返回 */ HttpSession session1 = request.getSession(); HttpSession session2 = request.getSession(); String id1 = session1.getId();//该session对象的编号id String id2 = session2.getId();//该session对象的编号id System.out.println(" JSESSIONID :" + id1); System.out.println(" JSESSIONID :" + id2); } }
如果,您希望更容易地发现我的新文章,不妨点击一下绿色通道的【关注我】。
如果您觉得阅读本文对您有帮助,请点击一下右下方的推荐按钮,您的推荐将是我写作的最大动力!版权声明:本文为博主原创或转载文章,欢迎转载,但转载文章之后必须在文章页面明显位置注明出处,否则保留追究法律责任的权利。如您有任何疑问或者授权方面的协商,请 .
【推荐】还在用 ECharts 开发大屏?试试这款永久免费的开源 BI 工具!
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 软件产品开发中常见的10个问题及处理方法
· .NET 原生驾驭 AI 新基建实战系列:向量数据库的应用与畅想
· 从问题排查到源码分析:ActiveMQ消费端频繁日志刷屏的秘密
· 一次Java后端服务间歇性响应慢的问题排查记录
· dotnet 源代码生成器分析器入门
· ThreeJs-16智慧城市项目(重磅以及未来发展ai)
· .NET 原生驾驭 AI 新基建实战系列(一):向量数据库的应用与畅想
· Browser-use 详细介绍&使用文档
· 软件产品开发中常见的10个问题及处理方法
· Vite CVE-2025-30208 安全漏洞