中级JAVA:Cookie和Session区别

JAVA中的Cookie与Session详解
本文介绍了Cookie和Session在Web开发中的作用,它们用于解决HTTP协议无状态的问题。详细阐述了Cookie和Session的执行流程,以及两者的区别与联系。Cookie存储在客户端,存在大小限制,适合存储非敏感信息;而Session存储在服务器端,安全但会增加服务器负担。建议登录信息使用Session,购物车等可选Cookie或结合数据库存储。

1、为什么要有cookie/session?

在客户端浏览器向服务器发送请求,服务器做出响应之后,二者便会断开连接(一次会话结束)。那么下次用户再来请求服务器,服务器没有任何办法去识别此用户是谁。

有了cookie可以向服务器证明用户身份了,我们的web系统中是不是需要将用户的详细信息储存在某个位置供页面调用呢?用户的详细信息就包括姓名,年龄,性别等信息。而cookie是存在于客户端的,将用户详细信息通过网络发送到客户端保存是极不安全的。且cookie大小不能超过4k,不能支持中文。这就限制cookie不能满足存储用户信息的需求。这就需要一种机制在服务器端的某个域中存储一些数据,这个域就是session。

总而言之,cookie/session的出现就是为了解决http协议无状态的弊端,为了让客户端和服务端建立长久联系而出现的。

2、什么是会话技术?

帮你存储一些在交互过程临时产生的数据。

当你打开浏览器,访问一个网站,认为会话开始了,当你关闭浏览器的时候,会话结束了。

3、cookie/session执行流程

cookie执行流程

当你去访问应用的时候,来到服务器。服务器设置一个cookie,在做响应的时候会通过set-cookie响应头将cookie带给浏览器。
来到浏览器,浏览器会将此数据保存起来,接下来再次去访问服务器的时候,浏览器会根据cookie的path属性将这些数据带回去(设置了一个叫做cookie的请求头),来到

### Java中级开发工程师常见面试题及答案 以下是针对Java中级开发工程师的一些常见面试题目及其解答: #### 1. **关于`try-catch-finally`的执行顺序** 在给定的例子中,代码展示了即使 `catch` 块中有 `return` 语句,`finally` 中的代码仍然会被执行。这是因为 JVM 在遇到 `return` 之前会先处理 `finally` 块中的逻辑[^1]。 ```java public static int getInt() { int a = 10; try { System.out.println(a / 0); a = 20; } catch (ArithmeticException e) { a = 30; return a; // 这里的返回值实际上是常量30 } finally { a = 40; // 修改a的值不会影响已经形成的返回路径 } } ``` 最终输出的结果为 `30`,因为 `finally` 不会影响已形成的返回路径上的值[^1]。 --- #### 2. **线程启动的区别:`start()` vs `run()`** 调用 `thread.start()` 方法可以启动一个新的线程,并使其进入就绪状态,在分配到 CPU 时间片后自动执行 `run()` 方法。然而,直接调用 `thread.run()` 只是在当前线程上下文中作为一个普通的函数调用运行,无法实现真正的并发[^2]。 --- #### 3. **Session Cookie区别** - **Cookie**: 存储在客户端的小型数据片段,通常用于保存用户的偏好设置或登录信息。它是无状态的,默认情况下会在浏览器关闭时失效。 - **Session**: 是服务器端存储的一种机制,用来跟踪用户的状态。Session 数据存储在服务器内存中,通过 Session ID 来关联特定的用户请求。相比 Cookie 更加安全,但占用更多服务器资源[^2]。 --- #### 4. **线程池的工作原理** 当向线程池提交任务时: 1. 如果存在空闲的核心线程,则立即执行该任务; 2. 若所有核心线程都在忙,则将任务放入阻塞队列等待; 3. 当阻塞队列满且仍有新任务到达时,会尝试创建额外的临时线程来执行这些任务; 4. 如果核心线程临时线程都处于繁忙状态且阻塞队列也满了,则触发拒绝策略。常见的拒绝策略包括抛出异常、由主线程执行任务、替换旧任务或将新任务丢弃等[^3]。 --- #### 5. **String、StringBuilder StringBuffer 的比较** - **String**: 不可变类,任何对它的修改都会生成新的对象实例,因此频繁操作字符串可能导致性能下降。 - **StringBuilder**: 可变字符序列,适用于单线程环境下的高效字符串拼接场景。 - **StringBuffer**: 同样是可变字符序列,但由于其方法同步化设计,适合于多线程环境下使用,不过这也带来了更高的开销[^4]。 从效率角度来看:`StringBuilder > StringBuffer > String`。对于少量数据操作推荐使用 `String`;而在单线程环境中需大量操作字符串缓冲区时应选用 `StringBuilder`;如果是多线程则考虑采用 `StringBuffer`[^4]。 --- ### 总结 以上涵盖了几个典型的 Java 面试题目以及它们的标准解释方式。掌握这些问题不仅有助于理解基础概念还能提升实际编码能力。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

数据大观察

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值