我正在使用 tuckey URLRewrite 过滤器,其规则之一如下:
<rule>
<name> Proxy URL with jession ID's </name>
<note>
</note>
<condition type="parameter" name="ParamName">[\p{ASCII}]+</condition>
<from>^/([^?]*)\.htm(.*)$</from>
<to type="proxy">%{request-url};jsessionid=%{parameter:ParamName}$2</to>
</rule>
当我将 enctype="multipart/form-data"
添加到我的表单(使用 POST 方法 btw)时,问题就出现了。过滤器无法重写 url。
有什么办法可以解决这个问题吗?
最佳答案
如果您可以更改应用程序的源代码,您可以对其进行修改,以便您可以使用提取 JSESSIONID 的“参数”方法。默认情况下(至少在 Tomcat 上)JSESSIONID 不会在表单发布中传递,但您可以修改表单以包含它。例如,JSP 页面可能如下所示:
<form action="index.jsp" method="post">
<input type="hidden" name="JSESSIONID" value="${pageContext.session.id}"/>
<input type="submit"/>
</form>
或者,您可以尝试使用不同的条件从 session cookie 中获取 JSESSIONID。我没有尝试过以下方法,但想象一下类似的方法对您有用:
<rule>
<name>Proxy URL with jsession ID's</name>
<note></note>
<condition type="cookie" name="JSESSIONID"/>
<from>^/([^?]*)\.htm(.*)$</from>
<to type="proxy">%{request-url};jsessionid=%{cookie:JSESSIONID}$2</to>
</rule>
您还可以使用其他条件来检查 session ID 是否有效 (requested-session-id-valid),是否源自 cookie (requested-session-id-来自 cookie)或源自发布操作的 URL(requested-session-id-from-url)。
我不确定您使用的是哪个版本的 UrlRewriteFilter,但是如果您查看以下 URL 中的“永久重定向包含 jsessionid 的传入 URL。”示例,您会发现 JSESSIONID 不是像其他 POST/GET 参数一样的参数。
http://urlrewritefilter.googlecode.com/svn/trunk/src/doc/manual/3.2/guide.html
我强烈建议您同时使用 Firefox/Firebug 来检查您的 POST 请求和 header ,这样您就可以准确了解传递的内容。 (我敢肯定还有其他类似的工具也可以执行此操作,例如 Fiddler 2 等)。
关于java - URLRewrite 过滤器不适用于多部分表单,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7846063/