MockHttpServletRequest 忽略设置字段,我该如何解决这个问题



我正在尝试测试Tomcat应用程序的servlet过滤器。为此,我使用了 Spring 提供的 MockHttpServletRequest。

我像这样设置它:

MockHttpServletRequest request = new MockHttpServletRequest();
request.setMethod("POST");
request.setRemoteHost("mycompany.com");
request.setRequestURI("/myapp.php");
request.setSecure(true);

但是当我以下:

System.out.println(request.getRequestURL());

生产: http://localhost/myapp.php .另一方面,如果我明确请求我设置的字段之一,例如:

System.out.println(request.getRemoteHost());

我得到:mycompany.com

这是怎么回事?我怎样才能让getRequestURL产生我真正想要的东西:https://mycompany.com/myapp.php

Sotirios 关于 serverName vs. remoteHost ;但是,这种变化只能让您部分到达那里。

以下内容将实现您的目标:

MockHttpServletRequest request = new MockHttpServletRequest();
request.setScheme("https");
request.setServerName("mycompany.com");
request.setServerPort(443);
request.setRequestURI("/myapp.php");
System.out.println(request.getRequestURL());
// Prints: https://mycompany.com/myapp.php

问候

山 姆

您正在创建一个MockHttpServletRequest,它表示在服务器上运行的 servlet 收到的请求。

MockHttpServletRequest#getRemoteHost()(实际上是ServletRequest)状态的javadoc

返回客户端的完全限定名称或最后一个代理 已发送请求。

因此,您setRemoteHost设置的是发出请求的客户端的主机名/ip,而不是接收请求的服务器的主机名。

你会想要MockHttpServletRequest#setServerName(String)

request.setServerName("mycompany.com");

最新更新