Как вывести двоичный документ на основе HTML-документа с помощью фильтров в Java

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

Вопрос

Это может немного сбивать с толку, но у меня возникли некоторые проблемы.Моя цель — взять входной HTML-документ, затем обработать этот документ и использовать данные HTML для вывода документа изображения.Например, пользователь запросит URL-адрес с некоторым action=png в строке запроса, а затем будет вызван фильтр для URL-адреса и выходного документа изображения.

Я перепробовал все, но в своей среде (Websphere) я могу выводить только один тип.Если тип ввода — text/html, я могу вывести только текстовый документ, но не могу вывести двоичный документ.Почему?Потому что я каждый раз получаю незаконное исключение штата.

[29.01.09 17:59:57:576 EST] 00000020 SystemErr R java.lang.IllegalStateException:СРВЕ0209Е:Писатель уже получил [29.01.09 17: 59: 57: 576 EST] 00000020 Systemerr R At 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.

Код работает, если я хочу взять какой-то входной текстовый документ HTML.Я предполагаю, что из-за открытого потока принтрайтеров.Но у меня возникли проблемы с переходом на другой формат.По сути, потому что я не могу вызвать response.getOutputStream()

Это было полезно?

Решение

Проблема, похоже, заключается в том, что вы открываете средство записи ответов до того, как обернуть ответ.

Похоже, вы сможете сделать:

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

Вы определенно не можете безопасно открыть Writer и OutputStream.

Другие советы

У меня нет опыта работы с Websphere, но одна распространенная проблема заключается в том, что вы пытаетесь манипулировать заголовком HTTP после того, как уже совершили отправку тела - как только веб-сервер начал доставлять контент, вы больше не можете обновлять заголовки, поскольку они уже отправлено.

Возможно, вам нужно просмотреть документацию и примеры.Например, я не понимаю, почему вы вызываете response.get*(), даже не глядя на результат.Вы уверены, что это необходимо, или это потому, что вы обрезали свой код?

Приветствия, Volker

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top