WicketにはBase64のAPIがあるので、これをつかってBasic認証が必要などこかのサーバーに接続するプログラムを書いてみた。Basic認証はユーザー名とパスワードをコロンでつないで、それをBase64にしたものをHTTPヘッダに付加する。HTTPヘッダでは
というようになっている。
Authorization: Basic Base64でエンコードされたテキスト
以下ソース(Wicket 1.4-rc4)
まずはHTML
BasicAuthPage.html
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title></title> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" /> </head> <body> <form wicket:id="form"> URL:<input type="text" wicket:id="inputURL" /><br /> ユーザー名:<input type="text" wicket:id="userName" /><br /> パスワード:<input type="password" wicket:id="password"><br /> <input type="submit" value="送信" wicket:id="submit" /><br /> 結果:<br /><textarea wicket:id="result"></textarea> </form> </body> </html>
上記HTMLに対応したJavaのクラス
BasicAuthPage.java
package basic; import org.apache.wicket.markup.html.WebPage; import org.apache.wicket.markup.html.form.Form; import org.apache.wicket.markup.html.form.TextField; import org.apache.wicket.markup.html.form.PasswordTextField; import org.apache.wicket.markup.html.form.Button; import org.apache.wicket.markup.html.form.TextArea; import org.apache.wicket.model.Model; import org.apache.wicket.util.crypt.Base64; import java.net.URL; import java.net.URLConnection; import java.net.MalformedURLException; import java.io.BufferedReader; import java.io.InputStreamReader; import java.io.IOException; public class BasicAuthPage extends WebPage{ public BasicAuthPage(){ Form<Void> form = new Form<Void>("form"); final TextField<String> inputURL = new TextField<String>("inputURL", new Model<String>()); final TextField<String> userNameField = new TextField<String>("userName", new Model<String>()); final PasswordTextField passwordField = new PasswordTextField("password", new Model<String>()); final TextArea<String> result = new TextArea<String>("result", new Model<String>()); Button submit = new Button("submit"){ @Override public void onSubmit(){ String userName = userNameField.getModelObject(); String password = passwordField.getModelObject(); String basicSource = userName + ":" + password; String basicCrypt = new String(Base64.encodeBase64(basicSource.getBytes())); BufferedReader reader = null; try{ URL url = new URL(inputURL.getModelObject()); URLConnection connection = url.openConnection(); connection.setRequestProperty("Authorization", "basic " + basicCrypt); reader = new BufferedReader(new InputStreamReader(connection.getInputStream())); String line; StringBuilder builder = new StringBuilder(); while((line = reader.readLine()) != null) builder.append(line); result.setModelObject(builder.toString()); }catch(MalformedURLException e){ result.setModelObject("URLの形式が不正です"); }catch(IOException e){ result.setModelObject("通信中にエラーが発生しました"); }finally{ try{ if(reader != null) reader.close(); }catch(IOException ioe){ throw new RuntimeException(ioe); } } } }; form.add(inputURL); form.add(userNameField); form.add(passwordField); form.add(submit); form.add(result); add(form); } }
アプリケーションクラス
package basic; import org.apache.wicket.protocol.http.WebApplication; public class BasicAuthApplication extends WebApplication{ @Override public Class<BasicAuthPage> getHomePage(){ return BasicAuthPage.class; } @Override public void init(){ getRequestCycleSettings().setResponseRequestEncoding("UTF-8"); } }
フィルタマッピング
<?xml version="1.0" encoding="UTF-8"?> <web-app version="2.5" xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"> <filter> <filter-name>BasicAuth</filter-name> <filter-class>org.apache.wicket.protocol.http.WicketFilter</filter-class> <init-param> <param-name>applicationClassName</param-name> <param-value>basic.BasicAuthApplication</param-value> </init-param> </filter> <filter-mapping> <filter-name>BasicAuth</filter-name> <url-pattern>/basic/*</url-pattern> </filter-mapping> <session-config> <session-timeout> 30 </session-timeout> </session-config> </web-app>