2013-09-09 5 views
1

У меня есть относительно простое весеннее веб-приложение, работающее на tomcat, которое возвращает XML-документ. Начальный запрос входит, и я могу отлаживать код. Однако последующие запросы не попадают в отладчик. Я могу сделать первоначальный запрос с помощью браузера или soapUI, а последующие запросы (в разных браузерах/программах/машинах) получают тот же ответ, что и исходный.Ответ Tomcat одинаковый каждый раз после ответа initital

Localhost_access_log заполняется каждым запросом. Однако файл log4j не заполняется за пределами первого запроса.

Я использую Tomcat 7 и весну 3.1.1. Это происходит как на tomcat, развернутом в eclipse (используется для включения отладки), так и на развертывании на другом сервере tomcat на Linux.

Это похоже на другой вопрос (Tomcat gives Same Response), который никогда не принимал ответ.

Таким образом, это не похоже на кеширование браузера (разные приложения, делающие запросы, получают одинаковый ответ), а скорее какое-то кэширование Tomcat.

Любые идеи? Вот файл server.xml, который, как я считаю, может быть причиной проблемы, но я не вижу никаких красных флагов. Кроме того, я делаю 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> 
+0

Можете ли вы показать, как вы производите ответ, и что это такое? –

+0

Добавлены подробности выше на ответ. – Justin

+0

Меня больше интересует процесс его создания. –

ответ

0

Это оказалось плохим случаем не проверки фильтров. В web.xml использовался фильтр кеширования, возможно, единственное место, которое я не проверял. Неправильно использовать request.getRequestURI в качестве ключа для кеша, когда на самом деле ему нужна вся строка запроса, чтобы правильно поместить ее в кеш.

спасибо