帮助中心 >  行业资讯 >  云计算 >  简单介绍一下HTTP请求头与请求体

简单介绍一下HTTP请求头与请求体

2025-02-18 14:12:44 102

在现代网络通信中,HTTP(超文本传输协议)是一个至关重要的协议。理解HTTP请求头和请求体的相关要点对于开发和维护网络应用程序至关重要。本文将详细介绍HTTP请求头和请求体的基本概念以及它们在认证信息和会话持久化中的应用。

一、HTTP请求头(HTTP Request Headers)


HTTP请求头是HTTP请求的一个重要组成部分,它携带了客户端向服务器传递的元数据。这些元数据包括了很多关键信息,比如请求的类型、客户端信息、缓存控制等。常见的HTTP请求头包括:

  1. Host:指定请求的目标服务器。

  2. User-Agent:标识发起请求的客户端软件信息(浏览器、操作系统等)。

  3. Accept:声明客户端能够处理的内容类型。

  4. Content-Type:指定请求体的媒体类型,常见类型有application/json、application/x-www-form-urlencoded等。

  5. Authorization:携带身份验证凭据,常用于API调用。

二、HTTP请求体(HTTP Request Body)


HTTP请求体包含了客户端发送给服务器的数据。请求体在POST、PUT等请求方法中尤为重要,因为它们通常需要传输数据给服务器。常见的请求体格式有:

  1. JSON:轻量级数据交换格式,易于阅读和编写。

  2. XML:可扩展标记语言,结构化且可自定义。

  3. Form Data:表单数据编码格式,通常用于提交表单。

三、HTTP中的认证信息


在实际应用中,HTTP请求头和请求体中经常需要携带认证信息,以确保请求的合法性和安全性。常见的认证信息有:

  1. Cookie

    • 用途:在客户端存储用户会话数据,维持用户登录状态。

    • 特点:小型数据片段,由服务器发送并存储在客户端,每次请求都会自动附带相应的Cookie。

  2. Session

    • 用途:在服务器端保存用户会话数据,使用Session ID来标识不同用户。

    • 特点:Session ID通常通过Cookie传递,安全性较高,因为数据存储在服务器端。

  3. Token

    • 用途:常用于API认证(例如JWT - JSON Web Token)。

    • 特点:自包含的加密字符串,携带用户身份和权限信息。通常放在Authorization头部,格式如Bearer <token>。

四、HTTP与用户端的持久化


为了确保用户的连续性和良好的用户体验,HTTP协议和各种持久化技术结合使用。常见的持久化技术包括:

1. Cookie持久化:
优点:简单易用,广泛支持。
缺点:数据存储在客户端,安全性较低。
使用JavaScript设置和获取Cookie



// 设置Cookie

function setCookie(name, value, days) {

   const d = new Date();
   d.setTime(d.getTime() + (days * 24 * 60 * 60 * 1000));

   const expires = "expires=" + d.toUTCString();

   document.cookie = name + "=" + value + ";" + expires + ";path=/";
   
}
// 获取Cookie
function getCookie(name) {
   const nameEQ = name + "=";
 
   const ca = document.cookie.split(';');

   for(let i = 0; i < ca.length; i++) {
 
       let c = ca[i];
 
       while (c.charAt(0) == ' ') c = c.substring(1, c.length);
 
       if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);

   }
 
   return null;
   
}


// 使用示例

setCookie('username', 'john_doe', 7); // 设置名为'username'的Cookie,有效期7天

console.log(getCookie('username')); // 获取名为'username'的Cookie


2. Session持久化:
优点:数据存储在服务器端,安全性高。
缺点:需要服务器资源,随着用户量增加可能带来性能问题。
使用Java Servlets管理Session


// 登录Servlet示例
import java.io.IOException;
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 javax.servlet.http.HttpSession;

@WebServlet("/login")
public class LoginServlet extends HttpServlet {
   protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

       String username = request.getParameter("username");
       
       String password = request.getParameter("password");

       
       if (authenticate(username, password)) {
   
           HttpSession session = request.getSession();
           session.setAttribute("user", username);            
           response.sendRedirect("welcome.jsp");
       
       } else {
           
           response.sendRedirect("login.jsp");
       
       }
   
   }

   private boolean authenticate(String username, String password) {
       // 简单验证示例,实际应用中应使用数据库或其他安全方式验证

       return "john".equals(username) && "password123".equals(password);

   }
   
}

使用JavaScript和Fetch API发送带有Session的请求

// 假设服务器已经设置了Session并通过Cookie传递Session ID
fetch('https://www.landui.com/profile', {
    method: 'GET', 
       credentials: 'include' // 确保Cookie会被发送
})
.then(response => response.json())
.then(data => console.log(data))
.catch(error => console.error('Error:', error));


3.Token持久化:
优点:无需服务器端存储,适合分布式系统。


缺点:Token一旦泄露,可能被伪造。


生成JWT

import io.jsonwebtoken.Jwts;
import io.jsonwebtoken.SignatureAlgorithm;
import java.util.Date;
public class JwtUtil {
    private static final String SECRET_KEY = "secret";
    public static String generateToken(String username) {
     return Jwts.builder() 
         .setSubject(username)               
               .setIssuedAt(new Date())                
               .setExpiration(new Date(System.currentTimeMillis() + 86400000)) // 有效期1天 
               .signWith(SignatureAlgorithm.HS256, SECRET_KEY)                
               .compact();   
      }
    }


验证JWT

import io.jsonwebtoken.Claims;
import io.jsonwebtoken.Jwts;
import javax.servlet.FilterChain;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.filter.OncePerRequestFilter;
import java.io.IOException;
public class JwtFilter extends OncePerRequestFilter { 
   private static final String SECRET_KEY = "secret"; 
   @Override    
   protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {
    String authorizationHeader = request.getHeader("Authorization");
    if (authorizationHeader != null && authorizationHeader.startsWith("Bearer ")) { 
     String token = authorizationHeader.substring(7);
     try {                
       Claims claims = Jwts.parser()
                .setSigningKey(SECRET_KEY)
                .parseClaimsJws(token)                        
                .getBody();               
                request.setAttribute("claims", claims); 
               } catch (Exception e) { 
                 response.sendError(HttpServletResponse.SC_UNAUTHORIZED, "Invalid Token"); 
                 return;
                }       
              }        
              filterChain.doFilter(request, response);    
            }
          }


使用JavaScript的Fetch API发送带有JWT的请求

image.png

代码示例

使用jQuery发送POST请求

image.png

使用jQuery发送带有Cookie的GET请求

image.png

使用JavaScript的Fetch API发送带有JWT的请求

image.png

结论

理解和有效利用HTTP请求头和请求体对于现代Web开发至关重要。Cookie、Session、Token等认证方式各有优缺点,需要根据具体场景选择合适的方案。通过合理的持久化策略,能够提升用户体验并保障系统安全性。


蓝队云官网上拥有完善的技术支持库可供参考,大家可自行查阅,更多技术问题,可以直接咨询。同时,蓝队云整理了运维必备的工具包免费分享给大家使用,需要的朋友可以直接咨询。更多技术知识,蓝队云期待与你一起探索。


提交成功!非常感谢您的反馈,我们会继续努力做到更好!

这条文档是否有帮助解决问题?

非常抱歉未能帮助到您。为了给您提供更好的服务,我们很需要您进一步的反馈信息:

在文档使用中是否遇到以下问题: