サーブレット--セッション管理
12478 ワード
デフォルトでは、1つのWebサーバは、1つのHTTP要求が1回目のアクセスであるか否かを区別することができない.
例えば、1つのWebメールアプリケーションは、ユーザがログイン後にメールを表示することを要求するため、ユーザが対応するユーザ名とパスワードを入力と、アプリケーションは、ユーザがログインする必要があることを再度提示すべきではなく、アプリケーションは、どのユーザがログインしたかを覚えなければならない.すなわち、アプリケーションは、ユーザのセッションを管理できる必要がある.
ここでは、URL書き換え、非表示ドメイン、cookies、HTTPSessionオブジェクトの4つの異なる状態保持技術について述べる.
URL書き換え
URL書き換えは、URLのクエリー文字列に1つ以上のtokenを追加するセッショントラッキング技術で、各tokenは通常key=value形式、例えばurl?key_1 = value_1&key_2 = value_2 ⋯ ⋯ .
注意、URLとtoken間は疑問符(?)隔てて、tokenの間には和記号(&)を使います.
URL書き換えはtokensに使用され、多くのURL間で伝達する必要はありませんが、以下の制限があります. URLは、あるブラウザ上で最大2000文字である. 次のリソースに値を渡すには、リンクに値を挿入する必要がある、言い換えれば、静的ページは値を伝えにくい. URLの書き換えはサービス側で行う必要があり、すべてのリンクには値が必要であるため、1ページで多くのリンクが存在する場合、処理プロセスは大きな課題となる. いくつかの文字、例えばスペース、および疑問符などはbase 64で符号化する必要がある. のすべての情報は可視であり、場合によっては不適切である.
このため、上記のような制限がある、URL書き換えは、情報がわずかなページ間でしか伝達されず、情報自体が非表示になるように適用される.
例:
ドメインの非表示
非表示ドメインを使用する保護状態は、URL書き換え技術と同様であるが、URLに値を付加するのではなく、HTMLフォームの非表示ドメインに配置される.フォームがコミットされると、非表示ドメインの値も同時にサーバ側にコミットされる.非表示ドメイン技術は、ウェブページにフォームがある場合にのみ有効である.この技術のURL書き換えに対する利点は、文字数の制限がなく、追加の符号化が不要であることである.しかし、この技術は、URLの書き換えと同様に、複数のインタフェースを跨ぐものではない.
Cookies
URLの書き換えおよび非表示ドメインは、あまり多くのページを越える必要のないメッセージを保存するのに適している.複数のページ間で情報を伝達する必要がある場合、上記の2つの技術は、各ページで対応する処理を行わなければならないため、コストが高い.幸いなことにCookiesテクノロジーは私たちを助けることができます.
Cookiesは、ブラウザとWebサーバとの間で自動的に対話可能な少ない情報セグメントであるため、cookiesは複数のページ間で伝達する情報を記憶することができる.CookieはHTTPヘッダの一部として、HTTPプロトコルによって伝送する.また、cookiesの有効時間を制御することができます.ブラウザは通常、各サイトに最大20個のcookiesをサポートする.
Cookiesの問題は、ユーザがブラウザの設定を変更することによってcookiesの受け入れを拒否できることである.
cookiesを使用するにはjavaxを熟知する必要があります.servlet.http.CookieクラスとHttpServertRequesetとHttpServertResponseの2つのインタフェース.
Cookieクラスのコンストラクション関数にnameとvalueの2つのパラメータを渡すことで、cookiesを作成できます.
Cookieオブジェクトを作成したら、domain、path、maxAgeのプロパティを設定できます.ここでmaxAge属性は、クッキーがいつ期限切れになるかを決定する.
クッキーをブラウザに送信するには、HttpServeretResponseのaddメソッドを呼び出す必要があります.
ブラウザは、統合Webブラウザにアクセスする際に、前に受け取ったクッキーを一括して送信する.
また、cookiesはクライアントのjavascriptスクリプトによって作成および削除することもできる.
サーバ側がブラウザから発行するクッキーを読み出すには、HttpServeretRequestインタフェースのgetCookiesメソッドでクッキー配列を返し、cookiesがなければnullを返す.次に、maxRecordsというクッキーをクエリーする例を示します.
現在、getCookieByNameのような方法はまだない.また、クッキーを削除する直接的な方法はありません.同じ名前のクッキーしか作成できません.maxAgeプロパティを0に設定し、HttpServeretResquestインタフェースに追加します.次のようになります.
HttpSessionオブジェクト
すべてのセッション追跡技術において、HttpSessionオブジェクトは最も強力で最も汎用的である.1人のユーザは、最大1つのHttpSessionを有するもよく、他のユーザにアクセスすることはない.
HttpSessionオブジェクトは、ユーザが初めてウェブサイトにアクセスするときに自動的に作成され、HttpServertRequestのgetSessionメソッドを呼び出すことでそのオブジェクトを取得することができる.getSessionには2つのリロード方法があります.
HttpSessionのsetAttributeメソッドでHttpSessionに値を入れることができます
URLの書き換え、ドメインやクッキーを非表示にする、HttpSessionに入れる値はメモリに格納されるので、HttpSessionにあまり多くのオブジェクトや大きなオブジェクトを入れないでください.現代のサーブレット容器は、メモリが足りないときにHttpSessionに保存するオブジェクトを二次記憶にダンプするが、性能に問題があるため、記憶に注意する.
また、HttpSessionの値を置くのは、Stringタイプに限らず、任意にjavaを実現することができる.io.Serializableのjavaオブジェクトは、もちろんシーケンス化をサポートしないオブジェクトをHttpSessionに入れることもできますが、これによりサーブレットコンテナビューのシーケンス化に失敗してエラーが発生します.
なお、HttpSessionに保存するすべてのデータはクライアントに送信されず、他のセッション管理技術とは異なり、サーブレットコンテナは、HttpSessionごとに一意の識別子を生成する、この識別子をサーバに送信したり、JEEIONIDというクッキーを作成したり、URLの後にjsessionidというパラメータを追加する.その後の要求では、ブラウザが識別をサーバに提出する、サーバは、その要求がどのユーザによって開始されたかを識別することができる.サーブレットコンテナは、セッションIDを渡す方法を自動的に選択する.
さらに、HttpSessionはinvalidateの方法を定義した.この方法は、セッションの期限切れを強制し、保存するオブジェクトを空にする.デフォルトでは、HttpSessionは、ユーザがアクティブになっていない時間後に自動的に期限切れになります.この時間は、デプロイメント記述子のsession-timeout要素で構成することができます.30に設定すると、ペイントオブジェクトはユーザの最後のアクセス30分後に期限切れになります.デプロイメント記述子に構成がない場合、この値はサーブレットコンテナの設定に依存します.ほとんどの場合、応答メモリを解放するために不要なHttpSessionを自発的に破棄すべきである.
HttpSessionのgetMaxInactiveIntervalメソッドを呼び出して、セッションがどのくらい期限切れになるかを確認できます.この方法は、秒単位の数値タイプを返す.setMaxInactiveIntervalメソッドを呼び出し、あるHttpSessionに対してそのタイムアウト時間を個別に設定.
例えば、1つのWebメールアプリケーションは、ユーザがログイン後にメールを表示することを要求するため、ユーザが対応するユーザ名とパスワードを入力と、アプリケーションは、ユーザがログインする必要があることを再度提示すべきではなく、アプリケーションは、どのユーザがログインしたかを覚えなければならない.すなわち、アプリケーションは、ユーザのセッションを管理できる必要がある.
ここでは、URL書き換え、非表示ドメイン、cookies、HTTPSessionオブジェクトの4つの異なる状態保持技術について述べる.
URL書き換え
URL書き換えは、URLのクエリー文字列に1つ以上のtokenを追加するセッショントラッキング技術で、各tokenは通常key=value形式、例えばurl?key_1 = value_1&key_2 = value_2 ⋯ ⋯ .
注意、URLとtoken間は疑問符(?)隔てて、tokenの間には和記号(&)を使います.
URL書き換えはtokensに使用され、多くのURL間で伝達する必要はありませんが、以下の制限があります.
このため、上記のような制限がある、URL書き換えは、情報がわずかなページ間でしか伝達されず、情報自体が非表示になるように適用される.
例:
import com.sun.deploy.net.HttpResponse;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.io.WriteAbortedException;
import java.util.ArrayList;
import java.util.List;
@WebServlet(name = "CityServletDemo",urlPatterns = "/c")
public class CityServletDemo extends HttpServlet {
private List londonList,parisList;
@Override
public void init() throws ServletException {
londonList = new ArrayList();
londonList.add("London Eye");
londonList.add("Big Ben");
londonList.add("Tower of London");
parisList = new ArrayList();
parisList.add("Eiffel Tower");
parisList.add("The Louvre");
parisList.add("Champs Elysees");
}
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String city = request.getParameter("city");
System.out.println(city);
try {
if(!city.isEmpty() &&(city.equals("London")||city .equals("Paris"))){
showCity(response,city);
}else{
showMain(response);
}
}catch (NullPointerException e){
showMain(response);
}
}
private void showMain(HttpServletResponse response) {
try {
response.setContentType("text/html;charset=utf-8");
PrintWriter writer = response.getWriter();
writer.print("
" +
"
" +
"
" +
"
" +
"
" +
"
" +
" Please select a city:
" +
"
" +
"
" +
"
" +
"");
writer.close();
} catch (IOException e) {
e.printStackTrace();
}finally {
}
}
private void showCity(HttpServletResponse response,String city) {
List list = null;
if (city.equals("London") ){
list = londonList;
}else{
list = parisList;
}
try {
PrintWriter writer = response.getWriter();
writer.print("
" +
"
" +
"
" +
"
" +
"
" +
"
" +
" Top 10 Tourist Attractions:
"
);
for (String s : list) {
writer.print(""
+s+"");
}
writer.print( "
" +
"
" +
"");
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
ドメインの非表示
非表示ドメインを使用する保護状態は、URL書き換え技術と同様であるが、URLに値を付加するのではなく、HTMLフォームの非表示ドメインに配置される.フォームがコミットされると、非表示ドメインの値も同時にサーバ側にコミットされる.非表示ドメイン技術は、ウェブページにフォームがある場合にのみ有効である.この技術のURL書き換えに対する利点は、文字数の制限がなく、追加の符号化が不要であることである.しかし、この技術は、URLの書き換えと同様に、複数のインタフェースを跨ぐものではない.
Cookies
URLの書き換えおよび非表示ドメインは、あまり多くのページを越える必要のないメッセージを保存するのに適している.複数のページ間で情報を伝達する必要がある場合、上記の2つの技術は、各ページで対応する処理を行わなければならないため、コストが高い.幸いなことにCookiesテクノロジーは私たちを助けることができます.
Cookiesは、ブラウザとWebサーバとの間で自動的に対話可能な少ない情報セグメントであるため、cookiesは複数のページ間で伝達する情報を記憶することができる.CookieはHTTPヘッダの一部として、HTTPプロトコルによって伝送する.また、cookiesの有効時間を制御することができます.ブラウザは通常、各サイトに最大20個のcookiesをサポートする.
Cookiesの問題は、ユーザがブラウザの設定を変更することによってcookiesの受け入れを拒否できることである.
cookiesを使用するにはjavaxを熟知する必要があります.servlet.http.CookieクラスとHttpServertRequesetとHttpServertResponseの2つのインタフェース.
Cookieクラスのコンストラクション関数にnameとvalueの2つのパラメータを渡すことで、cookiesを作成できます.
Cookie cookie = new Cookie(name,value);
Cookieオブジェクトを作成したら、domain、path、maxAgeのプロパティを設定できます.ここでmaxAge属性は、クッキーがいつ期限切れになるかを決定する.
クッキーをブラウザに送信するには、HttpServeretResponseのaddメソッドを呼び出す必要があります.
response.addCookie(cookie);
ブラウザは、統合Webブラウザにアクセスする際に、前に受け取ったクッキーを一括して送信する.
また、cookiesはクライアントのjavascriptスクリプトによって作成および削除することもできる.
サーバ側がブラウザから発行するクッキーを読み出すには、HttpServeretRequestインタフェースのgetCookiesメソッドでクッキー配列を返し、cookiesがなければnullを返す.次に、maxRecordsというクッキーをクエリーする例を示します.
Cookie maxRecordsCookie = null;
Cookie[] cookies = request.getCookies();
if (cookies != null){
for (Cookie cookie : cookies) {
if (cookie.getName().equals("maxRecords")){
maxRecordsCookie = cookie;
break;
}
}
}
現在、getCookieByNameのような方法はまだない.また、クッキーを削除する直接的な方法はありません.同じ名前のクッキーしか作成できません.maxAgeプロパティを0に設定し、HttpServeretResquestインタフェースに追加します.次のようになります.
Cookie cookie = new Cookie("name","");
cookie.setMaxAge(0);
response.addCookie(cookie);
HttpSessionオブジェクト
すべてのセッション追跡技術において、HttpSessionオブジェクトは最も強力で最も汎用的である.1人のユーザは、最大1つのHttpSessionを有するもよく、他のユーザにアクセスすることはない.
HttpSessionオブジェクトは、ユーザが初めてウェブサイトにアクセスするときに自動的に作成され、HttpServertRequestのgetSessionメソッドを呼び出すことでそのオブジェクトを取得することができる.getSessionには2つのリロード方法があります.
HttpSession getSession();// HttpSession, .
HttpSession getSession(boolean var1);//false: HttpSession, , null;true .
HttpSessionのsetAttributeメソッドでHttpSessionに値を入れることができます
void setAttribute(String var1, Object var2);// name
URLの書き換え、ドメインやクッキーを非表示にする、HttpSessionに入れる値はメモリに格納されるので、HttpSessionにあまり多くのオブジェクトや大きなオブジェクトを入れないでください.現代のサーブレット容器は、メモリが足りないときにHttpSessionに保存するオブジェクトを二次記憶にダンプするが、性能に問題があるため、記憶に注意する.
また、HttpSessionの値を置くのは、Stringタイプに限らず、任意にjavaを実現することができる.io.Serializableのjavaオブジェクトは、もちろんシーケンス化をサポートしないオブジェクトをHttpSessionに入れることもできますが、これによりサーブレットコンテナビューのシーケンス化に失敗してエラーが発生します.
void setAttribute(String var1, Object var2);// .
Enumeration getAttributeNames(); // HttpSession
なお、HttpSessionに保存するすべてのデータはクライアントに送信されず、他のセッション管理技術とは異なり、サーブレットコンテナは、HttpSessionごとに一意の識別子を生成する、この識別子をサーバに送信したり、JEEIONIDというクッキーを作成したり、URLの後にjsessionidというパラメータを追加する.その後の要求では、ブラウザが識別をサーバに提出する、サーバは、その要求がどのユーザによって開始されたかを識別することができる.サーブレットコンテナは、セッションIDを渡す方法を自動的に選択する.
String getId();// HttpSession getId
さらに、HttpSessionはinvalidateの方法を定義した.この方法は、セッションの期限切れを強制し、保存するオブジェクトを空にする.デフォルトでは、HttpSessionは、ユーザがアクティブになっていない時間後に自動的に期限切れになります.この時間は、デプロイメント記述子のsession-timeout要素で構成することができます.30に設定すると、ペイントオブジェクトはユーザの最後のアクセス30分後に期限切れになります.デプロイメント記述子に構成がない場合、この値はサーブレットコンテナの設定に依存します.ほとんどの場合、応答メモリを解放するために不要なHttpSessionを自発的に破棄すべきである.
HttpSessionのgetMaxInactiveIntervalメソッドを呼び出して、セッションがどのくらい期限切れになるかを確認できます.この方法は、秒単位の数値タイプを返す.setMaxInactiveIntervalメソッドを呼び出し、あるHttpSessionに対してそのタイムアウト時間を個別に設定.
void setMaxInactiveInterval(int var1); // var1=0, , HttpSession , Servlet .