05-HTTP-Request获取请求行数据方法

1、获取请求方式:getMethod()方法,该方法用于获取HTTP请求的方法类型,返回值为一个字符串。常见的HTTP请求方法包括GET、POST、PUT、DELETE等。

import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MyController {
    
    @RequestMapping("/myurl")
    public void myMethod(HttpServletRequest request) {
        String method = request.getMethod();  // 获取HTTP请求的方法类型
        System.out.println("Request Method: " + method);
        
        // TODO: 处理HTTP请求的业务逻辑
    }
}

2、获取虚拟目录:getContextPath()方法,该方法返回一个字符串,表示当前Web应用程序的虚拟目录路径。虚拟目录是指Web服务器将Web应用程序部署到其文件系统中的路径,它是URL中除去主机名和端口号之外的第一个目录。 

以下是一个示例代码,用于获取当前Web应用程序的虚拟目录路径:

import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MyController {
    
    @RequestMapping("/myurl")
    public void myMethod(HttpServletRequest request) {
        String contextPath = request.getContextPath();  // 获取当前Web应用程序的虚拟目录路径
        System.out.println("Context Path: " + contextPath);
        
        // TODO: 处理HTTP请求的业务逻辑
    }
}

需要注意的是,虚拟目录路径是相对于Web应用程序的根目录而言的,因此在处理请求时需要将其与实际路径进行拼接。例如,如果想要读取位于Web应用程序根目录下的一个名为"myfile.txt"的文件,可以使用以下代码:

String realPath = request.getSession().getServletContext().getRealPath("/");  // 获取Web应用程序的物理路径
File file = new File(realPath, "/myfile.txt");  // 创建文件对象

在这个示例中,我们首先通过getSession().getServletContext().getRealPath("/")方法获取Web应用程序的物理路径,也就是当前Web应用程序在服务器文件系统中的真实路径。然后,我们通过该路径和文件名创建一个File对象,来读取该文件的内容。


3、获取servlet路径 :getServletPath()方法,该方法返回一个字符串,表示当前请求的Servlet路径。Servlet路径是指请求URL中,从应用程序的上下文路径开始到请求的资源路径部分为止的那一部分路径。

以下是一个示例代码,用于获取当前请求的Servlet路径:

import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MyController {
    
    @RequestMapping("/myurl")
    public void myMethod(HttpServletRequest request) {
        String servletPath = request.getServletPath();  // 获取当前请求的Servlet路径
        System.out.println("Servlet Path: " + servletPath);
        
        // TODO: 处理HTTP请求的业务逻辑
    }
}

4、获取请求参数:getParameter()方法,该方法用于获取指定名称的请求参数的值。在HTTP请求中,参数通常是作为查询字符串或表单数据的形式传递的。

import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MyController {
    
    @RequestMapping("/myurl")
    public void myMethod(HttpServletRequest request) {
        String username = request.getParameter("username");  // 获取名为"username"的请求参数
        System.out.println("Username: " + username);
        
        // TODO: 处理HTTP请求的业务逻辑
    }
}

需要注意的是,在获取请求参数时,应该先判断参数是否存在,以及是否为空。否则,在解析参数值时可能会出现空指针异常等错误。

另外,在处理表单数据时,如果提交的表单中有多个相同名称的参数,则可以使用HttpServletRequest对象的getParameterValues()方法来获取这些参数的值。该方法返回一个字符串数组,包含指定名称的所有请求参数的值。

以下是一个示例代码,用于获取HTTP请求中的多个参数:

import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MyController {
    
    @RequestMapping("/myurl")
    public void myMethod(HttpServletRequest request) {
        String[] hobbies = request.getParameterValues("hobby");  // 获取名为"hobby"的多个请求参数
        if (hobbies != null) {
            for (String hobby : hobbies) {
                System.out.println("Hobby: " + hobby);
            }
        }
        
        // TODO: 处理HTTP请求的业务逻辑
    }
}

5、获取请求URL中包含的查询字符串部分:getQueryString(),查询字符串通常用于向服务器传递附加的参数或数据,是以键值对的形式出现的,多个参数用"&"符号进行分隔。

例如,对于请求URL "http://localhost:8080/myapp/myServlet?name=tom&age=20",getQueryString()返回的结果为 "name=tom&age=20"。

import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MyController {
    
    @RequestMapping("/myurl")
    public void myMethod(HttpServletRequest request) {
        String queryString = request.getQueryString();  // 获取当前请求的查询字符串
        System.out.println("Query String: " + queryString);
        
        // TODO: 处理HTTP请求的业务逻辑
    }
}

需要注意的是,getQueryString()方法返回的查询字符串是未经过解码的原始字符串,因此在使用前需要进行URL解码,以避免出现错误。通常可以使用Java标准库中的java.net.URLDecoder类来进行解码,例如:

String queryString = request.getQueryString();
if (queryString != null) {
    try {
        queryString = URLDecoder.decode(queryString, "UTF-8");
    } catch (UnsupportedEncodingException e) {
        // 处理异常
    }
}

6、获取请求URI:getRequestURI()方法,该方法返回一个字符串,表示当前请求的URI(统一资源标识符),即不包括查询字符串部分的URL路径。

以下是一个示例代码,用于获取HTTP请求中的URI:

import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MyController {
    
    @RequestMapping("/myurl")
    public void myMethod(HttpServletRequest request) {
        String uri = request.getRequestURI();  // 获取当前请求的URI
        System.out.println("URI: " + uri);
        
        // TODO: 处理HTTP请求的业务逻辑
    }
}

7、获取请求URL:getRequestURL()方法,该方法返回一个字符串缓冲区(StringBuffer)对象,表示当前请求的完整URL,包括协议、主机名、端口号和路径部分,但不包括查询字符串部分。

以下是一个示例代码,用于获取HTTP请求中的URL:

import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MyController {
    
    @RequestMapping("/myurl")
    public void myMethod(HttpServletRequest request) {
        StringBuffer url = request.getRequestURL();  // 获取当前请求的URL
        System.out.println("URL: " + url);
        
        // TODO: 处理HTTP请求的业务逻辑
    }
}

需要注意的是,在使用getRequestURL()方法获取URL时,应该同时考虑到HTTPS协议和非标准端口号的情况。如果使用getScheme()和getServerPort()方法获取协议和端口号,则可以保证获得正确的URL。例如:

StringBuffer url = new StringBuffer();
String scheme = request.getScheme();  // 获取协议
int port = request.getServerPort();  // 获取端口号
url.append(scheme)
   .append("://")
   .append(request.getServerName());
if ((scheme.equals("http") && port != 80)
        || (scheme.equals("https") && port != 443)) {
    url.append(":").append(port);
}
url.append(request.getRequestURI());
System.out.println("URL: " + url.toString());

在这个示例中,我们使用了getScheme()和getServerPort()方法来获取协议和端口号,然后根据协议和端口号的不同,在URL中添加冒号和端口号。最终获得的URL是包括协议、主机名、端口号和路径部分的完整URL。


8、获取协议及版本:getProtocol()方法,该方法返回一个字符串,表示当前请求所使用的协议及其版本。

import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MyController {

    @RequestMapping("/myurl")
    public void myMethod(HttpServletRequest request) {
        String protocol = request.getProtocol();  // 获取当前请求所使用的协议及其版本
        System.out.println("Protocol: " + protocol);

        // TODO: 处理HTTP请求的业务逻辑
    }
}

9、获取客户机的IP地址:getRemoteAddr()方法,该方法返回一个字符串,表示当前请求的客户机的IP地址。 

import javax.servlet.http.HttpServletRequest;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class MyController {

    @RequestMapping("/myurl")
    public void myMethod(HttpServletRequest request) {
        String remoteAddr = request.getRemoteAddr();  // 获取当前请求的客户机IP地址
        System.out.println("Remote Address: " + remoteAddr);

        // TODO: 处理HTTP请求的业务逻辑
    }
}

需要注意的是,getRemoteAddr()方法返回的IP地址可能是经过代理服务器(如Web代理、反向代理)变换过的IP地址,而不是真实客户机的IP地址。在这种情况下,可以使用X-Forwarded-For HTTP头来获取真实客户机的IP地址。

String xForwardedForHeader = request.getHeader("X-Forwarded-For");
if (xForwardedForHeader != null && xForwardedForHeader.length() > 0) {
    String[] parts = xForwardedForHeader.split(",");
    if (parts.length > 0) {
        String realIp = parts[0].trim();
        System.out.println("Real IP Address: " + realIp);
    }
}

在这个示例中,我们使用request.getHeader()方法获取消息头中的X-Forwarded-For HTTP头,并将其按照逗号进行分割,获取第一个元素作为真实的IP地址。需要注意的是,X-Forwarded-For HTTP头的值可能包含多个IP地址,其中最后一个IP地址通常是最接近客户机的真实IP地址。

你可能感兴趣的:(http,网络协议,网络)