7

从 CWA 1.5 升级到在 WebSphere 上运行的 CWA 2011 后,我的客户遇到了问题。问题是任何请求的二进制资源都会返回 404。当重新提交请求(即刷新/重新加载页面)时,它们会加载。

我无法访问他们的环境,必须通过第三方获取所有配置文件。我想知道是否有人对导致二进制文件出现这些 404 的原因有任何想法?

4

6 回答 6

12

从 Websphere 6.1 开始,IBM 更改了过滤器的行为,如果您调用的 URL 实际上在服务器上不存在,这些过滤器将不会执行。

这意味着对仍在数据库中的 /somefile.png 的请求将导致(技术上正确)404,但完全不是您对启用 CWA 的 Web 应用程序的期望。

解决方案是让过滤器在没有 servlet 映射的情况下调用请求,您应该能够在 WebSphere 管理控制台中执行以下操作:

  1. 单击服务器 -> 服务器类型 -> Websphere 应用程序服务器 -> -> Web 容器设置 -> Web 容器
  2. 在其他设置下单击自定义属性
  3. 在自定义属性页面上,单击新建,然后输入“com.ibm.ws.webcontainer.invokefilterscompatibility”作为属性名称,输入“true”作为值
  4. 保存更新并重新启动服务器
于 2013-02-06T15:31:06.867 回答
4

自从我使用 CWA 已经很久了,但是 IIRC 它会根据请求将二进制文件序列化到磁盘,并将它们缓存起来以备将来使用。听起来这个过程花费的时间太长了,所以你得到一个 404 的第一个二进制请求。我以前在 WebSphere 上听说过这个,你确定旧的 CWA 也没有发生这种情况吗?

如果问题仍然存在,我建议联系 SDL 客户支持。

于 2013-02-06T13:52:44.180 回答
3

cd_cwa_conf.xml文件中,还可以添加如下参数:

<configuration>
... 
   <!-- Number of seconds to wait for the default Servlet to pick up changes on the file-system -->
    <file-synchronization delay="..." />
...
</configuration>

正如克里斯所说,第一次请求二进制文件时,文件被序列化并缓存在磁盘上。如果该过程太长,则应用服务器将返回 404。

使用此参数,系统会在访问文件之前等待几秒钟(即指定的值)。

我们在 Tomcat 服务器上遇到了同样的问题,这已经修复了 pb。

于 2013-02-06T18:46:06.150 回答
3

我认为这个问题到底是关于什么的有点混乱。所以尼克解释说,对二进制文件的第一个请求会导致 404。任何后续请求都会按预期提供二进制文件。因此,Elena 给出的答案并不能真正解决这个问题,尽管她非常正确地说必须在 WebSphere 中进行该特定设置。

“仅在第一个请求上获得 404”问题的答案是在每个 URL 模式二进制类型到默认 Servlet 的 web.xml 文件中都有一个显式映射。这在http://sdllivecontent.sdl.com/LiveContent/content/en-US/SDL_CWA_10/task_C1FECE85AD5E4F0BB3957C4516D7E2AC中进行了描述,项目符号 #6:

 <servlet-mapping>
    <servlet-name>default</servlet-name>
    <url-pattern>*.jpg</url-pattern>
 </servlet-mapping>

文档说明这修复了 JBoss、Tomcat,但我也看到它修复了 WebLogic。我希望它也能修复 WebSphere。请告诉我们。

于 2013-02-06T23:28:14.310 回答
3

对于 WebSphere 7,默认 servlet 称为 FileServlet,因此以下应该可以工作:

<servlet>
<servlet-name>FileServlet</servlet-name>
<servlet-class>
com.ibm.ws.webcontainer.servlet.SimpleFileServlet 
</servlet-class>
</servlet>


<servlet-mapping>
  <servlet-name>FileServlet</servlet-name>
  <url-pattern>*.css</url-pattern>
</servlet-mapping>
<servlet-mapping>
  <servlet-name>FileServlet</servlet-name>
  <url-pattern>*.jpg</url-pattern>
</servlet-mapping>
<servlet-mapping>
  <servlet-name>FileServlet</servlet-name>
  <url-pattern>*.js</url-pattern>
</servlet-mapping>
<servlet-mapping>
  <servlet-name>FileServlet</servlet-name>
  <url-pattern>*.gif</url-pattern>
</servlet-mapping>
于 2013-02-07T18:43:29.103 回答
1

如果您使用的是 Tomcat 7(可能是 Tomcat 6 的最新版本),请小心。web.xml 文件的合并方式存在限制

我不知道确切的原因,但是您不能定义到默认 servlet 的多个映射。此 servlet 只能有一个映射条目。

也许与此有关:https ://issues.apache.org/bugzilla/show_bug.cgi?id=50026

顺便说一句,您可以通过重新定义默认映射来绕过此限制。

例如:以下内容不适用于 Tomcat 7.0.33。所有资源都出现 404 错误。

<servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>/worldwide/binaries/*</url-pattern>
</servlet-mapping>
<servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>/france/binaries/*</url-pattern>
</servlet-mapping>

以下工作完美

<servlet-mapping>
  <servlet-name>default</servlet-name>
  <url-pattern>/worldwide/binaries/*</url-pattern>
  <url-pattern>/france/binaries/*</url-pattern>
  <url-pattern>/</url-pattern>
</servlet-mapping>

希望它有所帮助。

于 2013-03-26T18:28:57.860 回答