🎄teratailクリスマスプレゼントキャンペーン2024🎄』開催中!

\teratail特別グッズやAmazonギフトカード最大2,000円分が当たる!/

詳細はこちら
Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

Q&A

解決済

2回答

3837閲覧

認証チェック後にCookie作成し、Webアプリへリダイレクトさせたい。

katuobusi

総合スコア8

Cookie

HTTPにおけるCookieとは、クライアントのウェブブラウザ上に保存された一時的なデータを指します。クライアント側のJavaScriptでも、サーバー側のHTTPヘッダーでもクッキーの読み書き・修正・削除が可能です。

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Webサーバー

Webサーバーとは、HTTPリクエストに応じて、クライアントに情報を提供するシステムです。

サーブレット

サーブレット(Servlets)とはウェブやアプリケーションサーバー上に動くプログラムのことであり、ウェブブラウザや他のHTTPクライエントとデータベースやHTTPサーバー上のアプリケーションの中間層としての働きをします。

servlet

Servletとは、Webページの動的な生成やデータ処理などをサーバ上で実行するために、Javaで作成されたプログラムです。 ショッピングサイトやオンラインバンキングといった、動的なウェブサイトの構築に用いられています。

0グッド

0クリップ

投稿2019/11/29 16:45

編集2019/12/03 14:07

前提・実現したいこと

初めて投稿させていただきます。
Javaについては全くの初心者のため、至らぬ点が多々あるかと思いますが、ご了承ください。

■実現したいこと
Webアプリへログインする際にFilterを利用して、認証チェックを実施し、
認証済みの確認が取れた場合に、SAMLコードから言語設定を使用して独自のCookieを作成します。
独自Cookieが作成されたらWebアプリへリダイレクトし、ログインする仕組みを作ろうとしております。

■前提
「該当のソースコード」へ記載しているソースコードの改変はできません。

発生している問題・エラーメッセージ

・独自のCookie作成
→Cookieとして設定したい値が保存されない。

・Webアプリへジャンプ
→ジャンプ(リダイレクト)後に作成したCookieが消え、アプリへログインできない。

該当のソースコード

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.Filter;
import javax.servlet.FilterConfig;
import javax.servlet.FilterChain;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import javax.servlet.http.Cookie;
import java.io.File;
import java.io.FileReader;
import java.io.BufferedReader;
import java.io.IOException;
import java.util.HashMap;

public class AuthCheck implements Filter {

public void init(FilterConfig conf) throws ServletException {}

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException{

HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; Cookie cookie[] = req.getCookies(); String samlid = null; if (cookie != null) { for (int i = 0 ; i < cookie.length ; i++){ if (cookie[i].getName().equals("SAMLID")){ samlid = cookie[i].getValue(); } } } HttpSession http_session = req.getSession(true); String dirname = "/opt/auth/samldata/"; String url = "ログイン専用ページURL"; if (samlid == null) { res.sendRedirect(url); } else if ((String)http_session.getAttribute("userid") == null) { BufferedReader br = null; File file = new File(dirname + samlid); try { if(file.exists()) { br = new BufferedReader(new FileReader(dirname + samlid)); HashMap map = new HashMap(); String line = null; while ((line=br.readLine())!=null) { String str[] = line.split(","); map.put(str[0],str[1]); } http_session.setAttribute("userid", map.get("X-Am-User-Id")); http_session.setAttribute("companycode", map.get("X-Am-Company-Code")); } else { res.sendRedirect(url); } } catch (IOException e) { res.sendError(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); } finally { if (br != null) { br.close(); file.delete(); } } } chain.doFilter(request, response);

}
public void destroy() {}
}

試したこと

■Cookieとして設定したい値が保存されない。
[設定したい値] SAMLコードから言語設定を取得し、変数を作成。

if ((String)http_session.getAttribute("X-Am-Language") == ja) {
String lang = ja_JP;
} else {
String lang = en_US;
}

[作成したいCookie] 作成した変数を「localkey」というcookieで保存。

Cookie localkey = new Cookie("localkey", lang );
response.addCookie(cookie);

■ジャンプ(リダイレクト)後に作成したCookieが消え、アプリへログインできない。
response.sendRedirect("WebアプリURL");

■2019/12/3 追記
「file.delete();」の後へ下記のコードを追記したところ、コンパイルエラーが表示されました。

・追記コード
http_session.setAttribute("language", map.get("X-Am-Language"));
String lang = "ja_JP";
} else {
String lang = "en_US";
}

Cookie cookie=new Cookie("localeKey",lang); Cookie.setDomain("Webアプリサーバドメイン"); response.addCookie(cookie); res.sendRedirect("WebアプリURL");

・コンパイルエラー
AuthCheck.java:46: inconvertible types
found : boolean
required: java.lang.String
if ((String)http_session.getAttribute("X-Am-Language").equals("ja")) {
^
AuthCheck.java:52: cookie is already defined in doFilter(javax.servlet.ServletRequest,javax.servlet.ServletResponse,javax.servlet.FilterChain)
Cookie cookie=new Cookie("localeKey",lang);
^
AuthCheck.java:52: cannot find symbol
symbol : variable lang
location: class AuthCheck
Cookie cookie=new Cookie("localeKey",lang);
^
AuthCheck.java:53: non-static method setDomain(java.lang.String) cannot be referenced from a static context
Cookie.setDomain("Webアプリサーバドメイン");
^
AuthCheck.java:54: cannot find symbol
symbol : method addCookie(javax.servlet.http.Cookie)
location: interface javax.servlet.ServletResponse
response.addCookie(cookie);
^
AuthCheck.java:65: inconvertible types
found : boolean
required: java.lang.String
if ((String)http_session.getAttribute("X-Am-Language").equals("ja")) {
^
AuthCheck.java:71: cookie is already defined in doFilter(javax.servlet.ServletRequest,javax.servlet.ServletResponse,javax.servlet.FilterChain)
Cookie cookie=new Cookie("localeKey",lang);
^
AuthCheck.java:71: cannot find symbol
symbol : variable lang
location: class AuthCheck
Cookie cookie=new Cookie("localeKey",lang);
^
AuthCheck.java:72: non-static method setDomain(java.lang.String) cannot be referenced from a static context
Cookie.setDomain("Webアプリサーバドメイン");
^
AuthCheck.java:73: cannot find symbol
symbol : method addCookie(javax.servlet.http.Cookie)
location: interface javax.servlet.ServletResponse
response.addCookie(cookie);
^
Note: AuthCheck.java uses unchecked or unsafe operations.
Note: Recompile with -Xlint:unchecked for details.
10 errors

補足情報(FW/ツールのバージョンなど)

Websphere application server ND v.7.0
Java 1.6
Red Hat 5.6

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

xebme

2019/11/29 19:36

cookieのドメインは?httpデバッガを使いトレース結果を追記してください。
katuobusi

2019/11/30 08:40

すみません。すぐに確認できる環境ではないため、口頭でお答えします。 Cookie作成(Servlet起動元サーバ)とWebアプリサーバは同一ドメインです。 ログイン専用ページは別の認証用サーバがあり、そこだけ別ドメインとなります。
guest

回答2

0

ベストアンサー

クッキーを発行した際の制約により、取得するアプリケーションで取得できないケースがあります。
記載されているバージョンであれば、発行時に指定しているドメインの後方一致であることが必須です。

https://mergedoc.osdn.jp/tomcat-servletapi-5-ja/javax/servlet/http/Cookie.html#setDomain(java.lang.String)

投稿2019/11/30 04:11

A-pZ

総合スコア12011

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

katuobusi

2019/11/30 08:45

Cookieを発行するドメインとWebアプリのドメインが同一であることが必須という解釈で正しいでしょうか。
katuobusi

2019/11/30 22:43

ご回答ありがとうございます。 Cookie作成時にset.Domainを追記することとします。
guest

0

Java

1if ((String)http_session.getAttribute("X-Am-Language").equals("ja")) { 2String lang = "ja_JP"; 3} else { 4String lang = "en_US"; 5}

全体を見てないので何とも言えないですが、少なくともStringはダブルクォートで囲いequalsで比較しないとダメな気が。。

投稿2019/11/29 17:46

junzi

総合スコア279

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

katuobusi

2019/11/30 22:43

ケアレス、、、というよりも完全に初歩的なミスをしていました。 修正して、再度取得できるかを確認してみます。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.36%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問