0

URL 書き換えまたは Cookie を使用して、Web サーバーとブラウザー間でセッションを維持します。これらは本質的にステートレスな HTTP プロトコルを使用して通信するためです。ステートレスな性質のため、サーバーは、以前にリクエストを行ったかどうかに関係なく、クライアント (ブラウザー) を認識しません。したがって、それらの間で一意の識別子を維持する必要があります。

ブラウザー (クライアント) が Cookie をサポートしていない場合、またはブラウザーで Cookie が無効になっている場合は、URL 書き換えと呼ばれる手法が使用され、次sessionIDのように URL にエンコードする必要があります。

try
{
    response.sendRedirect(response.encodeRedirectURL("index.jsp?param=value"));
}
catch(Exception e)
{

}

JSP の通常のリンクをリグレードして、JSTL の<c:url>タグを次のように使用します。

<c:url value="Category.htm" var="url">
    <c:param name="id" value="${row.category.catId}"/>
</c:url>

<a href="${url}" 
   name="catId${row.category.catId}" 
   title="Click to view the details.">${row.category.catName}
</a>

<c:forEach>ループ内に埋め込まれています。

ただし、ブラウザが Cookie をサポートしているか、セッション トラッキングがオフになっている場合、URL エンコードは不要であり、行われません。

その場合、URI またはクエリに+, &,などの特殊文字が含まれているとどうなり@ますか?

それらはエンコードする必要があり、URI とクエリ文字列が別々にエンコードさURL rewritingれている場合、Cookie が無効になっているか、ブラウザーでサポートされていない場合に自動的に行われますか?

URI uri = new URI(
                  "http", 
                  null, 
                  request.getServerName(), 
                  request.getServerPort(), "/WebApp/index.jsp", 
                  "param="+URLEncoder.encode("some value@+", "UTF-8"), null);

String uriString = uri.toASCIIString();

この場合、取得中にパラメータparamをデコードする必要があります。

out.println(URLDecoder.decode(request.getParameter("param"), "UTF-8")");

この場合の URL の書き換えはどうでしょうか。それがサーブレット コンテナーによって行われるのか、独自に個別に処理されるのかはわかりません。


RequestDispatcherもう 1 つ、 、 、<jsp:forward page="index.jsp"/>およびを使用しているとき<jsp:include page="template.jsp"/>に、URL エンコードのように処理する必要がありますか?

try
{
    RequestDispatcher requestDispatcher=
    request.getRequestDispatcher(response.encodeURL("index.jsp?param=value"));

    requestDispatcher.forward(request, response);
}
catch(Exception e)
{

}

そして、私は常に<c:url>(Springに関して)のようなフォームのアクション属性で使用します。

<c:url value="${param.url}" var="url">
    <c:param name="id" value="${param.id}"/>
</c:url>

<form:form action="${url}" id="dataForm" name="dataForm" method="post" commandName="someBean">
    .

    .

    .
</form:form>

現在の URL を参照します。本当に必要ですか (パラメーターを提供していませんが)?

4

1 に答える 1

0

最後の質問については、Spring 3.0.5 での経験から、 form:form の action 属性を省略できることがわかります。現在の URL を使用し、Cookie が使用されていない場合にセッション ID パラメーターを追加します。

これに関連して、 <form:form action="<c:url value="foo"/>" ... のような短い構文を使用することは可能ですか? タグをこのようにネストできないため、この正確な構文は機能しません。余分な変数の使用は、私の好みでは少し長すぎます。

于 2013-06-14T15:11:05.020 に答える