كيفية إخراج وثيقة الثنائية على أساس وثيقة HTML باستخدام مرشحات في جاوة

StackOverflow https://stackoverflow.com/questions/493924

سؤال

وهذا قد يكون مربكا بعض الشيء ولكن أنا وجود بعض المتاعب. هدفي هو أن تأخذ وثيقة مساهمة HTML ومن ثم معالجة تلك الوثيقة واستخدام البيانات HTML لإخراج صورة وثيقة. على سبيل المثال، فإن المستخدم طلب URL، مع بعض الإجراءات = بابوا نيو غينيا في سلسلة استعلام مواقع المعلومات ومن ثم تصفية سوف تحصل على الاحتجاج على وثيقة URL وإخراج الصورة.

ولقد حاولت كل شيء ولكن في بيئتي (بنك الإسكان للتجارة)، وأنا فقط قادرة على انتاج نوع واحد. إذا كان نوع الإدخال النص / أتش تي أم أل ثم لا أستطيع إخراج فقط نص الوثيقة، وأنا لا يمكن أن يبدو لإخراج وثيقة ثنائية. لماذا ا؟ لأنني الحصول على استثناء دولة غير الشرعيين في كل مرة.

[1/29/09 17: 59: 57: 576 EST] 00000020 SystemErr R java.lang.IllegalStateException: SRVE0209E: الكاتب الحصول بالفعل [1/29/09 17: 59: 57: 576 EST] 00000020 SystemErr R في com.ibm.ws.webcontainer.srt.SRTServletResponse.getOutputStream (SRTServletResponse.java:505)

وأنا باستخدام رمز الزائفة عدم الكشف عن قانون بلدي:

<filter>
    <filter-name>TestFilter</filter-name>
    <filter-class>
        com.util.TestFilter
    </filter-class>
</filter>

<filter-mapping>
    <filter-name>TestFilter</filter-name>
    <url-pattern>/index_test2.html</url-pattern>
</filter-mapping>

والرمز التفاف الفئة هي في الأساس هذا:

public class ContentCaptureServletResponse extends HttpServletResponseWrapper { 
    private ByteArrayOutputStream contentBuffer;
    private PrintWriter writer; 
    public PrintWriter getWriter() throws IOException {
        if (writer == null) {
            contentBuffer = new ByteArrayOutputStream();
            writer = new PrintWriter(contentBuffer);
        }       
        return writer;
    }   
    public String getContent(){
        try {
            writer = getWriter();
        } catch (IOException e) {           
            e.printStackTrace();
        }
        writer.flush();
        String xhtmlContent = new String(contentBuffer.toByteArray());                 
        System.out.println(xhtmlContent);                
        return xhtmlContent; 
    }
}

ورمز المرشح هو هذا:

public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {

        HttpServletRequest request = (HttpServletRequest) req;
        HttpServletResponse response = (HttpServletResponse) resp;
        final String renderType = request.getParameter("R"); 
        final String renderClassName = request.getParameter("C");
        if ((renderType != null) && (renderClassName != null)) {
            try {
                this.setFilterChain(filterChain);
                response.setContentType("image/png");
                PrintWriter out = response.getWriter();                             
                // I call getWriter but not BOTH!
                //response.getOutputStream();               
                response.getWriter();

                // Build up the HTML document into a string.
                    CaptureResponse capContent = new CaptureResponse(response);            
                this.mainFilterChain.doFilter(req, );
                String myString = capHtmlContent.getContent();

                // What I really want to do here is output an output stream
                // so I can write a binary image
                processStr(myString);
                response.getOutputStream();             
                response.write(binaryimage)

            } catch (Exception e) {            
                e.printStackTrace();
            }
            // No data will be output to the user.
        } else {
            filterChain.doFilter(request, response);
        }  // End of if-else        
    } // End of the method.

وتعمل التعليمة البرمجية إذا كنت تريد أن تأخذ بعض وثيقة إدخال النص أتش تي أم أل. وأنا على افتراض بسبب تيار printwriter مفتوحة. ولكن أواجه مشكلة في الذهاب إلى تنسيق مختلف. في الأساس، لأنني لا يمكن أن نطلق response.getOutputStream ()

هل كانت مفيدة؟

المحلول

لا تظهر القضية أن الذي تفتحه الكاتب استجابة قبل التفاف الاستجابة.

ويبدو أنك ينبغي أن تكون قادرة على القيام به:

this.setFilterChain(filterChain);
CaptureContent capContent = new CaptureResponse(response);
doFilter()
process();
response.setContentType("image/png");
response.getOutputStream().write(imagedata);

وأنت بالتأكيد لا يمكن بأمان فتح كل من الكاتب وOutputStream

نصائح أخرى

وليست لدي خبرة مع بنك الإسكان للتجارة، ولكن مشكلة واحدة مشتركة هي أن محاولة التلاعب في رأس HTTP بعد ملتزمة بالفعل بإرسال الجسم - مرة واحدة بدأ خادم لتقديم محتوى، لا يمكنك تحديث رؤوس أي أكثر منذ لقد تم ارسال بالفعل.

وربما تحتاج إلى مراجعة الوثائق والأمثلة الخاصة بك. على سبيل المثال، وأنا لا أرى لماذا تسمونه response.get * () دون النظر فعلا في النتيجة. هل أنت متأكد أن هذا أمر ضروري أم أن هذا لأنك خفضت التعليمات البرمجية الخاصة بك؟

وابتهاج،   فولكر

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top