Java
JavaScript
正規表現
cookie

sastrutsでrequestに応じてドメインを取得する

はじめに

javaでリクエストに応じたドメインの取得を扱ったのでメモ

場面

axaxなどでクロスドメイン通信などする時にクッキーを扱うにはヘッダーでドメインなどを指定して許可しなければならない。

javaAction
HttpServletRequest request = RequestUtil.getRequest();
HttpServletResponse response = ResponseUtil.getResponse();
response.setHeader("Access-Control-Allow-Origin", "domain");
response.setHeader("Access-Control-Allow-Credentials", "true");

このときに

response.setHeader("Access-Control-Allow-Origin", "domain");

ドメイン部分をワイルドカードにしてしまえば楽なのだが、Access-Control-Allow-Credentialsを指定するときはワイルドカードが使えない。

response.setHeader("Access-Control-Allow-Origin", "*");

そこで、ヘッダーのREFERERからURLを取得して、それを加工することでドメインを取得する。

ドメイン取得方法

まずリクエスト元のURLの取得

String url = request.getHeader("REFERER");

これを加工してドメインを取得する

具体的には正規表現を利用してドメイン以外を削ぎ落とす。

まずコード

Matcher m = Pattern.compile("(https?://[^/]+/)").matcher(domain);
if (m.find()) {
    String domain = m.group(1);
    domain = domain.substring(0, domain.length() - 1);
 }

解説

一行目は、正規表現のパターンに該当するURLまでを取得し該当するものとしないものを分けている。

この場合https(sのあとにある?により、sはあってもなくても良い)://のあとに次のスラッシュが現れるまで繰り返し取得するという意味になっている。

例えばhttps://qiita.com/drafts/だとした場合、/ https://qiita.com/までを取得するということである。

そして、グループ関数で取得。最後に

domain = domain.substring(0, domain.length() - 1);

https://qiita.com/の最後のスラッシュをとって完成だ。

まとめ

正規表現なんでもできるなと。
もっとよい方法があれば教えていただきたいですm(-_-)m