tomcatでのクッキーの設定とjspでのセッションの設定
3187 ワード
インターネットアプリケーションを開発する際には、サービス側とクライアントのステータス効果を達成するために、クライアントをマークするsessionidが必要であることはよく知られています.多くの場合、これはクライアントでセッションクッキーを防止することによって実現される.しかし、クライアントがクッキーを無効にしたら?これはurlrewriteまたは他の方法で実現する必要があります.そこで私たちはアプリケーションにクッキーを必要としないかもしれません.必要ない以上、もちろん私たちのアプリケーションがクッキーを処理しないことを望んでいます.残念なことに、tomcatのデフォルトはクッキーを処理しています.リクエストが来るたびにrequest headのクッキー情報を解析し、sessionidの情報を見つけようとします.そこで、アプリケーションサーバのレベルからこの「無駄」を取り除く必要があります.
tomcat(tomcat 6のソースコードを読んでいます)は、設定によって実現できます.
conf/context.xml内:ソースレベルでの実装はCoyoteAdapterで行われます.
ここではcontextがクッキーを無効にした場合、解析をしないと判断しました.クッキーを使うなら、クッキーから解析してみましょう
sessionidは、存在する場合はrequestの既存の(urlから解析された)またはまだ存在しないsesssionidを上書きする.
このメソッドのエントリはCoyoteAdapterのサービスメソッドの中にあり、このメソッドはtomcat 6のcomponentチェーンに沿ってrequestとresponseを処理し、構造図は以下の通りである.
service--------->EngineValue
|
HostValue
|
ContextValue
|
WrapperValue
これは実際にchain of resposibilityモデルであり、requestとresponseのそれぞれの職責範囲内の包装と処理を担当している.
最後のWrapperValueはservlet処理要求を呼び出すステップを実行する.
はい、クッキーの処理を簡単に説明しましたが、次はsessionです.
どんな方法であれ、クッキーであれurlrewriteであれ、セッションは必要なときに必ず発生する.
しかし、もし私たちが必要としないなら?例えば、お客様に示すトップページがjspであり、お客様はログインする必要がなく、このページの内容を閲覧することができます.
では、このときお客様のリクエストに対してセッションを作成する必要はありません.
一般的なセッションを作成しない方法は、jspページのヘッダーに次の文を追加することです.
<%@ page session=”false”>
これでこのページをリクエストするときにセッションは発生しません.
これはtomcat内部でどのように実現されていますか?
まず、jspは本質的にhttpservletであり、/tomcat/workディレクトリの下には、自分のアプリケーションと同じディレクトリ構造のファイルがあり、その中のjspファイルがclassファイルになっていることがわかります.これは実際にjspcompilerによってコンパイルされています.WrapperValueは最終的に呼び出されます
servletはrequestを処理します.興味のある方はフォローしてみてください.jsp対応のservlet(Jspservlet)を呼び出す(これはtomcat/conf/web.xmlで構成されています..jspでは、対応するservletはjspservletです)と、最終的には
tomcatは、PageContextインタフェースのjsp specification固有の実装クラスであるPageContextImplを実装する.
このクラスのinitializeには次のような言葉があります.
この意味は、sessionがsessionを取得し、sessionが新しいものを作成していないということです.通常、この場所もクライアントがtomcatの下のアプリケーションとインタラクティブになるとsessionを生成するエントリです.
この文のneedsSessionは前述のjspページで構成された値で、デフォルトはtrueです.したがって、あるページにアクセスするときにセッションを生成しないにはfalseに設定するだけでよい.
tomcat(tomcat 6のソースコードを読んでいます)は、設定によって実現できます.
conf/context.xml内:
protected void parseSessionCookiesId(org.apache.coyote.Request req, Request request) {
// If session tracking via cookies has been disabled for the current
// context, don't go looking for a session ID in a cookie as a cookie
// from a parent context with a session ID may be present which would
// overwrite the valid session ID encoded in the URL
Context context = (Context) request.getMappingData().context;
if (context != null && !context.getCookies())
return;
ここではcontextがクッキーを無効にした場合、解析をしないと判断しました.クッキーを使うなら、クッキーから解析してみましょう
sessionidは、存在する場合はrequestの既存の(urlから解析された)またはまだ存在しないsesssionidを上書きする.
このメソッドのエントリはCoyoteAdapterのサービスメソッドの中にあり、このメソッドはtomcat 6のcomponentチェーンに沿ってrequestとresponseを処理し、構造図は以下の通りである.
service--------->EngineValue
|
HostValue
|
ContextValue
|
WrapperValue
これは実際にchain of resposibilityモデルであり、requestとresponseのそれぞれの職責範囲内の包装と処理を担当している.
最後のWrapperValueはservlet処理要求を呼び出すステップを実行する.
はい、クッキーの処理を簡単に説明しましたが、次はsessionです.
どんな方法であれ、クッキーであれurlrewriteであれ、セッションは必要なときに必ず発生する.
しかし、もし私たちが必要としないなら?例えば、お客様に示すトップページがjspであり、お客様はログインする必要がなく、このページの内容を閲覧することができます.
では、このときお客様のリクエストに対してセッションを作成する必要はありません.
一般的なセッションを作成しない方法は、jspページのヘッダーに次の文を追加することです.
<%@ page session=”false”>
これでこのページをリクエストするときにセッションは発生しません.
これはtomcat内部でどのように実現されていますか?
まず、jspは本質的にhttpservletであり、/tomcat/workディレクトリの下には、自分のアプリケーションと同じディレクトリ構造のファイルがあり、その中のjspファイルがclassファイルになっていることがわかります.これは実際にjspcompilerによってコンパイルされています.WrapperValueは最終的に呼び出されます
servletはrequestを処理します.興味のある方はフォローしてみてください.jsp対応のservlet(Jspservlet)を呼び出す(これはtomcat/conf/web.xmlで構成されています..jspでは、対応するservletはjspservletです)と、最終的には
tomcatは、PageContextインタフェースのjsp specification固有の実装クラスであるPageContextImplを実装する.
このクラスのinitializeには次のような言葉があります.
if (request instanceof HttpServletRequest && needsSession)
this.session = ((HttpServletRequest) request).getSession();
この意味は、sessionがsessionを取得し、sessionが新しいものを作成していないということです.通常、この場所もクライアントがtomcatの下のアプリケーションとインタラクティブになるとsessionを生成するエントリです.
この文のneedsSessionは前述のjspページで構成された値で、デフォルトはtrueです.したがって、あるページにアクセスするときにセッションを生成しないにはfalseに設定するだけでよい.