【问题标题】:How to get html request URL in a servlet如何在 servlet 中获取 html 请求 URL
【发布时间】:2013-01-05 11:20:01
【问题描述】:

我正在使用这样的 HTML 表单,

<form action="/myservlet?userid=12345" method="post" enctype="multipart/form-data">
<input type="file" name="file">
<input type="submit" value="Submit">
</form>

而这个 HTML 表单的路径例如,http://www.mywebapp.com/sample.html

在我的 servlet 中,当我使用 String url = req.getRequestURL().toString(); 并打印出字符串时,它会打印表单操作 URL http://www.mywebapp.com/myservlet?userid=12345 而不是 HTML URL。

预期的 HTML URL:http://www.mywebapp.com/sample.html(只有我从这里请求并且我需要这个 URL)

谁能建议我如何在 servlet 中获取 HTML url 路径。

【问题讨论】:

  • 您尝试使用getRequestURI().toString(); 吗?
  • HTML URL 是什么意思?你能得到/myservlet?userid=12345吗?
  • 在此处粘贴示例字符串,您的意思是 html url 路径..以便有人帮助您。
  • @KevinEsche 如果我使用getRequestURI().toString(); 我只会得到/myservlet 我期待得到http://www.mywebapp.com/sample.html
  • @sp00m 不希望得到http://www.mywebapp.com/sample.html

标签: java servlets


【解决方案1】:

如果我对您的理解正确,您希望在发出后续请求(form 帖子)时获取一个请求(加载 html 的请求)的 URL。

HTTP 是无状态的,因此无法可靠地做到这一点。

需要这样做有一点代码味道,但如果你真的需要 URL,你将不得不在 form 中将 URL 作为隐藏的 input 传递。有多种方法可以做到这一点,无论您是使用 JSP/JSTL 还是使用 JavaScript 在客户端做一些事情,但基本上您试图获得这样的form

<form action="/myservlet?userid=12345" method="post" enctype="multipart/form-data">
   <input type="file" name="file">
   <input type="hidden" name="url" value="http://www.mywebapp.com/sample.html"/>
   <input type="submit" value="Submit">
</form>

【讨论】:

  • 是的,您理解正确。我在这里面临的问题是客户端可以使用任何设备,并且从该 HTML 页面请求将被发送到我的 servlet。所以我不可能要求客户将 URL 发送为隐藏。你还有什么想法吗?
  • 大概如果您不控制客户端 html,那么它是从另一个 web 应用程序甚至服务器加载的?如果它在同一个 web 应用程序中,您可能已经能够通过会话执行某些操作,但听起来并非如此。底线是,如果 URL 对 servlet 很重要,那么它就是 servlet 所需的参数之一,任何客户端都必须像执行其他参数一样遵守这一点。
  • 当我使用 multipart/form-data 时,我在 servlet 中将隐藏字段值设为 null,你能告诉我如何解决它
  • 抱歉,我从您的原始问题中复制了 from - 您可以删除 multipart/form-data 位。然后,我首先对值进行硬编码,然后一旦可行,我将使用 JSTL url 标记设置值。
  • 尼克我成功获得了那个链接。现在我想将输出发送到作为隐藏传递的 URL。我尝试使用 Request Dispatcher,但失败了可以给出想法
【解决方案2】:

这是某种问题,因为用户在你写的时候加载了页面http://www.mywebapp.com/sample.html,在这个初始请求中你将从request.getRequestURL().toString得到这个值

在使用表单(来自客户端)的下一个请求中,url 不再是 http://www.mywebapp.com/sample.html,而是 form action 属性中指定的那个。

有很多在表单中传递隐藏值的建议或类似的东西,但您可以轻松地使用简单的 HTTP。每次执行 GET 请求时,您都会在浏览器(或其他客户端)窗口中获得一个新 URL,但是当您在浏览器中执行 POST 请求时,URL 不会改变。因此,现在在您的代码中,如果您知道这是一个 POST 请求并且您想从该请求发出的位置获取页面,您可以轻松地从 Http Header "Referer" 中读取它:

String URLfromWherePostWasMade = request.getHeader("Referer"); 

这应该与所有“隐藏字段”示例相同

【讨论】:

  • +1 - 噢,希望我在回答之前能想到 HTTP 标头(现在已删除答案,因为它具有误导性)。
  • 呵呵,但我的建议仅适用于管理 http 引用值的客户端环境。当然这样的环境都是我知道的网络浏览器。
  • 是的,就像我说的那样——它只适用于常见的标准用户环境,主要是网络浏览器
  • 是的,但是当我在 https 中尝试时,我的搜索结果为空值allben.net/post/2009/02/25/…
【解决方案3】:

您的“HTML 页面”被称为“Referrer”,您可以通过这种方式获取它

HttpServletRequest.getHeader("Referer");

它会返回表单提交的页面,在你的情况下

http://www.mywebapp.com/sample.html

【讨论】:

  • 我试过了,但如果它的 HTTPS 巢穴返回空值,请参阅此链接 allben.net/post/2009/02/25/…
  • 如果返回空值,则表示未填写HTTP referrer。 HTTP referrer 由浏览器填充,HTTPS 连接没有 http referrer:Clients SHOULD NOT include a Referer header field in a (non-secure) HTTP request if the referring page was transferred with a secure protocol 所以如果你使用 HTTPS 连接就不行。来源:w3.org/Protocols/rfc2616/rfc2616-sec15.html#sec15.1.3
猜你喜欢
  • 2011-05-01
  • 2013-05-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-07-23
  • 2011-02-13
相关资源
最近更新 更多