【问题标题】:Retrieving Query String Parameters and JSON body from wrapped HTTP request (using ServletRequestWrapper)从包装的 HTTP 请求中检索查询字符串参数和 JSON 正文(使用 ServletRequestWrapper)
【发布时间】:2018-11-19 05:10:19
【问题描述】:

将 HTTP Post 请求中的查询字符串和 JSON 正文发送到服务器是可能的,这是我已经理解的。为此,我们需要重写 HttpServletRequestWrapper 类的 getReader 和 getInputstream 方法。我已经按照link 中的研究进行了此操作。在 Stack Overflow 中也看到了类似的答案。

所以现在我有一个没有正文的登录操作,只有查询字符串参数传入。当我尝试阅读它们时,它给了我 null 作为 getParameter() 的输出。在我的包装中,我打印了捕获的正文,它正确显示了从客户端机器接收到的正确数据。

读取未包装的 HttpRequest 时使用的查询字符串 (getParameter()) 和 JSON 正文 (gson.fromJson) 的简单方法也可以用于包装的 HTTP 请求吗?我在这里错过了什么?

servlet的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");
        }

}

请求包装器

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()));
}

【问题讨论】:

  • 终于自己找到了答案。更新答案

标签: java servlets wrapper servlet-filters


【解决方案1】:

终于自己破解了。我所要做的就是读取查询字符串并将其保存在地图中,然后通过获取 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);
}
}

【讨论】:

    猜你喜欢
    • 2016-07-09
    • 2021-03-18
    • 2014-09-06
    • 2021-07-02
    • 1970-01-01
    • 2020-12-02
    • 1970-01-01
    • 2012-02-07
    • 2020-03-01
    相关资源
    最近更新 更多