前提・実現したいこと
初めて投稿させていただきます。
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
回答2件
あなたの回答
tips
プレビュー