認証処理の流れを整理する
では、アクセス時にどのようにして認証処理を行っているのか整理しましょう。まず最初に、「UserService」クラスのインスタンスを取得します。
service = UserServiceFactory.getUserService()
UserServiceFactoryは、文字どおりUserServiceインスタンスを取得するためのものです。このgetUserServiceを呼び出してUserServiceが取得できます。このUserServiceには、ユーザー認証に関する各種の機能が用意されています。ログインしているかどうかは、「isUserLoggedIn」を利用します。
if (!service.isUserLoggedIn()){……略……
このように、isUserLoggedInがtrueであれば、ログインしていると判断できます。ログインしていない場合には、ログインページのアドレスを取得し、リダイレクトします。
String url = service.createLoginURL("authed.gsp")
response.sendRedirect(url)
ログインページは、UserServiceの「createLoginURL」で取得できます。引数には、ログイン後に移動するページのURLを指定します。これにより、ログイン後に指定されたURLへと移動するように設定できます。後は、sendRedirectで取得したURLにリダイレクトするだけです。
同系統の機能として、ログアウトのURLを返す「createLogoutURL」メソッドや、管理者としてアクセスしているかどうかをチェックする「isUserAdmin」といったメソッドも用意されています。使い方は、それぞれcreateLoginURL、isUserLoggedInと同じです。あわせて覚えておくと良いでしょう。
では、続いてログインしている場合の処理を見てみましょう。ログインしているユーザーの情報は「User」クラスにまとめられています。まずはこのインスタンスを取得します。
User usr = service.getCurrentUser()
先ほどのUserServiceにある「getCurrentUser」でUserインスタンスが得られます。後は、必要に応じてここから情報を取り出していくだけです。ニックネームとメールアドレスを取り出している部分は、それぞれ次のようにしています。
<%=usr.getNickname() %> <%=usr.getEmail() %>
「getNickname」でニックネームを、「getEmail」でメールアドレスをそれぞれ取り出しています。非常に簡単です。ただし、これらはローカル環境では、正しい値が取得されません。動作を確認する場合は、Googleサーバにデプロイしましょう。
Gmailによるメール送信
続いて、「Gmailによるメールの送信」についてです。といっても、実は「Gmailのためのライブラリ」が用意されているわけではありません。GAE/Jでは、JavaMailを利用してメール送信を行うと、自動的にGmailのサーバよりメールが送られるようになっているのです。
では、これも実際にやってみましょう。今回は、サーブレットとしてメールの送信処理を用意することにしましょう。「src」内に「MailServlet.groovy」という名前でファイルを作成し、以下のソースコードを記述します。
import java.util.Properties
import javax.mail.*
import javax.mail.internet.*
import javax.servlet.http.*
import com.google.appengine.api.users.*
class MailServlet extends HttpServlet {
private UserService service;
void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException {
response.contentType = "text/plain"
response.setCharacterEncoding("UTF-8")
response.writer.println "can't access me!"
}
void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException {
response.contentType = "text/html"
response.setCharacterEncoding("UTF-8")
if (this.checkLogin()){
User usr = service.getCurrentUser();
String from_s = usr.getEmail()
String title_s = request.getParameter("title")
String content_s = request.getParameter("content")
String to_s = "hoge@example.com" // ★宛先
Properties ps = new Properties()
Session ses = Session.getDefaultInstance(ps, null)
try {
MimeMessage msg = new MimeMessage(ses)
msg.setFrom(new InternetAddress(from_s))
msg.addRecipient(Message.RecipientType.TO,
new InternetAddress(to_s))
msg.setSubject(title_s,"ISO-2022-JP")
msg.setText(content_s)
Transport.send(msg)
} catch(e){}
response.sendRedirect("result.html")
} else {
String url = service.createLoginURL("/mail")
response.sendRedirect(url)
}
}
boolean checkLogin(String s){
service = UserServiceFactory.getUserService()
if (service.isUserLoggedIn()){
return true
} else {
return false
}
}
}
ここでは、POSTで必要な情報を送信したときに、それをもとにメールを送るようにしてあります。GETでは、簡単なメッセージを表示するだけにしてあります。ここでは、サンプルとして「hoge@example.com」宛にメールを送るようにしてあります。★部分のメールアドレスを、それぞれのアドレスに書き換えて使ってください。
上記のサンプルコードのままファイルを作成してしまうと、メールは架空のアドレスに送られてしまいますので正しく送信されません。必ず変更してください。
具体的なソースコードの内容を説明する前に、その他の処理も作成しておきましょう。まずはサーブレットの登録です。web.xmlの<web-app>内に、次のようにタグを追記してください。
<servlet>
<servlet-name>MailServlet</servlet-name>
<servlet-class>MailServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>MailServlet</servlet-name>
<url-pattern>/mail</url-pattern>
</servlet-mapping>
ここでは、MailServletを/mailというURIに割り付けておきました。送信フォームを作成し、/mailに向けてPOSTすれば、サーブレットが呼び出され、メールが送信される、というわけです。
