0

我正在使用 jQuery 发送 POST 请求:

$.post(
'test',
{ foo: 'bar'}
);

我有一个简单的 servlet 来处理它:

@WebServlet("/test")
public class TestServlet extends HttpServlet {

  @Override
  protected void doPost(HttpServletRequest req, HttpServletResponse resp)
          throws ServletException, IOException {
      Map<String, String[]> parameterMap = req.getParameterMap();
  }

}

但是 servlet 中的 requestMap 原来是空的。我究竟做错了什么?

编辑:忘了提到我从 JSF Facelet 页面调用这个脚本。不要问我为什么要手动发出 Ajax 请求,以及为什么要使用 servlet 来处理它们。说来话长。我知道这不是 JSF 的方式。

在@BalusC 回答之后,我尝试添加这样的 servlet 过滤器:

@WebFilter(urlPatterns="/test")
public class TestFilter implements Filter {
    @Override
    public void destroy() { }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        Map<String, String[]> parameterMap = request.getParameterMap();
        chain.doFilter(request, response);
    }

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

它奏效了!我不仅能够获得过滤器中的参数,而且还可以在 servlet 中访问它们!那么,有人能解释一下这是什么魔法吗?

4

1 回答 1

0

如果请求-响应链中的某些代码已调用request.getReader()request.getInputStream()事先调用,则参数映射将为空。HTTP 请求正文只能被读取和解析一次(客户端不会根据服务器的需要多次重新发送它)。检查所有过滤器。

于 2012-04-15T13:04:07.353 回答