ユーザ情報取得
ユーザ情報プロパティ
ユーザ情報プロパティも基本的には、端末情報プロパティと同様の取得方法が可能です。
端末情報はリクエストを行うユーザエージェントによってその情報内容を変えるため、取得方法にある程度工夫が必要でしたが、ユーザ情報はあらかじめどういった情報が保存されているかわかっているため、端末情報に比べてその取得方法は簡単です。
Durian4.6以降から、プロキシ方式でも、ユーザ情報が取得可能になりました。
フィルター方式での取得方法
ユーザ情報プロパティに保存されている情報は以下のキー値を使用することで取得できます。
| キー値 | 説明 | 備考 |
|---|---|---|
| accessCount | 同一セッション内でユーザがサーバにアクセスした回数 | |
| host | クライアントのホスト名 | |
| requestUri | ユーザがリクエストしたURI | |
| previousUri | ユーザが前回リクエストしたURI | |
| userId | ユーザ識別子 | |
| openUserId | 一般サイト向けユーザ識別子 | Durian 4.1.3以降 |
| serialNumber | 製造番号 | |
| validRemoteIp | アクセス時のリモートIPアドレスが各キャリアのIPアドレス帯域に含まれているかどうか |
ユーザ識別子および製造番号の取得には、オプションパラメータの設定が必要になる場合があります。また、ユーザが拒否した場合や、非公式サイトでは取得できないことがあります。
ユーザ情報プロパティから上記の値を取り出すコードは以下のようになります。
Properties prop = (Properties)request.getAttribute("userInfo");
String accessCount = prop.getProperty("accessCount");
String host = prop.getProperty("host");
String requestUri = prop.getProperty("requestUri");
String previousUri = prop.getProperty("previousUri");
String userId = prop.getProperty("userId");
String openUserId = prop.getProperty("openUserId"); // Durian 4.1.3以降
String serialNumber = prop.getProperty("serialNumber");
プロキシ方式での取得方法
プロキシ方式の場合はDurian管理ツールで設定時に、HTTPリクエストヘッダでプロキシ先に送信されます。
以下の表にヘッダの形式を記します。
| 送信されるヘッダ名 | 対応する端末情報キー名 |
|---|---|
| X-Durian-User-Id | ユーザ識別子 |
| X-Durian-Open-User-Id | 一般サイト向けユーザ識別子 |
| X-Durian-Serial-Number | 製造番号 |
| X-Durian-Valid-Remote-Ip | アクセス時のリモートIPアドレスが各キャリアのIPアドレス帯域に含まれているかどうか |
通常は以下のように送信されます。
X-Durian-User-Id: 012345678901
*ユーザ識別子
ユーザ識別子には、キーuserIdから取得されるユーザ識別子と、キーopenUserIdから取得される一般サイト向けユーザ識別子が存在します。userIdとopenUserIdの違いは、以下の通りです。
|*キャリア|*userIdの値|*openUserIdの値|
|DoCoMo|公式サイトユーザID もしくは iモードID(※1)|iモードID|
|SoftBank|ユーザID|ユーザID|
|au|サブスクライバID|サブスクライバID|
※1 設定にて変更が可能です。デフォルトでは、公式サイトユーザーIDです。
※2 iモードIDをサーバ側で取得するには、DoCoMoの仕様上、リクエストURIのクエリー文字列にguid=ONを含める必要があります。これは、Durianのオプションパラメータ設定で、iモード端末に対し、リクエストURIとしてguid=ONを設定することで実現できます。
*ユーザ情報プロパティ(通信バイト数)
HTTPリクエストおよびHTTPレスポンスの通信バイト数をユーザ情報プロパティから取得することができます。
この機能は、パフォーマンス上の観点からデフォルトでは無効になっています。この機能を有効にするには、ユーザ情報プロパティの設定で「通信バイト数をキャプチャする」を有効にします。
ただし、JSPやServletの処理後にDurianがユーザ情報プロパティに値を設定するため、Durianフィルタより手前のフィルタでユーザ情報プロパティを取得する必要があります。Durianの後のフィルタやServletからは通信バイト数は取得できません。
|*キー値|*説明|
|requestLineBytes|リクエストのリクエストラインのバイト数(0〜)|
|requestHeaderBytes|リクエストのヘッダ部分のバイト数(0〜)|
|requestBodyBytes|リクエストのボディ部分のバイト数(0〜)|
|responseStatusBytes|レスポンスのステータスラインのバイト数(0〜)|
|responseHeaderBytes|レスポンスのヘッダ部分のバイト数(0〜)|
|responseBodyBytes|レスポンスのボディ部分のバイト数(0〜)|
※ユーザ情報プロパティで取得される通信バイト数は、アプリケーションサーバ側で算出したものであり、実際のクライアントからのリクエストやクライアントに送信されるレスポンスの通信バイト数とは異なる可能性があります。
サンプルコードは、以下のようになります。
>||
public class ConnectionCaptureFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
chain.doFilter(request, response);
Properties properties = (Properties)request.getAttribute("userInfo");
if (properties != null) {
System.out.println("request line : " + properties.getProperty("requestLineBytes") + " bytes");
System.out.println("request header : " + properties.getProperty("requestHeaderBytes") + " bytes");
System.out.println("request body : " + properties.getProperty("requestBodyBytes") + " bytes");
System.out.println("response status line : " + properties.getProperty("responseStatusBytes") + " bytes");
System.out.println("response header : " + properties.getProperty("responseHeaderBytes") + " bytes");
System.out.println("response body : " + properties.getProperty("responseBodyBytes") + " bytes");
}
}
public void destroy() {
}
}

