2012-11-30 7 views
8

मैंने सर्वलेट लागू किया है जो स्थिर नहीं है, कभी-कभी यह सामग्री में हेडर मिश्रित करता है और दो बार लिखता है।सर्वलेट हेडर और सामग्री को मिश्रित करता है और आउटपुट में दो बार लिखता है?

और कभी कभी यह फ़ाइल जो प्रतिक्रिया हेडर कुछ इस तरह की सामग्री द्वारा मिश्रित शामिल लौटा रहा है:

Server: Apache-Coyote/1.1 
: W/"43-1353687036000" 
DatCCoonntenntt--DDiissppoosittiioonn: : atatatacehnmte;n tf;i lfenlaemnea=m20=12201112211127325421_4W1_Wirnkgi_nSgc_Seern.xnlsx 
sx 
Content-Typ-eT: ype: applaipcatciaoti/on/toctestt-rstare 
am 
ConCtoententy-pTeype: appalicatcion/oon/octet-setarm 
m 
CCoonntent-Lnegtht h: 4199 

Date: te: FriF,r i2,3 2No vNo2v0 120162: 215:25 :G4M2T 
.... 
File content bytes ... 

And again same header and content 

अद्यतन * यह स्थिति Tomcat7 पर होता है *

मैं पर भी परीक्षण किया है टॉमकैट 6 और जेट्टी, दोनों मामलों में सामग्री की प्रतिक्रिया के लिए HTTP-शीर्षलेख का कोई इंजेक्शन नहीं है लेकिन HTTP-हैडर गलत है और गलत फ़ाइल नाम देता है, फ़ाइल सामग्री सही फ़ाइल है। मैंने देखा है कि सर्वलेट से गलत रिटर्न तब होता है जब रिटर्न ट्रांसफर-एन्कोडिंग टूट जाती है।

जब मैं हेडर सामान हटा रहा हूं, और बाइट्स का दूसरा भाग, यह वैध फ़ाइल है। क्या यह संभव है कि सिंक्रनाइज़ेशन समस्या है?

अद्यतन यहाँ सर्वलेट का पूरा स्रोत है:

public class ExcelDownloadServlet extends HttpServlet 
{ 
    private static final long serialVersionUID = 1L; 
    private static final Logger LOG = Logger 
      .getLogger (ExcelDownloadServlet.class); 


    @Override 
    protected void doGet (HttpServletRequest request, 
      HttpServletResponse response) throws ServletException, IOException 
    { 
     try 
     { 
      TransactionId transactionId = getTransactionId (request); 
      String fileName = 
        request.getParameter (GlobalConstants.EXCEL_FILE); 
      ExcelDownloadType downloadType = 
        ExcelDownloadType 
          .valueOf (request 
            .getParameter (GlobalConstants.EXCEL_DOWNLOAD_TYPE)); 
      ActionContextFactory actionContextFactory = 
        ApplicationContext.getContext() 
          .getActionContextFactory(); 
      //suppress warning. HttpServletRequest.getLocales does not support generics 
      @SuppressWarnings("unchecked") 
      ActionContext actionContext = 
        actionContextFactory.create (request.getSession() 
          .getId(), Collections.<Locale> list (request 
          .getLocales())); 
      GetExcelDataResponse dataResponse = 
        new GetExcelData (transactionId, fileName, downloadType) 
          .execute (actionContext); 
      writeToResponse (response, dataResponse.getFileName(), 
        dataResponse.getData()); 
     } 
     catch (InvalidSessionException e) 
     { 
      LOG.error ("Invalid session in Excel download", e); 
      throw new ServletException (e); 
     } 
     catch (ActionException e) 
     { 
      LOG.error ("Could not download into excel.", e); 
      throw new ServletException (e); 
     } 
    } 

    protected TransactionId getTransactionId (HttpServletRequest request) 
    { 
     return RequestParameterDeserializer.<TransactionId> deserialize (
       request, GlobalConstants.TRANSACTION_ID); 
    } 

    protected void writeToResponse (HttpServletResponse response, 
      String rawFileName, byte[] data) throws IOException 
    { 
     ServletOutputStream sout = null; 
     try 
     {    
      response.setContentType ("application/octet-stream"); 
      response.setContentLength (data.length); 
      // removing blanks from the file name, since FF cuts file names 
      // otherwise. 
      String fileNameWithTime = rawFileName.replaceAll (" ", "_"); 
      response.setHeader ("Content-Disposition", "attachment; filename=" 
        + fileNameWithTime); 
      sout = response.getOutputStream(); 
      sout.write (data, 0, data.length); 
     } 
     finally 
     { 
      if (sout != null) 
      { 
       sout.close(); 
      } 
     } 
    } 

अद्यतन * कॉल जब, आवश्यक पैरामीटर और iframe में सेट के साथ सर्वलेट का URL पैदा कर रहा है तो GWT एप्लिकेशन से आती है सर्वलेट कॉल और फ़ाइल डाउनलोड हो रही है। क्या कोई सुझाव है? *

+2

को हटाने आप एक तुल्यकालन मुद्दा मैं अपने पूरे सर्वलेट पोस्टिंग की सिफारिश करेंगे संदेह है की कोशिश है, क्योंकि कुछ तुल्यकालन मुद्दों सर्वलेट में परिभाषित क्षेत्रों के कारण होता है। –

+0

@ kmb385 मेरा मतलब है कि मैं कोड के भाग को सिंक्रनाइज़ करना चाहिए जिसे मैंने पोस्ट किया था? यह बहुत ही सरल सर्वलेट है जो आउटपुट में जेनरेट की गई फ़ाइल के बाइट सरणी को लिखता है, और मैं उलझन में हूं कि इसमें प्रतिक्रिया हेडर इत्यादि क्यों हैं। –

+0

प्रत्येक सर्वलेट के लिए प्रतिक्रिया और अनुरोध के नए उदाहरण के बाद, मुझे आवश्यकता नहीं दिखाई देती है कोड के इस ब्लॉक को सिंक्रनाइज़ करें। क्या आप HTML या जेएस पोस्ट कर सकते हैं जो सर्वलेट का अनुरोध करता है। –

उत्तर

2

मुझे बहुत समय पहले एक ही समस्या थी। यह पता चला कि ServletOutputStream को बंद करने से अनुरोध प्रवाह पर एक अप्रत्याशित व्यवहार शुरू हुआ।

Servlets आउटपुटस्ट्रीम प्रदान किए गए कंटेनर को बंद नहीं करना चाहिए। एक और समस्या मैन्युअल रूप से सामग्री की लंबाई निर्धारित कर सकती है, यह सही मूल्य का निर्माण करने वाले कंटेनर की ज़िम्मेदारी है।

संक्षेप में, out.close() और response.setContentLength()

+0

मैंने प्रतिक्रिया निर्दिष्ट की है .setContentLength(), मैं out.close() को निकालने का प्रयास करूंगा, समस्या निरंतर और पुन: उत्पन्न करने में मुश्किल होती है, उत्तर के लिए धन्यवाद –

संबंधित मुद्दे