当前位置: 首页 > 知识库问答 >
问题:

POST参数为空,但存在于正文中

景唯
2023-03-14

我有一个应用程序,在本地工作很好,但在客户端,它崩溃,因为一个POST参数是NULL。

((HttpServletRequest)request).getParameter("dtid");

此返回为NULL。

因此,我添加了一个过滤器来记录请求的get/post/body。在本地,日志如下所示:

[方法:post][请求URI://peps/zkau][请求参数:{dtid=z_0n8,uuid_0=x38pz,data_0={“pagex”:372,“pagey”:103,“which”:1,“x”:40.79998779296875,“y”:4},cmd_0=onclick}][请求正文:][远程地址:0:0:0:0:0:0:0:0:0:0:1]

我在请求param中有dtid,主体是空的。在客户端上,相同的日志如下所示:

[方法:post][请求URI://peps/zkau][请求参数:{}][requestbody:dtid=z_cb50&cmd_0=onopen&uuid_0=l2st30&data_0=%7b%22open d&cmd_2=onopen&uuid_2=l2st30&data_2=%7b%22open%22%3afalse%7d][远程地址:x.x.x.x]

参数是一个空映射,但主体是满的。尸体似乎没有经过处理,是什么原因造成的?为什么不解析主体并将其注入参数映射中?

谢谢

下面是我的过滤器:

public class PepsParamFilter implements Filter {

    private static final Logger LOG = Logger.getLogger(PepsParamFilter.class.getName());

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        try {
            HttpServletRequest httpServletRequest = (HttpServletRequest) request;

            Map<String, String> requestMap = this.getTypesafeRequestMap(httpServletRequest);
            BufferedRequestWrapper bufferedReqest = new BufferedRequestWrapper(httpServletRequest);            

            chain.doFilter(bufferedReqest, response);

             //Request
                final StringBuilder reqMessage = new StringBuilder("").append("[METHOD:")
                        .append(httpServletRequest.getMethod())                        
                        .append("] [REQUEST URI:")
                        .append(httpServletRequest.getRequestURI())                        
                        .append("] [REQUEST PARAMETERS:").append(requestMap)
                        .append("] [REQUEST BODY:")
                        .append(bufferedReqest.getRequestBody())
                        .append("] [REMOTE ADDRESS:")
                        .append(httpServletRequest.getRemoteAddr()).append("]");
                if(!httpServletRequest.getRequestURI().endsWith(".gif")
                    && !httpServletRequest.getRequestURI().endsWith(".png")
                    && !httpServletRequest.getRequestURI().endsWith(".css")
                    ) {
                    LOG.info(reqMessage);
                }



        } catch (Throwable a) {
            LOG.error(a.getMessage(),a);
        }
    }

    private Map<String, String> getTypesafeRequestMap(HttpServletRequest request) {
        Map<String, String> typesafeRequestMap = new HashMap<String, String>();
        Enumeration<?> requestParamNames = request.getParameterNames();
        while (requestParamNames.hasMoreElements()) {
            String requestParamName = (String) requestParamNames.nextElement();
            String requestParamValue = request.getParameter(requestParamName);
            typesafeRequestMap.put(requestParamName, requestParamValue);
        }
        return typesafeRequestMap;
    }

    @Override
    public void destroy() {
    }

    private static final class BufferedRequestWrapper extends
            HttpServletRequestWrapper {

        private ByteArrayInputStream bais = null;
        private ByteArrayOutputStream baos = null;
        private BufferedServletInputStream bsis = null;
        private byte[] buffer = null;

        public BufferedRequestWrapper(HttpServletRequest req)
                throws IOException {
            super(req);
            // Read InputStream and store its content in a buffer.
            InputStream is = req.getInputStream();
            this.baos = new ByteArrayOutputStream();
            byte buf[] = new byte[1024];
            int letti;
            while ((letti = is.read(buf)) > 0) {
                this.baos.write(buf, 0, letti);
            }
            this.buffer = this.baos.toByteArray();
        }

        @Override
        public ServletInputStream getInputStream() {
            this.bais = new ByteArrayInputStream(this.buffer);
            this.bsis = new BufferedServletInputStream(this.bais);

            return this.bsis;
        }

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

        String getRequestBody() throws IOException {
            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    this.getInputStream()));
            String line = null;
            StringBuilder inputBuffer = new StringBuilder();
            do {
                line = reader.readLine();
                if (null != line) {
                    inputBuffer.append(line.trim());
                }
            } while (line != null);
            reader.close();
            return inputBuffer.toString().trim();
        }

    }

    private static final class BufferedServletInputStream extends
            ServletInputStream {

        private ByteArrayInputStream bais;

        public BufferedServletInputStream(ByteArrayInputStream bais) {
            this.bais = bais;
        }

        @Override
        public int available() {
            return this.bais.available();
        }

        @Override
        public int read() {
            return this.bais.read();
        }

        @Override
        public int read(byte[] buf, int off, int len) {
            return this.bais.read(buf, off, len);
        }

    }

    public class TeeServletOutputStream extends ServletOutputStream {

        private final TeeOutputStream targetStream;

        public TeeServletOutputStream(OutputStream one, OutputStream two) {
            targetStream = new TeeOutputStream(one, two);
        }

        @Override
        public void write(int arg0) throws IOException {
            this.targetStream.write(arg0);
        }

        public void flush() throws IOException {
            super.flush();
            this.targetStream.flush();
        }

        public void close() throws IOException {
            super.close();
            this.targetStream.close();
        }
    }


}

共有1个答案

袁秦迟
2023-03-14

Servlet-spec的3.1.1节指出:

3.1.1参数可用时

将post表单数据填充到参数集之前,必须满足以下条件:

    null

本质上,这两种状态都是有效的,这取决于您之前的请求发生了什么。

首先要检查的是浏览器是否发送了相同的请求(/body)和头。例如。在浏览器的开发人员工具中。如果它们是相同的,请检查web.xml中的其他筛选器(例如,本地开发环境和生产环境中的安全筛选器通常是不同的)。

 类似资料:
  • 当我向azure功能发送请求时,我收到以下异常: 内部异常系统。系统上已处理NullReferenceException。运行时。例外服务。例外DispatchInfo。投掷:在AlidaDutilities。OnUnzipHttpTriggered d__0。MoveNext(AlidaDutilities,版本=1.0.0.0,区域性=neutral,PublicKeyToken=NullAl

  • 问题内容: 我正在使用Jersey开发RESTful服务,并且与GET方法配合使用效果很好。但是我不能使其与POST方法和JSON或文本参数一起使用。这些是我所做的: 我只为所有参数获取空值。我试图只使用一个字符串作为参数,但是它也不起作用……我试图从IOS访问这些方法,也许这就是问题之一。但是我一直在嗅探我的局域网,并且可以在数据包主体中看到正确的参数……这正确吗? 我已经从XCode发送了如下

  • 我必须实现一个Vertx POST请求。通过Postman,请求如下图所示: 棘手的是,服务器需要主体的密钥“upgrade\u file”。我找不到如何使用Vertx实现这一点。这就是我目前的情况: 如何将“upgrade_file”设置为身体的关键?

  • 我在向控制器发出的web api rest post请求中始终收到一个空值 在我的控制器中 模型 请求: 我尝试了以下解决方案,但没有任何效果 https://myadventuresincoding.wordpress.com/2012/06/19/c-supporting-textplain-in-an-mvc-4-rc-web-api-application/ 如何在WebAPI中获取POS

  • 我有个奇怪的问题。我想更多的是语义上的。 无论如何。我有一个表单,可以在DB中添加2个id-s,将n个问题与n个调查连接在一个名为“问题对调查”的表格中。我有一个值,我将其发布到另一个URL,但每次发布都是空的,而给定的值不是空的(URL末尾的连接)。 控制器存储方法(我对web应用非常熟悉): 视图中的调用(我已经测试了每个变量,它们都不是null。我在Post需要的价值是$问题- 后通过dd(