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 を参照します。本当に必要ですか (パラメーターを提供していませんが)?