図3は、実施形態のWebアプリケーション提供方法の概要を説明する図である。ここでは、クライアント1とWebサーバ30との間に中継サーバ10が配置されている。なお、クライアント1は、Webブラウザを備えている。また、Webサーバ30は、クライアント1のアクセス先である目的サーバであり、WebアプリケーションまたはWebページを提供する。
クライアント1は、ネットワークを介して中継サーバ10に接続される。このネットワークは、例えばLANである。ただし、クライアント1は、他の形態のネットワークで中継サーバ10に接続するようにしてもよい。また、中継サーバ10およびWebサーバ30は、ネットワークを介して接続される。このネットワークは、例えばインターネットである。ただし、中継サーバ10およびWebサーバ30は、他の形態のネットワークで互いに接続してもよい。なお、クライアント1と中継サーバ10との間の回線、および中継サーバ10とWebサーバ30との間の回線は、無線リンクで実現してもよいし、有線リンクで実現してもよいし、無線リンクおよび有線リンクが混在してもよい。
クライアント1は、ユーザの指示を受け付けるためのユーザインタフェースを備える。また、クライアント1は、ネットワーク上のWebページを閲覧するWebブラウザを備える。Webページは、Web上にある文書であり、例えば、HTML文書、スタイルシート、画像データ等を含んでいる。そして、クライアント1は、ユーザにより指定される目的サーバにリクエストを送信することにより、対応するWebアプリケーションのWebページを受け取る。すなわち、ユーザは、クライアント1に実装されているWebブラウザを通して、Webアプリケーションを利用することができる。
上記構成のネットワークシステムにおいて、ユーザは、まず、クライアント1のWebブラウザを利用して、Webサーバ30にアクセスするためのリクエストを中継サーバ10へ送信する。中継サーバ10は、クライアント1から受信したリクエストのリクエストヘッダに置換情報を追加する。置換情報は、Webサーバ30が提供するWebページ中に設定されているURLへのアクセスが中継サーバ10を経由するようにそのURLを書き換えるための指示を含んでいる。そして、中継サーバ10は、置換情報が追加されたリクエストをWebサーバ30へ送信する。
リクエストを受信したWebサーバ30は、リクエストヘッダに置換情報が含まれているか否かをチェックする。そして、リクエストヘッダが置換情報を含んでいるときは、Webサーバ30は、その置換情報を保持しておく。また、Webサーバ30は、受信したリクエストに従って対応するWebページを生成する。このWebページがリンクを含む場合、Webサーバ30は、そのリンク先を表すURLを生成してWebページに埋め込む。このとき、Webサーバ30は、中継サーバ10により追加された置換情報に基づいて、リンク先へのアクセスが中継サーバ10を経由するようにURLを生成する。一実施例としては、Webサーバ30は、リンク先を直接的に指し示すURLを、置換情報に基づいて、中継サーバ10を経由してリンク先にアクセスするためのURLに書き換える。以下、この書き換え処理を「エンコード」と呼ぶことがある。さらに、Webサーバ30は、上述のリクエストに対するWebページを含むリプライに、URLのエンコードを実行したことを表す完了報告情報を追加する。このとき、完了報告情報は、例えば、リプライヘッダに追加される。そして、Webサーバ30は、中継サーバ10へリプライを送信する。
中継サーバ10は、Webサーバ30からリプライを受信すると、リプライヘッダが完了報告情報を含んでいるか否かをチェックする。そして、リプライが完了報告情報を含むときは、中継サーバ10は、リプライとして提供されるWebページにリンク先として埋め込まれているURLを書き換える処理を実行しない。一方、リプライが完了報告情報を含んでいなければ、中継サーバ10は、Webページに埋め込まれているURLを、リンク先へのアクセスが中継サーバ10を経由するURLに書き換える。そして、中継サーバ10は、必要に応じてそのリプライに対してサービスを付加した後、そのリプライをクライアント1へ送信する。
クライアント1のWebブラウザは、上述のようにしてWebサーバ30から中継サーバ10を経由して送信されるWebページを表示する。このとき、Webページに埋め込まれているURLは、Webサーバ30(または、中継サーバ10)において、中継サーバ10を経由してリンク先にアクセスが行われるようにエンコードされている。よって、ユーザがWebブラウザを利用してこのURLを指定すると、対応する新たなWebページは、中継サーバ10を経由してクライアント1に提供される。したがって、クライアント1は、この新たなWebページについても、中継サーバ10が提供するサービスを受けることができる。
また、実施形態のWebアプリケーション提供方法によれば、Webサーバ30が実施形態に係わるURLエンコード方式をサポートしていれば、中継サーバ10は、Webサーバ30からのリプライ中のHTML文書を解析しなくてもよい。したがって、中継サーバ10の負担は軽くなる。この場合、Webサーバ30は、後で詳しく説明するが、Webページを生成する際に、そのWebページに設定するリンク先を表す文字列を加工するだけでエンコード処理を実現する。したがって、Webサーバ30によるURLエンコードは、HTML文書全体を解析してそのHTML文書中に埋め込まれているリンク先情報を書き換える手順と比較して、処理量が少ない。よって、URLエンコードに起因するWebサーバ30の負担の増加量は小さい。
さらに、Webサーバ30は、Webページを生成する際に、そのWebページに設定するリンクのみを抽出してエンコードを行う。このため、実施形態の方法によれば、HTML文書中に記述されている、リンク先ではないURL情報が誤って書き換えられることはなく、必要なURLのみを確実に書き換えることができる。
さらに、実施形態の方法においては、Webページ中のURLはWebサーバ30(または、中継サーバ10)において書き換えられるので、クライアント1のWebブラウザは、URLを書き換えるためのスクリプトを実行する必要はない。したがって、上記スクリプトをサポートしていないWebブラウザを実装するクライアント1であっても、中継サーバ10が提供するサービスを受けることができる。
なお、Webサーバ30が実施形態のURLエンコード機能を備えていないときは、Webサーバ30から中継サーバ10へ送信されるリプライは、完了報告情報を含まない。すなわち、中継サーバ10は、リプライヘッダを参照すれば、Webサーバ30においてURLエンコード処理が実行されたか否かを認識できる。したがって、中継サーバ10がURLを書き換える機能を備えている場合には、Webサーバ30においてURLエンコードを行う方式と、中継サーバ10においてURLを書き換える方式を併用することが可能である。
図4は、実施形態の中継サーバ10の構成を示す図である。中継サーバ10は、要求受付部11、セッション管理部12、サブドメイン解釈部13、置換情報追加部14、要求転送部15、応答受付部16、応答解釈部17、URL書換え部18、応答変換部19、応答転送部20、ユーザ情報データベース(DB)21を備える。
要求受付部11は、クライアント1のWebブラウザから送信されるリクエストデータを受信する。また、要求受付部11は、セッション管理部12に問合わせを行うことにより、リクエストデータの送信元のユーザIDを特定する。このとき、要求受付部11は、必要に応じてユーザ認証を実行する。認証処理は、特に限定されるものではないが、例えば、CookieまたはIPアドレスを利用する方式により実現される。なお、セッション管理部12は、ユーザ情報DB21を参照しながら各クライアントセッションを管理する。
サブドメイン解釈部13は、要求受付部11が受け付けたリクエストデータの宛て先URLをデコードして目的サーバのURLを取得する。目的サーバは、この例では、Webサーバ30である。なお、クライアント1から送信されるリクエストの宛て先URLは、中継サーバ10を経由してWebサーバ30へアクセスするように作成されているものとする。
置換情報追加部14は、リクエストデータのヘッダ部(すなわち、リクエストヘッダ)に、置換情報を追加する。置換情報は、Webページに埋め込まれているURLへのアクセスが中継サーバ10を経由するようにそのURLを書き換えるための指示を含む。具体的には、置換情報は、URLのエンコード方式を表す方式情報、およびURLのエンコード処理において使用される文字列パターンを含む。なお、置換情報追加部14は、発明に係る追加部の1つの実施例である。
要求転送部15は、サブドメイン解釈部13から目的サーバのURLを受け取り、置換情報追加部14から置換情報が追加されたリクエストデータを受け取る。そして、要求転送部15は、置換情報を含むリクエストデータを目的サーバへ送信する。なお、目的サーバ(ここでは、Webサーバ30)は、中継サーバ10からリクエストデータを受信すると、対応するリプライデータを生成して中継サーバ10へ送信する。
応答受付部16は、目的サーバから送信されるリプライデータを受信する。応答解釈部17は、応答受付部16により受信されたリプライデータのヘッダ部(すなわち、リプライヘッダ)を解釈し、中継サーバ10においてURLを書き換えるか否かを判定する。また、応答解釈部17は、セッション管理部12を参照し、応答変換処理を実行するか否かを判定する。なお、応答解釈部17は、発明に係る判定部の1つの実施例である。
URL書換え部18は、応答解釈部17によりURLの書換えが必要と判定されたときに、リプライデータのHTML文書内にリンク先として記述されているURLを書き換える。このとき、URL書換え部18は、リプライデータから抽出されるURLを、中継サーバ10を経由するアクセスを実現するためのURLに書き換える。
応答変換部19は、応答変換が必要であると応答解釈部17により判定されたときに、リプライデータを加工する。このとき、応答変換部19は、セッション管理部12を参照して、クライアント1のユーザが要求するサービスを識別する。そして、応答変換部19は、クライアント1のユーザが要求するサービスに応じてリプライデータを加工する。例えば、ユーザが翻訳サービスを要求しているときは、応答変換部19は、リプライデータ中のテキストを翻訳する。或いは、応答変換部19は、ユーザが要求する機能を実現するためのスクリプトコードをリプライデータに挿入する。
応答転送部20は、リプライデータをクライアント1のWebブラウザに送信する。このとき、リプライデータ中でリンク先として設定されているURLは、Webサーバ30(或いは、URL書換え部18)により書き換えられている。また、このリプライデータは、応答変換部19によって加工されていることがある。
ユーザ情報DB21は、中継サーバ10を利用するユーザの情報を格納する。即ち、ユーザ情報DB21は、例えば、各ユーザのユーザIDおよびパスワードの組を格納する。また、ユーザ情報DB21は、各ユーザが中継サーバ10に要求するサービスの種別を表す情報を格納する。
図5は、実施形態のWebサーバ30の構成を示す図である。Webサーバ30は、要求受付部31、置換情報抽出部32、ページ生成部33、ページ記述情報格納部34、アプリケーション処理部35、タグ処理部36、URLエンコード部37、応答送信部38を備える。
要求受付部31は、クライアント1のWebブラウザまたは中継サーバ10から送信されるリクエストデータを受信する。また、要求受付部31は、リクエストデータの送信元のユーザIDを特定する。このとき、要求受付部31は、必要に応じてユーザ認証を実行する。認証処理は、特に限定されるものではないが、例えば、中継サーバ10と同様の方式を採用してもよい。
置換情報抽出部32は、リクエストデータのヘッダ部(すなわち、リクエストヘッダ)に、置換情報が付加されているか否かをチェックする。リクエストヘッダに置換情報が付加されているときは、置換情報抽出部32は、リクエストヘッダから置換情報を抽出してURLエンコード部37に与える。また、置換情報抽出部32は、リクエストヘッダからさらにプロトコル名、ホスト名、パス名を抽出してURLエンコード部37に与える。そして置換情報抽出部32は、リクエストデータと共に、このリクエストデータの送信元のユーザID等をページ生成部33へ送信する。
ページ生成部33は、Webアプリケーションのフレームワークを利用して、リクエストデータに応じたWebページを生成する。この実施例では、ページ生成部33は、例えばStrutsと呼ばれるフレームワークを利用してWebページを生成する。すなわち、ページ生成部33は、ページ記述情報格納部34から、リクエストデータに含まれているパス名に対応するページ記述情報を取得する。そして、ページ生成部33は、取得したページ記述情報に応じてアプリケーション処理部35を呼び出す。ここで、Strutsフレームワークでは、ページ記述情報内のHTML要素を生成する部分は、カスタムタグを用いて記述されている。このため、ページ生成部33は、StrutsのカスタムタグをHTMLに展開するために、タグ処理部36を呼び出す。そして、ページ生成部33は、アプリケーション処理部35の処理結果およびタグ処理部36の処理結果を利用してリプライデータを生成し、応答送信部38に与える。
ページ記述情報格納部34は、Webサーバ30が提供するWebページを特定するパス名に対応するページ記述情報を格納する。ページ記述情報の形式は、特に限定されるものではない。また、アプリケーション処理部35は、ページ生成部33から呼び出され、ページ記述情報に応じた処理を実行してその処理結果をページ生成部33に返す。
タグ処理部36は、ページ生成部33から呼び出され、StrutsのカスタムタグをHTML要素に展開する。ここで、展開により得られたHTML要素がリンク先を表す情報(ここでは、URL)を含むときは、タグ処理部36は、URLエンコード部37にそのURLのエンコードを依頼する。また、タグ処理部36は、URLエンコード部37によりエンコードされたURLをリンク先としてHTML要素を生成する。そして、タグ処理部36は、展開結果をページ処理部33に返す。
URLエンコード部37は、置換情報抽出部32によってリクエストデータから抽出されたエンコード処理のための情報(置換情報を含む)を保持している。また、URLエンコード部37は、タグ処理部36からの依頼に応じて、置換情報を利用してURLをエンコードする。そして、URLエンコード部37は、エンコード結果をタグ処理部36に返す。なお、URLエンコード部37は、発明に係るWebサーバ装置が備える書換え部の1つの実施例である。
応答送信部38は、ページ生成部33により生成されたページを受け取ると、URLエンコード処理を実行したか否かをURLエンコード部37に問い合わせる。URLエンコード処理が実行されているときは、応答送信部38は、リプライデータのヘッダ部(すなわち、リプライヘッダ)に、URLエンコード処理を実行したことを表す完了報告情報のためのフィールドを追加する。そして、応答送信部38は、ページ生成部33により生成されたWebページを含むリプライデータを中継サーバ10へ送信する。
次に、実施形態のWebアプリケーション提供方法の一例を説明する。なお、以下の説明では、図3に示すように、クライアント1とWebサーバ30との間に中継サーバ10が配置されているものとする。Webサーバ30は、クライアント1のWebブラウザの目的サーバである。また、中継サーバ10は図4に示す構成を有し、Webサーバ30は図5に示す構成を有している。さらに、中継サーバ10はhttp://proxy.comで識別され、Webサーバ30はhttp://example.comで識別されるものとする。
<リクエストの送信>
クライアント1のユーザは、この実施例では、Webサーバ30が提供するWebアプリケーション(app1)のWebページ(page3)を要求するものとする。この場合、クライアント1のWebブラウザは、図6に示すHTTPリクエストを生成して中継サーバ10へ送信する。この例では、アクセス先として「http-example-com.proxy.com」が設定されている。この記述は、「HTTPでproxy.comを経由してexample.comにアクセスする」を意味する。
中継サーバ10は、クライアント1から図6に示すHTTPリクエストを受信すると、アクセス先を表すURLをデコードする。すなわち、中継サーバ10は、受信したリクエストに設定されているURLを、目的サーバ(すなわち、Webサーバ30)を表すURLに書き換える。この例では、中継サーバ10は、「http-example-com.proxy.com」を「example.com」に書き換える。なお、URLをデコードする手順は、例えば、特開2009−271676号公報に記載されている。また、中継サーバ10は、リクエストヘッダに置換情報を追加する。
図7は、リクエストヘッダに置換情報を追加する処理を示すフローチャートである。このフローチャートの処理は、中継サーバ10がクライアント1からHTTPリクエストを受信したときに、置換情報追加部14により実行される。
ステップS1において、置換情報追加部14は、中継サーバ10が実行するURLエンコード方式を表す文字列を生成する。この実施例では、URLエンコード方式を表す文字列は、下記の定数文字列である。
hyphen-concatinate-hostname
なお、「文字列を生成」は、中継サーバ10が備えるメモリ領域に予め格納されている文字列を取得する処理を含むものとする。
ステップS2において、置換情報追加部14は、受信したリクエストのリクエストヘッダに、ステップS1で生成した文字列を追加するためのフィールドを追加する。この実施例では、置換情報追加部14は、リクエストヘッダにX-url-encodetypeフィールドを追加する。そして、置換情報追加部14は、X-url-encodetypeフィールドに、ステップS1で生成した文字列を設定する。
ステップS3において、置換情報追加部14は、中継サーバ10が実行するURLエンコードにおいてテンプレートとして使用する文字列を生成する。この実施例では、テンプレートとして使用するURLエンコードパターンは、下記の定数文字列である。
http://%PROTOCOL%-%HOSTNAME%.proxy.com/%PATHNAME%
「proxy.com」は、中継サーバ10のホスト名である。なお、「文字列を生成」は、ステップS1と同様に、中継サーバ10が備えるメモリ領域に予め格納されている文字列を取得する処理を含むものとする。
ステップS4において、置換情報追加部14は、受信したリクエストのリクエストヘッダに、ステップS3で生成した文字列を追加するためのフィールドを追加する。この実施例では、置換情報追加部14は、リクエストヘッダにX-url-encodepatternフィールドを追加する。そして、置換情報追加部14は、X-url-encodepatternフィールドに、ステップS3で生成した文字列を設定する。
図8は、置換情報が追加されたHTTPリクエストの実施例を示す。ここで、図6と図8とを比較すると、アクセス先を表すHOSTが「http-example-com.proxy.com」から「example.com」に書き換えられている。また、図8に示すリクエストには、置換情報として2つのフィールド(X-url-encodetype、X-url-encodepattern)が追加されている。
中継サーバ10は、上述の置換情報を含むリクエストを目的サーバへ送信する。このリクエストは、「example.com」に従って転送される。よって、Webサーバ30は、上記リクエストを受信する。
<Webサーバ30の動作>
Webサーバ30は、中継サーバ10から図8に示すリクエストを受信すると、ユーザ認証を実行する。そして、ユーザ認証が成功すると、置換情報抽出部32は、リクエストヘッダから置換情報を抽出する。
図9は、置換情報抽出部32の処理を示すフローチャートである。このフローチャートの処理は、Webサーバ30がHTTPリクエストを受信したときに実行される。
ステップS11において、置換情報抽出部32は、受信したリクエストが要求するWebページのプロトコル名、ホスト名、パス名をURLエンコード部37に通知する。この実施例では、置換情報抽出部32は、図8に示すリクエストから、プロトコル名、ホスト名、パス名として、それぞれ「HTTP」「example.com」「app1/page3/html」を抽出する。そして、置換情報抽出部32は、抽出結果をURLエンコード部37に通知する。
ステップS12〜S13において、置換情報抽出部32は、リクエストヘッダに設定されているX-url-encodetypeフィールドの値を取得する。このとき、置換情報抽出部32は、リクエストヘッダがX-url-encodetypeフィールドを有するか否かをチェックする。また、置換情報抽出部32は、X-url-encodetypeフィールドの値が、Webサーバ30が実行可能なエンコード方式を表しているか否かをチェックする。この実施例では、Webサーバ30は、「hyphen-concatinate-hostname」で識別されるエンコード方式を実行可能であるものとする。
リクエストヘッダがX-url-encodetypeフィールドを有し、且つX-url-encodetypeフィールドの値が、Webサーバ30が実行可能なエンコード方式を表していれば、処理はステップS14へ移行する。一方、リクエストヘッダがX-url-encodetypeフィールドを有していない場合、或いは、X-url-encodetypeフィールドの値が、Webサーバ30が実行可能なエンコード方式を表していない場合は、処理はステップS17へ移行する。図8に示す例では、置換情報抽出部32は、X-url-encodetypeフィールドから下記の値を取得する。
hyphen-concatinate-hostname
この場合、置換情報抽出部32は、ステップS13で「Yes」と判定する。よって、置換情報抽出部32は、ステップS14を実行する。
ステップS14〜S15において、置換情報抽出部32は、リクエストヘッダに設定されているX-url-encodepatternフィールドの値を取得する。X-url-encodepatternフィールドに値が設定されていなければ、処理はステップS17へ移行する。図8に示す例では、置換情報抽出部32は、X-url-encodepatternフィールドから下記の文字列を取得する。
http://%PROTOCOL%-%HOSTNAME%.proxy.com/%PATHNAME%
ステップS16において、置換情報抽出部32は、ステップS12およびS14で取得して値をURLエンコード部37に通知する。ここで、ステップS12で得られた値は、中継サーバ10およびWebサーバ30が実行するURLエンコード方式を識別する。また、ステップS14で得られた文字列は、Webサーバ30が実行するURLエンコードにおいてテンプレートとして使用されるエンコードパターンを有している。
リクエストヘッダがX-url-encodetypeフィールドまたはX-url-encodepatternフィールドを有していないとき、或いは、X-url-encodetypeフィールドまたはX-url-encodepatternフィールドの値が不適切なときは、ステップS17が実行される。ステップS17において、置換情報抽出部32は、URLエンコード処理を実行しないことを表す値をURLエンコード部37に通知する。
図10は、URLエンコード部37が保持するエンコード情報の実施例を示す。URLエンコード部37は、置換情報抽出部32から通知されるエンコード情報を保持する。このとき、URLエンコード部37は、例えば、Webサーバ30が受信したHTTPリクエストのセッションに対応づけて、置換情報抽出部32から通知されるエンコード情報を保持する。具体的には、URLエンコード部37は、リクエストヘッダから置換情報として抽出される「エンコード方式」および「エンコードパターン文字列」を保持する。さらに、URLエンコード部37は、置換情報と共に「現在のプロトコル名(要求されたプロトコル名)」「現在のホスト名(要求されたホスト名)」「現在のパス名(要求されたパス名)」を保持する。なお、URLエンコード部37は、Webサーバ30内の所定のメモリ領域にエンコード情報を格納する。
続いて、ページ生成部33は、HTTPリクエストにより要求されたWebページを生成する。このとき、ページ生成部33は、まず、HTTPリクエストに従って、ページ記述情報格納部34から対応するページ記述情報を取得する。この例では、ページ生成部33は、StrutsフレームワークでWebページを生成するものとする。
図11は、ページ記述情報の実施例を示す。図11は、図8に示すHTTPリクエストに応じてページ記述情報格納部34から抽出されたページ記述情報を示している。すなわち、このページ記述情報は、Webサーバ30のパスapp1/page3/htmlで特定されるWebページの内容を記述している。以下の説明では、app1/page3/htmlで特定されるWebページのことを「目的Webページ」と呼ぶことがある。なお、ページ記述情報の要素は、この実施例では、HTMLタグではなく、taglibによって定義されるカスタムタグで記述されている。
目的Webページは、他のWebページへのリンクを含んでいる。図11に示す実施例では、目的Webページには、html:linkタグを利用して「前ページ(page2.html)」および「次ページ(page4.html)」が設定されている。
ページ生成部33は、ページ記述情報に応じてアプリケーション処理部35を呼び出して処理を依頼する。そして、ページ生成部33は、アプリケーション処理部35の処理結果を受け取る。なお、アプリケーション処理部35の処理は、公知の技術により実現可能なので、説明は省略する。
さらに、ページ生成部33は、Strutsのカスタムタグ(即ち、taglibにより定義されるタグ)をHTMLに展開するために、タグ処理部36を呼び出す。そして、タグ処理部36は、StrutsのカスタムタグをHTML要素に展開する。
図12は、タグ処理部36の処理を示すフローチャートである。タグ処理部36は、ページ生成部33からカスタムタグを受け取ると、このフローチャートの処理を実行する。
ステップS21において、タグ処理部36は、処理対象のタグ(ページ生成部33から受け取ったタグ)がhtml:linkタグか否かをチェックする。対象タグがhtml:linkタグであれば、処理はステップS22に移行する。一方、対象タグがhtml:linkタグでなければ、タグ処理部36はステップS22〜S26をスキップする。
ステップS22〜S23において、タグ処理部36は、対象タグのページ属性の値を取得する。そして、タグ処理部36は、ページ属性の値が完全修飾されたURLか否かをチェックする。「完全修飾された(Fully Qualified)」とは、ここでは、プロトコル名、ドメイン名、サブドメイン名、ホスト名、パス名等がすべて省略せずに指定されている記述を意味する。
ページ属性の値が完全修飾されたURLでなければ、タグ処理部36は、ステップS24において、現在のWebページのプロトコル名、ホスト名、パス名を用いて、完全修飾されたURLを作成する。現在のWebページは、ページ生成部33が受信したHTTPリクエストに応じて生成しているページに相当する。したがって、タグ処理部36は、例えば、受信したHTTPリクエストのリクエストヘッダから現在のWebページのプロトコル名、ホスト名、パス名を取得することができる。なお、ページ属性の値が完全修飾されたURLであれば、タグ処理部36は、ステップS24をスキップする。
ステップS25において、タグ処理部36は、ページ属性の値として取得したURLまたはステップS24で作成したURLをURLエンコード部37へ送信し、エンコード処理を依頼する。また、タグ処理部36は、ステップS26において、URLエンコード部37によるエンコード結果であるURLを受け取る。そして、タグ処理部36は、エンコードされたURLをページ属性に設定する。なお、URLエンコード部37の処理については、後で詳しく説明する。
ステップS27において、タグ処理部36は、Strutsフレームワークのタグ置換処理を実行する。ここで、タグ処理部36は、予め作成されたタグライブラリを備える。そして、タグ処理部36は、このタグライブラリを利用して、カスタムタグをHTMLタグに置換する。
図13は、タグ処理部36によるURLの置換処理の実施例を示す。ここでは、ページ生成部33からタグ処理部36へ図11に示す「前ページ」を表すhtml:linkタグが与えられたものとする。この場合、図12に示すフローチャートでは、タグ処理部36は、ステップS21において「Yes」と判定する。
ページ記述情報に記述されているURL(すなわち、html:linkタグのページ属性の値)は、図13に示すように「page2.html」である。しかし、このURLは、プロトコル名、ホスト名、パス名が省略されて記述されている。したがって、図12に示すフローチャートでは、ステップS24が実行される。
現在のWebページの「プロトコル名」「ホスト名」「パス名」は、図8に示すHTTPリクエストによれば、それぞれ「HTTP」「example.com」「app1」である。したがって、タグ処理部36は、ステップS24において、下記の完全修飾されたURLを作成する。
http://example.com/app1/page2.html
この後、タグ処理部36は、URLエンコード部37に対してURLのエンコード処理を依頼する。URLエンコード部37の処理については、図14〜図15を参照しながら説明する。
図14は、URLエンコード部37の処理を示すフローチャートである。このフローチャートの処理は、URLエンコード部37がタグ処理部36から呼び出されたときに実行される。なお、タグ処理部36は、上述したように、html:linkタグを置換する処理の中でURLエンコード部37を呼び出す。
ステップS31において、URLエンコード部37は、上述した所定のメモリ領域に保持されているエンコード情報を参照し、「エンコード方式」の値が有効か否か、およびWebサーバ30がその値に対応するエンコード方式を実行可能か否か判定する。また、ステップS32において、URLエンコード部37は、上記エンコード情報を参照し、「エンコードパターン文字列」の値が有効か否かを判定する。この実施例では、Webサーバ30は、「hyphen-concatinate-hostname」で識別されるエンコード方式を実行可能であるものとする。なお、「エンコード方式」または「エンコードパターン文字列」の値が有効でない状態は、例えば、値が設定されていないとき、或いはヌルデータが設定されているときに発生する。
ここで、エンコード情報として保持されている「エンコード方式」は、中継サーバ10から送信される置換情報の一部であり、中継サーバ10から要求されたエンコード方式を表す。したがって、URLエンコード部37は、中継サーバ10から要求されたエンコード方式でURLをエンコードできるときは、ステップS33〜S37の処理を実行する。
ステップS37において、URLエンコード部37は、エンコード前のURLから、プロトコル名部分、ホスト名部分、パス名部分を抽出する。なお、エンコード前のURLは完全修飾されたURLであり、タグ処理部36から与えられる。
ステップS34において、URLエンコード部37は、ステップS33で抽出したプロトコル名、ホスト名、パス名を、それぞれ指定されたエンコード方式でエンコードする。なお、指定されたエンコード方式は、中継サーバ10から要求されたエンコード方式である。このエンコード方式の手順は、後で図15を参照しながら説明する。
ステップS35〜S37において、URLエンコード部37は、エンコード情報として保持している「エンコードパターン文字列」を利用して、URLエンコード処理を実行する。この実施例では、「エンコードパターン文字列」は以下の文字列である。
http://%PROTOCOL%-%HOSTNAME%.proxy.com/%PATHNAME%
即ち、ステップS35において、URLエンコード部37は、エンコードパターン文字列内の「%PROTOCOL%」を、ステップS34で得られたプロトコル名に置換する。また、ステップS35において、URLエンコード部37は、「%HOSTNAME%」をステップS34で得られたホスト名に置換する。さらに、ステップS35において、URLエンコード部37は、「%PATHNAME%」をステップS34で得られたパス名に置換する。
ステップS38において、URLエンコード部37は、ステップS35〜S37で得られた結果文字列をタグ処理部36に返す。
なお、「エンコード方式」の値が有効でないとき(ステップS31:No)、Webサーバ30が指定されたエンコード方式を実行できないとき(ステップS31:No)、或いは「エンコードパターン文字列」の値が有効でないときは、URLエンコード部37はステップS39を実行する。この場合、URLエンコード部37は、タグ処理部36から受け取ったURLをそのままタグ処理部36に返す。
図15は、URLエンコード部37によるエンコード処理の実施例を示す。ここでは、URLエンコード部37は、タグ処理部36から下記のURLを受け取るものとする。
http://example.com/app1/page2.html
また、URLエンコード部37は、図10に示すエンコード情報を保持しているものとする。
URLエンコード部37は、図10に示すエンコード情報の「エンコード方式」を参照する。この例では、エンコード方式として下記の文字列が記録されている。
hyphen-concatinate-hostname
ここで、Webサーバ30は、このエンコード方式を実行できる。また、URLエンコード部37は、図10に示すエンコード情報の「エンコードパターン文字列」を参照する。この例では、エンコードパターン文字列として下記の文字列が記録されている。
http://%PROTOCOL%-%HOSTNAME%.proxy.com/%PATHNAME%
したがって、URLエンコード部37は、ステップS33〜S38を実行する。
URLエンコード部37は、ステップS33において、タグ処理部36から受け取ったURLからプロトコル名、ホスト名、パス名を抽出する。この例では、URLエンコード部37は、URLのプロトコル名、ホスト名、パス名として、図15に示すように、それぞれ「http」「example.com」「/app1/page2.html」を抽出する。
続いて、URLエンコード部37は、ステップS34において、中継サーバ10により指定されたエンコード方式(hyphen-concatinate-hostname)で、プロトコル名、ホスト名、パス名をそれぞれエンコードする。このエンコード方式は、以下の規則を含む。
(1)プロトコル名は、変更しない
(2)ホスト名は、ドットをハイフンに置き換える
(3)パス名は、先頭に付されているスラッシュを削除する
したがって、「http」「example.com」「/app1/page2.html」に対して上述のエンコード処理を実行することにより、「http」「example-com」「app1/page2.html」が得られる。
さらに、URLエンコード部37は、ステップS35〜S37において、エンコードパターン文字列の「%PROTOCOL%」「%HOSTNAME%」「%PATHNAME%」をそれぞれ「http」「example-com」「app1/page2.html」に置換する。この結果、下記のURLが生成される。
http://http-example-com.proxy.com/app1/page2/html
そして、URLエンコード部37は、このようにして生成したURLをタグ処理部36に返す。
図16は、ページ生成部33により生成されるWebページの実施例を示す。なお、図16は、HTML文書内のリンク情報に係わる記述のみを示している。
図16において、リンク先を表すURLは、上述したように、ページ記述情報内のURLを置換情報に従ってエンコード/置換することにより生成される。そして、このURLの「http-example-com.proxy.com」という記述は、「HTTPでproxye.comを経由してexample.comにアクセスする」を意味する。
ページ生成部33は、上述のようにして生成したWebページを応答送信部38に与える。そうすると、応答送信部38は、このWebページを含むリプライを中継サーバ10へ送信する。このとき、応答送信部38は、URLエンコード処理を実行したか否かをURLエンコード部37に問い合わせる。そして、URLエンコード処理が実行されているときは、応答送信部38は、リプライヘッダに、URLエンコード処理を実行したことを表す完了報告情報のためのフィールドを追加する。
図17は、Webサーバ30から送信されるリプライの実施例を示す。ここでは、Webサーバ30は、中継サーバ10から置換情報に基づいてURLエンコード処理を実行したものとする。したがって、この実施例では、Webサーバ30が実行するURLエンコード処理はhyphen-concatinate-hostnameである。
この場合、応答送信部38は、リプライヘッダにX-url-decodetypeフィールドを追加する。図17では、リプライヘッダの3行目にX-url-decodetypeフィールドが追加されている。さらに、応答送信部38は、X-url-decodetypeフィールドの値として、Webサーバ30が実行したURLエンコード処理を識別する下記の文字列を設定する。hyphen-concatinate-hostname
この結果、図17に示すリプライが生成される。そして、Webサーバ30は、図8に示すHTTPリクエストの送信元である中継サーバ10へこのリプライを送信する。
なお、Webサーバ30は、中継サーバ10から置換情報を受信しなかったときは、上述のURLエンコード処理を実行しない。また、Webサーバ30は、置換情報により指定されたエンコード方式をサポートしていないときも、上述のURLエンコード処理を実行しない。
図18は、URLエンコード処理が実行されなかったときにWebサーバ30から送信されるリプライの実施例を示す。この場合、リプライヘッダにX-url-decodetypeフィールドは追加されていない。また、HTML文書中でリンク先を表すURLは、中継サーバ10を経由するための情報を含んでいない。
<リプライの送信>
中継サーバ10は、Webサーバ30から図17または図18に示すリプライを受信する。そうすると、中継サーバ10は、必要に応じてリプライ中のWebページを加工した後、そのリプライをクライアント1へ送信する。
図19は、Webサーバ30からリプライを受信した中継サーバ10の処理を示すフローチャートである。中継サーバ10は、応答受付部16がWebサーバ30からリプライを受信したときに、このフローチャートの処理を実行する。
ステップS41〜S42において、応答解釈部17は、Webサーバ30から受信したリプライのリプライヘッダからContent-Typeフィールドの値を取得する。そして、応答解釈部17は、Content-Typeフィールドの値が、URL置換処理を必要とするタイプを表しているか否かをチェックする。Content-Typeフィールドの値がURL置換処理を必要とするタイプを表していれば、処理はステップS43へ移行し、そうでない場合は、処理はステップS48へ移行する。
この実施例では、WebページがHTML形式であれば、URL置換処理が必要であると判定される。例えば、図17または図18に示すリプライにおいては、Content-Typeフィールドに「html」が設定されている。したがって、この場合、応答解釈部17は、ステップS43〜S47を実行する。
ステップS43において、応答解釈部17は、リプライヘッダからX-url-decodetypeフィールドの値を取得する。また、ステップS44において、応答解釈部17は、取得したX-url-decodetypeフィールドの値が、中継サーバ10が実行するURLエンコード方式を表す文字列と一致するか否かをチェックする。この例では、中継サーバ10が実行するURLエンコード方式は、下記の文字列で表わされる。
hyphen-concatinate-hostname
そして、X-url-decodetypeフィールドの値が、中継サーバ10が実行するURLエンコード方式を表す文字列と一致するときは、処理はステップS45へ移行する。これに対して、リクエストヘッダがX-url-decodetypeフィールドを有していない場合、X-url-decodetypeフィールドに値が設定されていない場合、X-url-decodetypeフィールドの値が、中継サーバ10が実行するURLエンコード方式を表す文字列と一致していない場合は、応答解釈部17は、リプライをURL書換え部18へ送信する。そして、処理はステップS46へ移行する。
例えば、図17に示すリプライは、X-url-decodetypeフィールドを有しており、その値はhyphen-concatinate-hostnameである。よって、中継サーバ10が図17に示すリプライを受信すると、応答解釈部17は、Webサーバ30においてURL処理が実行されたと解釈し、ステップS44で「Yes」と判定する。一方、図18に示すリプライは、X-url-decodetypeフィールドを有していない。したがって、中継サーバ10が図18に示すリプライを受信すると、応答解釈部17は、Webサーバ30においてURL処理が実行されていないと解釈し、ステップS44で「No」と判定する。
ステップS45において、応答解釈部17は、リプライヘッダからX-url-decodetypeフィールドを削除する。そして、応答解釈部17は、X-url-decodetypeフィールドが削除されたリプライを応答変換部19へ送信する。
一方、ステップS46においては、URL書換え部18は、リプライのHTML文書中のリンク先を表すURLを書き換える。このとき、URL書換え部18は、Webサーバ30のURLエンコード部37によるエンコード処理と実質的に同等の書換え処理を実行する。例えば、中継サーバ10が図18に示すリプライを受信したときは、URL書換え部18は、「前ページ」にアクセスするためのURLを下記のように書き換える。
http://http-example-com.proxy.com/app1/page2/html
また、URL書換え部18は、「次ページ」を表すURLについても同様に書き換える。
ステップS47において、応答変換部19は、リプライを変更する必要があると応答解釈部17により判定されたときは、セッション管理部12を参照し、クライアント1のユーザが要求するサービスを識別する。そして、応答変換部19は、クライアント1のユーザが要求するサービスに応じてリプライを加工する。例えば、ユーザが翻訳サービスを要求しているときは、応答変換部19は、リプライ中のテキストを翻訳する。あるいは、応答変換部19は、ユーザが要求する機能を実現するためのスクリプトをリプライに挿入する。
ステップS48において、応答転送部20は、ステップS41〜S47により得られるリプライをクライアント1のWebブラウザへ送信する。ここで、リプライのHTML文書中にリンク先を表すURLが記述されているときは、そのURLは、Webサーバ30において書き換えられている。また、Webサーバ30においてURLエンコード処理が実行されなかったときは、そのURLは、中継サーバ10のURL書換え部18により書き換えられる。すなわち、中継サーバ10からクライアント1へ送信されるリプライのHTML文書中のURLは、Webサーバ30または中継サーバ10により、リンク先へのアクセスが中継サーバ10を経由して行われるように書き換えられている。中継サーバ10からクライアント1へ送信されるリプライの実施例を図20に示す。
クライアント1は、図20に示すリプライを受信すると、Webブラウザを利用してそのリプライの内容(すなわち、HTML文書等で記述されるWebページ)を表示する。このとき、このリプライには、中継サーバ10が提供するサービスが付加されている。
このような状況において、クライアント1のユーザが、Webブラウザを利用して、例えば、図20に示す「前ページ」を指定(クリック)するものとする。この場合、Webブラウザは、図20に示すリプライから得られる下記のURLへ新たなリクエストを送信する。
http://http-example-com.proxy.com/app1/page2/html
このURLの「http-example-com.proxy.com」という記述は、少なくともクライアント1のWebブラウザと中継サーバ10との間では、「HTTPでproxy.comを経由してexample.comにアクセスする」を表す。
したがって、「前ページ」を閲覧するためのリクエストは、クライアント1から中継サーバ10を経由して目的サーバ(ここでは、Webサーバ30)へ送信される。Webサーバ30は、中継サーバ10から上記リクエストを受信すると、そのリクエストに対応するリプライ(この例では、「前ページ」に相当するWebページ)を生成して中継サーバ10へ返送する。そして、中継サーバ10は、Webサーバ30から受信したリプライをクライアント1へ転送する。すなわち、「前ページ」に相当するWebページは、中継サーバ10を経由してクライアント1に提供される。したがって、クライアント1は、「前ページ」に相当するWebページについても、中継サーバ10が提供するサービスを受けることができる。
<他の実施形態>
他の実施形態のWebアプリケーション提供方法において、中継サーバ10がリクエストに置換情報を追加する手順、およびWebサーバ30が置換情報を含むリクエストに基づいてリプライを生成する手順については、図6〜図18を参照しながら説明した方法と同じである。ただし、他の実施形態の方法は、リプライを受信した中継サーバ10の処理が図19に示す手順と異なっている。したがって、以下では、他の実施形態においてリプライを受信した中継サーバ10の処理を説明する。
図21は、他の実施形態においてリプライを受信した中継サーバ10の処理を示すフローチャートである。ここで、図21に示すステップS41〜S44、S45、S47、S48の処理は、図19を参照しながら説明した通りである。すなわち、他の実施形態においても、リプライヘッダのX-url-decodetypeフィールドの値が、中継サーバ10のURLエンコード方式を表す文字列と一致するときは、応答解釈部17は、リプライヘッダからX-url-decodetypeフィールドを削除する。このとき、中継サーバ10は、必要応じて、リプライに対してユーザが要求するサービスを付加する。
ところが、他の実施形態においては、リクエストヘッダがX-url-decodetypeフィールドを有していない場合、X-url-decodetypeフィールドに値が設定されていない場合、或いはX-url-decodetypeフィールドの値が中継サーバ10のURLエンコード方式を表す文字列と一致していない場合は、応答解釈部17は、リプライを応答転送部20へ送信する。すなわち、Webサーバ30においてURLエンコード処理が実行されなかったときは、中継サーバ10は、URL書換え部18によるURL書換え処理、および応答変換部19によるWebページの変更を行うことなく、Webサーバ30により生成されたリプライをクライアント1へ送信する。
この場合、クライアント1が受信するWebページには、中継サーバ10が提供するサービスは付加されていない。また、クライアント1がWebブラウザを利用してWebページ内のURLにアクセスすると、リクエストは、中継サーバ10を経由せずにアクセス先へ転送される。したがって、そのアクセス先から送信されるWebページにも、中継サーバ10が提供するサービスは付加されない。
このように、Webサーバ30においてWebページ中のURLが書き換えられているときは、中継サーバ10は、リプライの内容の変更を許可する。一方、Webサーバ30においてWebページ中のURLが書き換えられてないときは、中継サーバ10は、リプライの内容の変更を禁止する。
この構成により、Webサーバ30は、あるリンク先へのアクセスが中継サーバ10を経由しないように制限することができる。すなわち、Webサーバ30がWebページ内のURLを書き換えなければ、クライアント1が受信するWebページ内のURLは、目的サーバを指し示す状態を維持している。この場合、クライアント1のWebブラウザがそのURLを指定すると、リクエストは、中継サーバ10を経由することなく目的サーバへ転送される。そして、目的サーバからクライアント1へ提供されるリプライも、中継サーバ10を経由しない。したがって、目的サーバからクライアント1へ提供されるリプライは、中継サーバ10によって加工または変更されることはない。すなわち、Webサーバ30は、中継サーバ10により加工または変更されたくないコンテンツを保護できる。
一方、中継サーバ10は、リプライデータに完了報告情報(X-url-decodetypeフィールド)が付与されていないときは、URL書換え部18によるURL書換え処理、および応答変換部19によるWebページの変更を行わない。よって、Webサーバ30は、完了報告情報を、中継サーバ10におけるURLの書換えの可否およびWebページの加工の可否を表す情報として使用することもできる。
<中継サーバ10およびWebサーバ30のハードウェア構成>
図22は、中継サーバ10およびWebサーバ30を実現するためのコンピュータシステム100のハードウェア構成を示す図である。コンピュータシステム100は、図22に示すように、CPU101、メモリ102、記憶装置103、読み取り装置104、通信インタフェース106、入出力装置107を備える。CPU101、メモリ102、記憶装置103、読み取り装置104、通信インタフェース106、入出力装置107は、例えば、バス108を介して互いに接続されている。
CPU101は、メモリ102を利用して上述のフローチャートの手順を記述したプログラムを実行することにより、実施形態の中継サーバ10またはWebサーバ30の機能を提供する。コンピュータシステム100が中継サーバ10として動作するときは、CPU101は、図7および図19(他の実施形態においては、図19に代わりに図21)に示すフローチャートの手順を記述したプログラムを実行し、図4に示す要素11〜20の機能の一部または全部を提供する。また、コンピュータシステム100がWebサーバ30として動作するときは、CPU101は、図9、図12、図14に示すフローチャートの手順を記述したプログラムを実行し、図5に示す要素31〜33、35〜38の機能の一部または全部を提供する。
メモリ102は、例えば半導体メモリであり、RAM領域およびROM領域を含んで構成される。記憶装置103は、例えばハードディスクであり、実施形態の手順を記述したプログラムを格納する。記憶装置103は、フラッシュメモリ等の半導体メモリであってもよい。また、記憶装置103は、外部記録装置であってもよい。なお、コンピュータシステム100が中継サーバ10として動作するときは、ユーザ情報DB21は、例えば、記憶装置103に設けられる。また、コンピュータシステム100がWebサーバ30として動作するときは、ページ記述情報格納部34は、例えば、記憶装置103に設けられる。
読み取り装置104は、CPU101の指示に従って可搬型記録媒体105にアクセスする。可搬型記録媒体105は、例えば、半導体デバイス(USBメモリ等)、磁気的作用により情報が入出力される媒体、光学的作用により情報が入出力される媒体(CD−ROM、DVD等)などにより実現される。通信インタフェース106は、CPU101の指示に従ってネットワークを介してデータを送受信する。入出力装置107は、例えば、ユーザからの指示を受け付けるデバイス、CPU101の処理結果を表示するデバイス等に相当する。
中継サーバ10またはWebサーバ30の処理に係わるプログラムは、例えば、下記の形態でコンピュータシステム100に提供される。
(1)記憶装置103に予めインストールされている。
(2)可搬型記録媒体105により提供される。
(3)プログラムサーバ110からダウンロードする。