visszaállítására HttpRequest hívása után request.getReader ()

szavazat
13

Van egy módja annak, hogy hívja a getReader()módszer egy HttpRequest, majd a „reset” a kérést, így a többi hívások getReader()nem dobja java.lang.IllegalStateException?

A kérdést 12/06/2011 13:24
a forrás felhasználó
Más nyelveken...                            


2 válasz

szavazat
11

Az egyszerű válasz „Nem”.

Az adatfolyam nem nullázható és nincs API módszer, amely lehetővé teszi, hogy nyissa meg újra. (És jó okkal. Tenné szükségessé a servlet infrastruktúra tartani egy másolatot az input csak abban az esetben a servlet úgy döntött, hogy újra megnyitja a patak. Ez lenne az indokolatlan költségeket.)

Ha azt szeretnénk, hogy ezt a fajta dolog, akkor meg kell írni a kódot, hogy a saját példányát az adatok. Ha végrehajtja ezt a Filter (vagy Tomcat Valve), akkor létrehozhat egy HttpServletRequestWrapperelrejteni azt a tényt, hogy már olvasni az adatokat .... ahogy azt @Vineet.

Válaszolt 12/06/2011 13:55
a forrás felhasználó

szavazat
12

Mint a többi ember azt mondta, nem én nem hiszem, hogy van egy módja annak, hogy állítsa vissza a kérést.

Én már az azonos helyzetben akarnak bejelentkezni a kérelem tartalmának egy ServletFilter mielőtt. Itt van egy hozzászólásra , ami segített kitalálni, hogyan lehet létrehozni egy HttpServletRequestWrapperhasonló Stephen C beszélt. Amely tárolja az adatokat, így hívja getReader()és getInputStream()többször.

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.io.InputStreamReader;

import javax.servlet.ServletInputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class MyRequestWrapper extends HttpServletRequestWrapper {

    private HttpServletRequest original;
    private byte[] reqBytes;
    private boolean firstTime = true;

    public MyRequestWrapper(HttpServletRequest request) {
        super(request);
        original = request;
    }

    @Override
    public BufferedReader getReader() throws IOException{

        if(firstTime)
            firstTime();

        InputStreamReader isr = new InputStreamReader(new ByteArrayInputStream(reqBytes));
        return new BufferedReader(isr);
    }

    @Override
    public ServletInputStream getInputStream() throws IOException {

        if(firstTime)
            firstTime();

        ServletInputStream sis = new ServletInputStream() {
            private int i;

            @Override
            public int read() throws IOException {
                byte b;
                if(reqBytes.length > i)
                    b = reqBytes[i++];
                else
                    b = -1;

                return b;
            }
        };

        return sis;
    }

    private void firstTime() throws IOException{
        firstTime = false;
        StringBuffer buffer = new StringBuffer();
        BufferedReader reader = original.getReader();
        String line;
        while((line = reader.readLine()) != null){
            buffer.append(line);
        }
        reqBytes = buffer.toString().getBytes();
    }
}
Válaszolt 12/06/2011 14:12
a forrás felhasználó

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more