【发布时间】:2015-02-02 03:01:20
【问题描述】:
我很困惑 HttpServletRequest.getParameter 有时会返回 null,而我确实将参数包含在我的请求中。
下面的测试程序:
HelloServlet.java:
public class HelloServlet extends HttpServlet {
private static Executor logExecutor = Executors.newFixedThreadPool(5);
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
logExecutor.execute(new Task(req));
}
}
class Task implements Runnable {
private HttpServletRequest req;
public Task(HttpServletRequest req) {
this.req = req;
}
@Override
public void run() {
System.out.println(String.format("a=%s b=%s c=%s",
req.getParameter("a"), req.getParameter("b"),
req.getParameter("c")));
}
}
将此 servlet 映射到 web.xml 中的 /hello
在 tomcat 或 jetty 中启动 servlet,使用 shell 脚本启动请求:
#/bin/sh
for i in {1..100}
do
curl -i -X GET "http://localhost:8080/hello?a=a&b=b&c=c"
done
服务器日志显示某些请求中的某些参数可能为空,并且这种情况的发生没有规律的模式。如:
a=a b=b c=c
a=a b=b c=c
a=null b=null c=null
a=null b=null c=null
a=null b=null c=null
a=null b=b c=c
a=null b=null c=c
a=a b=b c=c
a=a b=b c=c
a=a b=b c=c
a=a b=b c=c
a=null b=null c=null
a=a b=b c=c
a=null b=b c=c
我发现原因是我无法为我的 Executor 保存 HttpServletRequest 实例。 所以我想知道原因!为什么我在一个请求中持有 HttpServletRequest 实例的操作可能会影响其他请求。
【问题讨论】: