1

我有一个在 tomcat 上运行的相对简单的 Spring Web 应用程序,它返回一个 xml 文档。初始请求进入,我可以调试我的代码。但是,后续请求不会进入调试器。我可以使用浏览器或soapUI 发出初始请求,随后的请求(在不同的浏览器/程序/机器上)得到与初始请求相同的响应。

每个请求都会填充 localhost_access_log。但是,log4j 文件不会在第一个请求之后填充。

我正在使用 Tomcat 7 和 spring 3.1.1。这发生在 eclipse 中部署的 tomcat(用于启用调试)以及将其部署在 linux 上的另一个 tomcat 服务器上。

这类似于从未接受过答案的另一个问题( Tomcat 给出相同的响应)。

所以它似乎不是浏览器缓存(发出请求的不同应用程序得到相同的响应),而是某种 Tomcat 缓存。

有任何想法吗?这是 server.xml,我认为它可能是导致问题的原因,但我没有看到任何危险信号。另外,我正在对 Web 应用程序进行 GET,它可能会以某种方式在服务器端进行缓存。

GET 请求示例:http://localhost:8130/bootstrap/xml?environment=dev

它返回一个 xml 文档,如该 RequestMapping 中所述:

@RequestMapping(value = "/xml", method = RequestMethod.GET,produces="application/xml")

示例响应:

<connection_details env="dev">
  <servers>
    <server host="localhost" name="auth" port="9876"/>
  </servers>
</connection_details>

该问题表现为每个请求都返回与初始请求相同的结果,即使传递给 GET 请求的环境变量发生了变化。即使从不同的浏览器和soapUI 请求也是如此。

如何创建上述响应的示例:

private ModelAndView bootstrap(HttpServletResponse response, String environment) { 

        Map<String, Object> model = new HashMap<String, Object>();
        try {
            DOMSource domSource = new DOMSource(documentBuilder.parse(context
                    .getResourceAsStream(bootstrapXmlFileName)));

            model.put("xml", domSource);
            model.put("requestedEnvironment", environment);
        }
        catch (Exception e) {
            response.setHeader("ERRORS", e.getMessage());
            response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
            return null;
        }

        return new ModelAndView("bootstrap_connection_selector", model);
    }

然后将其传递给 xslt 转换:

<bean id="viewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass"
            value="org.springframework.web.servlet.view.xslt.XsltView" />
        <property name="prefix" value="/WEB-INF/xsl/" />
        <property name="suffix" value=".xslt" />

    </bean>

最后进行如下改造:

<xsl:stylesheet version="1.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform">

        <!-- parameter for the requested location --> 
        <xsl:param name="requestedlocation"/>
        <!-- start template matching on the connection_details element -->  
        <xsl:template match="/connection_details">

        <!-- duplicate the enclosing <connection_details env=xxx" element -->
        <xsl:element name="connection_details">
            <xsl:attribute name="env">
                <xsl:value-of select="@env"/>
            </xsl:attribute>

            ...

        <!-- close the <connection_details> element -->
        </xsl:element>
    </xsl:template>
</xsl:stylesheet>

服务器.xml:


<?xml version="1.0" encoding="UTF-8"?>
<Server port="8133" shutdown="SHUTDOWN">

  <Listener SSLEngine="on" className="org.apache.catalina.core.AprLifecycleListener"/>
  <Listener className="org.apache.catalina.core.JasperListener"/>
  <Listener className="org.apache.catalina.core.JreMemoryLeakPreventionListener"/>
  <Listener className="org.apache.catalina.mbeans.GlobalResourcesLifecycleListener"/>
  <Listener className="org.apache.catalina.core.ThreadLocalLeakPreventionListener"/> 
  <GlobalNamingResources>

    <Resource auth="Container" description="User database that can be updated and saved" factory="org.apache.catalina.users.MemoryUserDatabaseFactory" name="UserDatabase" pathname="conf/tomcat-users.xml" type="org.apache.catalina.UserDatabase"/>

  </GlobalNamingResources> 
  <Service name="Catalina">


    <Connector connectionTimeout="20000" port="8130" protocol="HTTP/1.1" redirectPort="8131"/>

    <Connector port="8132" protocol="AJP/1.3" redirectPort="8131"/>


    <Engine defaultHost="localhost" name="Catalina">


      <Realm className="org.apache.catalina.realm.LockOutRealm">

        <Realm className="org.apache.catalina.realm.UserDatabaseRealm" resourceName="UserDatabase"/>
      </Realm>

      <Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true">

        <Valve className="org.apache.catalina.valves.AccessLogValve" directory="logs" pattern="%h %l %u %t &quot;%r&quot; %s %b" prefix="localhost_access_log." suffix=".txt"/>

      <Context docBase="em_bootstrap" path="/bootstrap" reloadable="true" source="org.eclipse.jst.jee.server:em_bootstrap"> 
      </Context></Host>
    </Engine>
  </Service>
</Server>
4

1 回答 1

0

事实证明,这是一个不检查过滤器的坏情况。web.xml 中应用了一个缓存过滤器,这可能是我唯一没有检查的地方。它错误地使用 request.getRequestURI 作为缓存的键,而实际上它需要整个请求字符串才能将其正确放置在缓存中。

谢谢

于 2013-09-09T19:31:53.673 回答