Извлечение параметров строки запроса и тела JSON из обернутого HTTP-запроса (с использованием ServletRequestWrapper) - PullRequest
0 голосов
/ 09 июня 2018

Отправка как строки запроса, так и тела JSON в HTTP-запросе Почта на сервер возможна, это то, что я уже понял.Для этого нам нужно переопределить методы getReader и getInputstream класса HttpServletRequestWrapper.Я сделал это, как изучено в этой ссылке .Видел похожие ответы и в Stack Overflow.

Так что сейчас у меня есть действие входа в систему, где нет тела, только параметры строки запроса, поступающие в post.В то время как я пытаюсь прочитать их, я получаю нулевое значение в качестве вывода для getParameter ().В моей оболочке я печатаю захваченное тело, и оно показывает правильные данные, полученные с клиентского компьютера.

Тривиальные методы чтения запроса String (getParameter()) и тела JSON (gson.fromJson), которыеиспользуется во время чтения из unWrapped HttpRequest может быть использован и для обернутого HTTP-запроса?Что мне здесь не хватает?

POST метод сервлета

protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

    System.out.println("from doPost");

    RequestWrapper wrappedrequest = new RequestWrapper(request);

    request = wrappedrequest;

    String action= request.getParameter("action");

    if(action.equals("update")) {
        Gson gson = new Gson();

        Order cart = gson.fromJson(request.getReader(), Order.class);
            CartDao dao= new CartDao(cart);

            dao.addData();

        }else if(action.equals("login")) {
            loginDao ld = new loginDao(request);
            int roleId = ld.authenticate();

            if(roleId!=-1) {

                System.out.println("Role ID Got is "+ roleId);
                HttpSession session = ld.loadSession(roleId);
                System.out.println("Init page for logging in user is = "+ session.getAttribute("initPage").toString());
                CartDao dao= new CartDao();
                JsonArray responseJson=  dao.getOrderList();

                request.setAttribute("ResponseJson", responseJson);

                RequestDispatcher rq = request.getRequestDispatcher(session.getAttribute("initPage").toString());
                rq.forward(request, response);


            }else {
                request.setAttribute("errmsg", "Invalid username/password");
                RequestDispatcher rq = request.getRequestDispatcher("login.jsp");
                rq.forward(request, response);
            }

        }else {

            System.out.println("No Action");
        }

}

RequestWrapper

public class RequestWrapper extends HttpServletRequestWrapper {

private String _body;

public RequestWrapper(HttpServletRequest request) throws IOException {
    super(request);
    _body = "";
    BufferedReader bufferedReader = request.getReader();           
    String line;
    while ((line = bufferedReader.readLine()) != null){
        _body += line; //when i print this it shows proper data got from client machine

    }
}

@Override
public ServletInputStream getInputStream() throws IOException {
    final ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(_body.getBytes());
    return new ServletInputStream() {
        public int read() throws IOException {
            return byteArrayInputStream.read();
        }

        @Override
        public boolean isFinished() {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public boolean isReady() {
            // TODO Auto-generated method stub
            return false;
        }

        @Override
        public void setReadListener(ReadListener arg0) {
            // TODO Auto-generated method stub

        }
    };
}

@Override
public BufferedReader getReader() throws IOException {
    return new BufferedReader(new InputStreamReader(this.getInputStream()));
}

1 Ответ

0 голосов
/ 09 июня 2018

Наконец-то взломал это сам.Все, что мне нужно было сделать, это прочитать строку запроса, сохранить ее на карте и вернуть значение, взяв ключ в переопределенном методе getParameter.и тело сохраняется путем чтения входного потока и возвращается при вызове переопределенного getReader.и это можно назвать любое количество раз.:) хотя это работает, было бы замечательно, если бы кто-то мог подробно объяснить, почему он работает.

Код звезды, который совершает магию, показан ниже,

public class RequestWrapper extends HttpServletRequestWrapper {



private String _body;
private String _queryString;

public RequestWrapper(HttpServletRequest request) throws IOException {
    super(request);
    _body = "";
    BufferedReader bufferedReader = request.getReader();           
    String line;
    while ((line = bufferedReader.readLine()) != null){
        _body += line;
    }

     _queryString = request.getQueryString();

     System.out.println(_body + _queryString);
}
}
...