URLRewrite过滤器不使用多部分表单

Woj*_*zyk 5 java forms multipart url-rewriting tuckey-urlrewrite-filter

我正在使用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>
Run Code Online (Sandbox Code Playgroud)

一旦我添加enctype="multipart/form-data"到我的表单(使用POST方法顺便说一句),问题就出现了.过滤器无法重写URL.

任何想法如何解决这个问题?

Mar*_*ren 1

如果您可以更改应用程序的源,则可以对其进行修改,以便可以使用提取 JSESSIONID 的“参数”方法。默认情况下(至少在 Tomcat 上),JSESSIONID 不会在表单发布中传递,但您可以修改表单以包含它。例如,JSP 页面可能如下所示:

<form action="index.jsp" method="post">
    <input type="hidden" name="JSESSIONID" value="${pageContext.session.id}"/>
    <input type="submit"/>
</form>
Run Code Online (Sandbox Code Playgroud)

或者,您可以尝试使用不同的条件从会话 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>
Run Code Online (Sandbox Code Playgroud)

您还可以使用其他条件来检查会话 ID 是否有效 ( requested-session-id-valid )、是否源自 cookie ( requested-session-id-from-cookie ) 或源自 post 操作的 URL (请求的会话 ID 来自 url)。

我不确定您使用的是哪个版本的 UrlRewriteFilter,但是如果您查看以下 URL 中的“永久重定向包含 jsessionid 的传入 URL。 ”示例,您将看到 JSESSIONID 不是像其他 POST/GET 参数那样的参数。

http://urlrewritefilter.googlecode.com/svn/trunk/src/doc/manual/3.2/guide.html

我强烈建议您同时使用 Firefox/Firebug 来检查您的 POST 请求和标头,以便您准确了解正在传递的内容。(我确信还有其他类似的工具也可以做到这一点,Fiddler 2 等)。