当您尝试访问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>
源代码。)
答案 0 :(得分:0)
我不认为在所有情况下都可以完全重新创建原始请求。例如,请求参数的顺序将丢失。
对于这样的工具,我认为期望成为最外层的过滤器是完全可以接受的。这样你就不应该首先遇到问题。但也许我错过了什么?