RequestDispatcher.forward()无法在WebSphere中使用于“/WEB-INF”下的资源

3
在我的一个Servlet中,我调用RequestDispatcher.forward()方法来转发到WEB-INF文件夹下的某个静态资源:
request
    .getRequestDispatcher( "/WEB-INF/some/path/image.gif" )
        .forward( request, response );

在Tomcat、Jetty等服务器上导航到此servlet没有问题,但在WebSphere 7中不起作用。 我收到的错误(无论是在浏览器还是服务器日志中)如下:

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

最初我认为WebSphere可能需要一些特定的配置来允许对WEB-INF下资源的内部转发,但是我没有找到任何有用的谷歌结果。

您有什么想法,为什么会出现这种情况?

提前致谢!


1
检查您的部署。那个文件真的在那里吗? - Sotirios Delimanolis
@SotiriosDelimanolis 是的。相同的WAR文件在其他服务器上也可以工作... - Anton
可以将资源转发到WEB-INF内部。我认为这是Java EE的规范,因为它是内部调用。403表示资源存在但被禁止访问,无法访问。WebSphere出了点问题。您尝试过仅部署应用程序文件夹吗?而不是.WAR文件。 - LHA
如何进行“仅部署应用程序文件夹”? 这对我来说也是新的。 我可以在Tomcat中执行此操作。 请尝试将您的应用程序放入WAS_INSTALL_DIR / runtime / installapps / YOUR APPLICATION目录中。未经测试。 - LHA
@dbreaux 谢谢您提供的链接,我已经在那里询问了。 - Anton
显示剩余2条评论
2个回答

6
看起来需要设置exposeWebInfOnDispatch属性为true,以使WebSphere中的servlet可以访问WEB-INF。我从WebSphere论坛得到了这个答案。
在WebSphere 7管理控制台中: 1. 左侧导航栏中选择“服务器”=>“服务器类型”=>“WebSphere应用程序服务器” 2. 在页面主体部分的列表中选择适当的服务器 3. 点击“容器设置”=>“Web容器设置”=>“Web容器” 4. 在右侧找到“自定义属性” 5. 添加新属性: - 名称:exposeWebInfOnDispatch - 值:true

感谢在这里更新发现的内容。很高兴论坛提供了解决方案。 - dbreaux
你在哪里设置了这个选项?它可以在部署描述符中设置吗? - Cypher
@Cypher 刚刚在答案中添加了详细的步骤。不确定您是否可以在部署描述符中执行此操作。虽然我并不是WebSphere专家... - Anton

0

您收到了HTTP 403错误,这意味着被禁止访问。尝试将image.gif移出WEB-INF文件夹,也许会起作用。


我猜它会,但这不是重点。我不希望文件可以直接从网络访问。 - Anton
也许你可以将这个作为资源阅读,然后将内容正确地写回响应中,而不是尝试进行请求转发。 - Sajith Silva
也许,我还可以考虑其他解决方法。然而,我正在努力理解这里发生了什么以及为什么会这样。 - Anton

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接