【问题标题】:Can you tell if a servlet was called from an HTML image?你能判断一个 servlet 是否是从 HTML 图像调用的吗?
【发布时间】:2016-06-06 22:26:08
【问题描述】:

从 HttpServlet doGet 方法中,是否可以知道 servlet URL 是否通过 IMG SRC 访问,而不是在浏览器地址栏中输入?

更新

这是我的实际 HTML。

<a href="#" onclick="openwindow('/image/display?imageId=${image.id}'); return false;"><img width="50px" alt="${image.originalName}" src="/image/display?imageId=${image.id}" /></a>

如您所见,它会显示一个小缩略图,内嵌在页面中,但如果您单击它,它会在新窗口中以全尺寸打开。

我的 DisplayImageServlet 在 /image/display 后面。我在 servlet 中需要一些稍微不同的逻辑来显示缩略图而不是全尺寸。

理想情况下,我想要一个不涉及更改 HTML 引用的解决方案。我团队中的其他开发人员可能会添加对 servlet 的 HTML 引用,而不会欣赏其中的微妙之处。

【问题讨论】:

  • 我知道如果在 IMG SRC URL 上添加自定义参数,我可以做到。我希望我可能不必这样做(以防其他开发人员在没有指定参数的情况下调用我的 servlet)。我希望有办法获取调用窗口的 URL。
  • 感谢所有帮助。请不要打架! (顺便说一句,我是一个“她”。)。我会将我的 HTML 添加到原始问题中。

标签: html image http servlets


【解决方案1】:

用户可以在浏览器地址栏中输入任何内容。所以你的网址应该是不可预测的。 从图像(或页面上的任何内容)向您的 url 添加一些内容(如会话 id 加上当前时间),并验证请求的 url 是否具有此值。 在这种情况下,用户可以尝试模拟或剪切和粘贴以前的 url,但服务器会知道它不是来自此特定页面。

【讨论】:

    【解决方案2】:

    不是我所知道的,但如果请求是通过图像 src 发送的,您可以执行一些操作,例如在请求中添加标头。这样,您的请求负载在所有情况下都是相同的,但您仍然可以确定请求来自应用程序的哪个位置。例如,可以使用“referer”标头,直接调用其内容为“http://www.yoursite.com”,通过图片src调用其内容为“http://www.yoursite.com/images/linkImage.png”。

    编辑: 在进行了愉快的讨论之后,我认为最好解释一下这是如何工作的。首先,它不会在 servlet 生成 HTML 页面并返回给客户端的时候从 servlet 中获取值,而是在客户端中发生。所以这个过程会是这样的:

    • 客户端向 servlet 发出请求
    • Servlet 返回 HTML 页面,而不是在 img 标记中指定 src(实际上,src 可能应该填充一个虚拟/备份),onload 属性指向 javascript 函数 将设置图像 src。
    • Javascript 函数调用服务器上的某些东西来检索图像 src。此时,您可以将标题添加到您的 要求。
    • Servlet 接收请求并可以通过请求来自的标头的存在/值来判断。

    【讨论】:

    • 嗯。 servlet 当前未呈现有问题的 HTML。请查看更新后的问题。
    • 没问题,我的回答中的第 2 步只是将 img 标签更改为类似 &lt;img src="pixel.gif" onload="this.onload=null; this.src=getImagePath();" /&gt;
    • 绝对没有解决方案可以让 HTML 保持原样吗?
    • 不幸的是,我不知道。您基本上可以选择向 URL 添加参数或向请求添加标头。两者都需要对 HTML 进行相对较小的修改,最终两者之间的决定将基于更适合您的系统的内容。
    • @BalusC 有什么要补充的或有建设性的批评吗?
    【解决方案3】:

    如果是 doGet() 那么它应该将参数附加到 url 路径中,并且您应该能够在代码中使用 request.getParameter() 获取该参数。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-20
      • 1970-01-01
      • 2015-07-07
      • 1970-01-01
      • 1970-01-01
      • 2015-08-18
      • 2013-10-30
      • 1970-01-01
      相关资源
      最近更新 更多