【我的前端初学填坑】2.get和post请求的区别

本文详细对比了HTTP协议中GET与POST两种请求方式的区别,包括它们的使用场景、安全性、效率及浏览器缓存等方面的不同。

前言:本博文主要是在通过搜索引擎搜索后得到一些结果,刚开始接触HTTP协议对这个有点懵逼想记下来,而且在面试中总是遇到这个问题所以想要加深点印象,就当记个笔记。(这篇博文主要引用了该博主(http://blog.youkuaiyun.com/qq_26360877)的博文,如果有不当的请联系我进行删改,谢谢)

1.HTTP与服务器交互的方式总共有四种:put,delete,post,get,其实就是对服务器资源的的增删改查操作,而在日常我们主要就是使用get和post这两种方式访问服务器资源。

2.区别:

    2.0:get效率高,post请求数据放在请求体中,因此安全性高。

    2.1:get把请求的数据放在url上,即HTTP协议头上,并且因为浏览器对URL上有长度限制,所以get方式传递的参数一般都不会超过2kb;而post则是把请求数据放在request body上,理论上对他的大小是没做规定的。

    2.2:get只产生一个TCP数据包,浏览器会把http header和data一并发送出去,服务器响应200(返回数据);

           post产生两个TCP数据包,浏览器先发送header,服务器响应100 continue,浏览器再发送data,服务器响应200 ok(返回数据)。

    2.3:get在浏览器回退时不会再次重复请求数据,而post则会再次提交请求。

    2.4:get请求会被浏览器主动cache,post则不会。

    2.5:get只能进行URL编码,而post则可以用多种方式编码。

    2.6:get的请求参数会被完整保留在浏览器历史中,post的参数则不会。

    2.7:get只接受ASCII字符的参数的数据类型,post则没有限制。

3.应用上:get一般URL参数是固定的,因而适合用在商品之类的展示上,post因为数据不是明文的,安全性较好,因而一般用在登录注册验证上。

### Java处理前端HTTPS GETPOST请求的方法 在Java中,无论是使用传统的Servlet API还是现代的Spring框架,都可以高效地处理来自前端的HTTPS GETPOST请求。以下分别介绍了两种常见的方式来实现这一功能。 #### 方法一:基于Servlet的传统方式 对于初学者来说,最基础也是最容易理解的方式之一就是直接依赖于标准的Servlet接口来构建服务端逻辑。这里给出一个简单的例子展示如何同时支持GETPOST类型的HTTPS请求。 1. **创建一个新的HttpServlet子类** 下面这个类展示了基本的功能结构——它重写了doGet()doPost()两个核心方法以区分不同种类的操作需求[^1]。 ```java import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @WebServlet(name = "SecureHandler", urlPatterns = {"/secure"}) public class SecureHandler extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { processRequest(request, response); } private void processRequest(HttpServletRequest request, HttpServletResponse response)throws ServletException, IOException{ response.setContentType("text/html;charset=UTF-8"); try (PrintWriter out = response.getWriter()) { String paramValue = request.getParameter("paramName"); // 获取参数值 if ("GET".equalsIgnoreCase(request.getMethod())) { out.println("<h1>This is an HTTPS GET Request</h1>"); out.printf("<p>Parameter Value: %s</p>", paramValue != null ? paramValue : "Not Provided"); } else if ("POST".equalsIgnoreCase(request.getMethod())){ out.println("<h1>This is an HTTPS POST Request</h1>"); out.printf("<p>Posted Data: %s</p>", paramValue != null ? paramValue : "No data posted."); } } } } ``` 2. **部署到支持SSL/TLS协议的应用服务器上** 将编译好的WAR包部署至已经正确配置好SSL证书的支持环境之中即可完成全部准备工作[^2]。 --- #### 方法二:利用Spring Framework简化开发流程 随着微服务架构日益流行,越来越多开发者倾向于选用轻量级但功能强大的Spring Boot快速搭建项目原型。下面即为一段典型的RESTful风格API设计片段: ```java import org.springframework.web.bind.annotation.*; @RestController @RequestMapping("/api/v1") public class ExampleController { /** * Handles HTTP GET requests. */ @GetMapping("/example-get") public ResponseEntity<String> handleHttpGet(@RequestParam(required=false) String queryParam){ StringBuilder sb=new StringBuilder(); sb.append("This is a secure GET call.\nQuery Parameter:"); sb.append(queryParam==null?" Not provided":queryParam); return new ResponseEntity<>(sb.toString(), HttpStatus.OK); } /** * Handles HTTP POST requests with JSON body content-type. */ @PostMapping(path="/example-post", consumes=MediaType.APPLICATION_JSON_VALUE, produces=MediaType.TEXT_PLAIN_VALUE) public ResponseEntity<?> handleHttpPost(@RequestBody MyCustomDto dtoObject){ log.info("Received DTO Object={}",dtoObject); return new ResponseEntity<>("Successfully processed your POST request.",HttpStatus.CREATED); } } // Sample Dto Class Definition class MyCustomDto{ private Long id; private String name; // Getters & Setters omitted for brevity... } ``` 上述代码片段清晰表明了通过注解驱动机制极大降低了手动编码的工作负担,同时也增强了可读性维护便利度[^3]。 --- ### 注意事项 无论采取哪种方案都需注意保障网络安全方面的要求,例如但不限于: - 对敏感信息实施额外加密措施; - 定期更新所使用的TLS版本及其对应的密码套件列表; - 合理设置Session超时时限防止恶意攻击者滥用资源等。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值