【问题标题】:RequestDispatcher.forward() to resource under "/WEB-INF" doesn't work in WebSphereRequestDispatcher.forward() 到“/WEB-INF”下的资源在 WebSphere 中不起作用
【发布时间】:2013-12-21 02:36:21
【问题描述】:

在我的一个 servlet 中,我调用 RequestDispatcher.forward() 调用 WEB-INF 文件夹下某处的静态资源:

request
    .getRequestDispatcher( "/WEB-INF/some/path/image.gif" )
        .forward( request, response );

导航到这个 servlet 在 Tomcat、Jetty 等下工作正常,但在 WebSphere 7 中不工作。 我得到的错误(在浏览器和服务器日志中)是

Error 403: SRVE0190E: File not found: /WEB-INF/some/path/image.gif

最初我认为 WebSphere 可能需要一些特定的配置来允许内部转发到 WEB-INF 下的资源,但我没能在 google 上找到任何有用的东西。

任何想法为什么会发生这种情况?

提前致谢!

【问题讨论】:

  • 检查您的部署。那个文件真的存在吗?
  • @SotiriosDelimanolis 是的。相同的 WAR 在其他服务器下工作...
  • 可以转发到 WEB-INF 内的资源。我认为这是 Java EE 的规范,因为它是内部调用。 403 表示资源存在但被禁止,不可访问。 WebSphere 出了点问题。您是否尝试仅部署应用程序文件夹?不是 .WAR 文件。
  • @Loc 我猜 WebSphere 出了点问题,特别是如果它在其他服务器上也能正常工作 :) 然而,这发生在客户的站点上,并且在我的实验室中很容易重现......无论如何,我该如何“仅部署应用程序文件夹”,好吗?我承认我对 WebSphere 很陌生 :(
  • 如何“仅部署应用程序文件夹”?这对我来说也是新的。我可以在Tomcat中做到这一点。请尝试将您的应用程序放入 WAS_INSTALL_DIR/runtime/installapps/YOUR APPLICATION。未测试。

标签: java servlets websphere web-inf requestdispatcher


【解决方案1】:

似乎应该将exposeWebInfOnDispatch 属性设置为true,以使WebSphere 中的servlet 可以访问WEB-INF。我从WebSphere forum得到这个答案。


在 WebSphere 7 管理控制台中,

  1. 转到“服务器”=>“服务器类型”=>“WebSphere 应用程序服务器” 在左边
  2. 在页面主要部分的列表中选择合适的服务器
  3. 点击“容器设置”=>“Web容器设置”=>“Web 容器”
  4. 转到右侧的“自定义属性”
  5. 添加新属性:

    • 姓名:exposeWebInfOnDispatch
    • 值:true

【讨论】:

  • 感谢您在此处更新发现的内容。很高兴论坛提出了解决方案。
  • 你在哪里设置了这个选项?是否可以在部署描述符中设置?
  • @Cypher 刚刚在答案中添加了详细步骤。不确定您是否可以在部署描述符中执行此操作。不过,我绝不是 WebSphere 专家……
【解决方案2】:

您收到的是 HTTP 403,这意味着被禁止。尝试将 image.gif 移出 WEB-INF。这可能有效

【讨论】:

  • 我猜会的,但这不是重点。我不希望从网络上直接访问该文件。
  • 也许您可以将其作为资源读取,然后使用正确的 http 内容类型将内容写回响应,而不是尝试进行请求转发
  • 也许,我也可以考虑其他解决方法。但是,我试图了解这里发生了什么以及为什么。
猜你喜欢
  • 2012-08-18
  • 1970-01-01
  • 2018-10-14
  • 2013-11-05
  • 2022-06-22
  • 1970-01-01
  • 2012-08-25
  • 1970-01-01
相关资源
最近更新 更多