ユーザーログインを必要とするサイトを作るときにJava EEだと比較的に簡単に作れると思います。
java ee でユーザー認証をderbyを使って行ってみる
これらのサンプルを試してみて、疑問に思うことがありました。
- ユーザー名の表示はどうするのだろう。
- ログアウトする方法
jsp /Servletで作った時はユーザー名は変数に割り当てていまししたし、ログイン状況の確認はクッキーを使用していたので特に何も考えなくても問題はありませんでした。
java eeの場合、ある程度その辺りについては部品化されているので、それを行うのにはコードが用意されているようです。
jspの場合
「Java eeでユーザー認証の機能を試してみました。」を試してみるとadminでログインをした後にuserにログインし直したい場合、ブラウザーを閉じるなどしないとログインしなおせませんでした。
また、ロールごとに表示させるページを指定するのはweb.xmlでできるのですが、ユーザーごとに表示させる内容を変えたい場合にはユーザー名をシステム側で認識する必要があります。
ユーザー名を表すもの
私が試したのは
- request.getRemoteUser()
- request.getUserPrincipal().toString()
で、どちらもユーザー名が表示させることが出来ました。
HttpServletRequestを利用しているようですがjspの場合だと、明示的にインポートしなくてもそのまま利用できました。
ログアウトの方法
ログイン状態の管理はクッキーか、ローカルに何か情報を持っているのかとChromeで調べてみましたが、見つかりませんでした。
インターネットで調べてみたところ、
- session.invalidate();
を実行することで、ログアウトはできるようになるようです。
セッションで管理していてセッションごと無効にすることで対応するみたいです。
JSFの場合
「java ee でユーザー認証をderbyを使って行ってみる」の場合、JSFで作成されています。ユーザー名を調べる場合には
ログインユーザ名:<h:outputLabel value=”#{request.userPrincipal.name}”/>
とすることでユーザー名が表示されます。
このチュートリアルではログアウトでは、「<h:commandButton value=”ログアウト” action=”#{indexPage.logout()}”/>」で実現しています。このIndexPage.javaのlogout関数では
public String logout() { ExternalContext externalContext = FacesContext.getCurrentInstance().getExternalContext(); externalContext.invalidateSession(); HttpServletRequest request = (HttpServletRequest) externalContext.getRequest(); try { request.logout(); } catch (ServletException ex) { Logger.getLogger(IndexPage.class.getName()).log(Level.SEVERE, null, ex); } // return "index.xhtml?faces-redirect=true"; return "/faces/login/index.xhtml?faces-redirect=true"; }
コードを読んでいくとJSPと同様にセッションを無効にしたあと、HttpServletRequestにはlogoutという関数を実行しているようです。
jspでもこの関数が使えるか試してみました。
<% session.invalidate();%>の代わりに<% request.logout(); %>を入れてみたところ想定通りに動きました。
まとめ
Java EEだとログインとそれに伴うログイン管理は入っているので開発は楽だなと思いました。
これらの情報は自分にとってはまとめられているようにも見えないのでちょっとずつ自分でも調べていきたいと思います。
関連リンク
java – How to get login attributes from a servlet/jsp – Stack Overflow
How do I log out of an application that uses Form authentication? – Web Tutorials – avajava.com