访问x-www-form-urlencoded ServletRequest

时间:2017-09-18 18:40:02

标签: java servlets java-ee servlet-filters

当您尝试访问InputStream servlet请求的原始x-www-form-urlencoded时,该流可能已经通过先前访问参数而间接消耗(例如,通过ServletRequest#getParameterMap())请求。这个功能(错误?)已在the section SRV.3.1.1 of the Servlet spec中记录,并且other people也被{bit}咬伤了。

据我所知,这种间接流消耗使得InputStream无法反映InputStream,这正是我们在HRRS中想要实现的目标。因此,我尝试re-construct the InputStream from request parameters。你可以想象,这是一个非常讨厌的黑客,我也不喜欢它。此外,为了使事情变得更糟,当servlet将表单参数推送到请求参数映射时,它也将它们与查询参数合并。现在,您需要手动解析请求和查询参数以找出初始表单参数。完全沉船。

有关如何用适当的解决方案替换此黑客的任何想法?

编辑 亲爱的SO Java徽章所有者,这不是一个重复的问题。在将帖子标记为重复之前,请参阅Tomcat错误报告。 即使HRRS是列表中的第一个过滤器,它也不会消耗InputStream,它只是包裹getParameter()并沿着链路传递包装的请求。问题是,Tomcat中的InputStream次调用是使用o.a.c.connector.Request#getStream()的内部引用(即javax.servlet.ServletRequest#getInputStream())而不是InputStream。因此,o.a.c.connector.Request#readPostBody()被间接消费,而根本没有使用被包裹的。 (有关详细信息,请参阅<%@ page isELIgnored="false"%> <%@ taglib uri="http://www.springframework.org/tags/form" prefix="form"%> <%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1"> <title> viewTargetGroupList</title> </head> <body> <%@include file="content.jsp" %> <form:form commandName="targetGroupList" method="post" action="/segmentation-of-customers/viewOneTargetGroup"> <c:if test = "${not empty targetGroupList }"> <table border="1"> <tr> <th>TARGET GROUP ID</th> <th>TARGET GROUP NAME</th> <th>VIEW</th> </tr> <c:forEach items="${targetGroupList}" var="targetGroupList"> <tr> <td> ${targetGroupList.targetGroupId}</td> <td> ${targetGroupList.targetGroupName}</td> <a href="/segmentation-of-customers/viewOneTargetGroup"> View</a> </tr> </c:forEach> </table> </c:if> <input type="submit" name="Submit" value="VIEW TARGET GROUP"></input> </form:form> </body> </html> 源代码。)

1 个答案:

答案 0 :(得分:0)

我不认为在所有情况下都可以完全重新创建原始请求。例如,请求参数的顺序将丢失。

对于这样的工具,我认为期望成为最外层的过滤器是完全可以接受的。这样你就不应该首先遇到问题。但也许我错过了什么?