【JavaWeb】GET、POST的区别和Cookie、Session的区别

【区别一】GET和POST的区别

在学JavaWeb-HTTP请求的过程当中,经常会这样遇到一个问题,那就是:你知道get请求和post请求的区别是什么吗?
于是乎,我百思而求解,在我写过无数个GET和POST请求,以及搜索了无数篇CSDN文章之后,这个答案似乎显而易见:

  • 请求形式:
  • GET请求是把请求的数据放在请求行中,访问地址栏中会回显传送的参数信息;
  • POST请求的请求参数一般在请求体中,不会在浏览器地址栏中追加参数,当需要发送一些较为隐私的信息时,最好采用POST请求。
  • 传输数据限制:
  • 实际上,GET请求只能发送普通的字符串,浏览器会限制url的长度,提交的数据一般限制在2K以内;
  • POST请求可以发送任何类型的数据,在理论上没有长度限制,但服务器会对其提交的数据大小做限制。
  • 安全性:
  • GET请求和POST请求的安全性是相对的。
  • 当你发送任何一个GET请求,最终响应的结果都会被浏览器缓存起来,而传输的数据参数会回显在地址栏中,所有人都可以查看,这也就是为什么GET请求安全性低的原因;
  • POST请求虽然不会出现这种情况,但是仔细想想服务器启用拦截功能,一般情况下是拦截POST请求提交的数据,而且POST请求向服务器端提交了数据也可能会更改服务器的数据,那么它的安全性也是相对的。
  • 编码方式:
  • GET请求只能进行url编码;
  • POST支持多种编码方式。

抛开表象看本质,一通追根溯源之下,我以为我悟了,无意中看见一篇文章告诉我,其实GET和POST本质上没有什么区别。
在这里插入图片描述
以下仅个人看完那篇文章之后的理解:
意思是说——
GET/POST是HTTP协议中的两种发送请求的方式,而HTTP是基于TCP/IP的关于数据如何在万维网中通信的协议。那么基于此,GET和POST的底层也是基于TCP/IP实现的,理论上GET和POST能做的事情是一样的。我们通过给GET加上request body,给POST带上url参数,就可以打破二者之间的“区别”。
说实话,在了解完它俩的区别之后,我也想过这个问题。按理来说,这在技术上完全行得通啊。但是如果真是这样那就太天真了!
(由于文字描述太多,复制粘贴也不太好,我直接截图奉上)
在这里插入图片描述
在这里插入图片描述
在我看了好几遍这篇文章之后,与其说是为了让读者知道GET和POST本质上没什么区别,倒不如说是让读者明白为什么GET和POST会出现这么多“区别”。
而后又学到了一点就是——
GET和POST的另一“重大区别”:
GET产生一个TCP数据包;POST产生两个TCP数据包。
即:在发送GET请求的时候,浏览器会把请求头和数据一起发送给服务器,在这个过程中GET请求只产生一个TCP数据包;而发送POST请求时,浏览器先发送请求头,服务器响应100之后,浏览器再发送数据,POST请求一共产生两个TCP数据包。

GET和POST两种基本请求方法的区别

【区别二】Cookie和Session的区别

这二者之间的区别,应该是各位在敲小案例或者看文档视频中都感受过的吧。
废话不多说,我们直接整活吧!
在这里插入图片描述

我们首先来说一说它俩是来干啥的,用官方一点的话来讲,cookie和session都是用来跟踪浏览器用户身份的会话方式。
那么具体来怎么理解呢?举个只要一搜Cookie和Session就能看见的例子来说——常见的就是网站登录,一般只需要登录一次,在一定的时期内,我们再次进入这个网站就不需要登录了,这个功能的实现就是通过会话技术将你的信息存储起来,在所设置的存活期内每次进入网站,都会获取被存储的用户信息。

作用讲完了,我们来说区别——

  • 创建方式:
  • Cookie是客户端会话技术,其数据保存在客户端;
  • Session是服务器端会话技术,其数据保存在服务器端。
  • 存储类型:
  • Cookie只能存储String类型的对象;
  • Session能够存储任意的java对象。
  • 生命周期:
  • Cookie和Session都存在有效期,即存活时间限制;
  • 默认情况下,Cookie存储在浏览器内存中,当浏览器关闭,内存释放,则Cookie被销毁;Cookie可以通过setMaxAge设置有效时间(在此有效时间范围内,即使浏览器关闭了,仍然存在);
  • Session则是取决于服务器的设定,如果客户端长时间不向服务端发出请求,Session对象就会自动消失,这个时间取决于服务器(Tomcat服务器默认为30分钟),可以通过Session对象提供的方法或在web.xml文件中手工配置session的失效时间。
  • 存储数据限制:
  • Cookie存储的数据量很受限制,大多数浏览器支持最大容量为4K,无法存储复杂需求;
    Session没有数据大小限制。
  • 优缺点:
  • Cookie:并非所有的浏览器都支持Cookie,并且数据信息是以明文文本的形式保存在客户端的计算机中,别人可以分析存放在本地的Cookie并进行Cookie欺骗,因此最好不要保存敏感的、未加密的数据,否则会影响网站的安全性,所以出于安全性的考虑应当使用Session;
  • Session:Session会在一定时间内保存在服务器上,当Session超时或被关闭时将自动释放保存的数据信息,由于用户停止使用应用程序后它仍然在内存中保持一段时间,因此使用Session对象使保存用户数据的方法效率很低。当访问增多,会占用较多的服务器资源,所以出于性能考虑则应当使用Cookie。
  • 适用场景:
  • Cookie:购物车、登录记住我功能等;
  • Session:登录验证信息、客户的私人信息等。

java session使用场景_cookie和session的的区别以及应用场景有哪些?

如有错误,请指正。
在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java 中进行 GET 请求的加解密,可以使用以下步骤: 1. 构建请求参数:将需要发送的参数按照要求进行组装。可以是将参数拼接在 URL 后面,或者使用 `NameValuePair` 或 `Map` 来存储参数。 2. 对请求参数进行加密:根据需求选择合适的加密算法,如 AES、DES、RSA 等。可以使用 Java 提供的加密库,如 `javax.crypto` 包下的类来实现。 3. 发送加密后的请求:将加密后的参数附加到 GET 请求的 URL 中或者作为请求头的一部分发送给服务器。 4. 服务器解密请求参数:服务器端接收到请求后,根据相应的加密算法和密钥,对请求参数进行解密。 下面是一个简单示例,使用 AES 加密对 GET 请求进行加解密: ```java import javax.crypto.Cipher; import javax.crypto.spec.SecretKeySpec; import java.net.URLEncoder; import java.nio.charset.StandardCharsets; import java.util.Base64; public class GetRequestEncryptionExample { private static final String SECRET_KEY = "0123456789abcdef"; // 密钥,必须是 16 位 public static String encrypt(String plainText) throws Exception { SecretKeySpec secretKey = new SecretKeySpec(SECRET_KEY.getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.ENCRYPT_MODE, secretKey); byte[] encryptedBytes = cipher.doFinal(plainText.getBytes(StandardCharsets.UTF_8)); return Base64.getEncoder().encodeToString(encryptedBytes); } public static String decrypt(String encryptedText) throws Exception { SecretKeySpec secretKey = new SecretKeySpec(SECRET_KEY.getBytes(), "AES"); Cipher cipher = Cipher.getInstance("AES"); cipher.init(Cipher.DECRYPT_MODE, secretKey); byte[] decryptedBytes = cipher.doFinal(Base64.getDecoder().decode(encryptedText)); return new String(decryptedBytes, StandardCharsets.UTF_8); } public static void main(String[] args) { try { // 加密请求参数 String plainText = "param1=value1&param2=value2"; String encryptedText = encrypt(plainText); String encodedEncryptedText = URLEncoder.encode(encryptedText, StandardCharsets.UTF_8); // 构建 GET 请求 URL String url = "https://example.com/api?data=" + encodedEncryptedText; // 发送 GET 请求 // 服务器端接收到请求后,解密请求参数 String decodedEncryptedText = URLDecoder.decode(encodedEncryptedText, StandardCharsets.UTF_8); String decryptedText = decrypt(decodedEncryptedText); System.out.println("Decrypted Text: " + decryptedText); } catch (Exception e) { e.printStackTrace(); } } } ``` 注意:以上示例仅为演示加解密的基本流程,并不考虑完整的安全性和异常处理。实际使用中,需要根据具体的需求和安全要求进行适当的调整和完善。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值