フォームがある画面の場合、URL直打ちによるアクセスや2重submit等を防ぐためにtokenチェックを入れるのが定番ですね。しかしこのtokenチェック、普通にやるとJUnitのユニットテストで必ずひっかかってしまいます。なんせ前の画面から遷移していませんからね。今回はS2JUnit4を使ってtokenチェックをスルーする方法を紹介します。
早速サンプルです。今回はseasar依存のユニットテストとなっています。
import org.apache.struts.Globals; import org.apache.struts.taglib.html.Constants; import org.apache.struts.util.TokenProcessor; import org.junit.Assert; import org.junit.Test; import org.junit.runner.RunWith; import org.seasar.framework.mock.servlet.MockHttpServletRequest; import org.seasar.framework.unit.Seasar2; @RunWith(Seasar2.class) public class TokenTest { private MockHttpServletRequest req; @Test public void トークンチェックを突破するテスト() { // 前の画面からtokenパラメータが渡された事にする String token = "偽物のトークン値"; req.addParameter(Constants.TOKEN_KEY, token); // パラメータをセッションに保存 req.getSession().setAttribute(Globals.TRANSACTION_TOKEN_KEY, token); // tokenチェックを突破する if (!TokenProcessor.getInstance().isTokenValid(req, true)) Assert.fail("tokenチェックにひっかかりました"); } }
MockHttpServletRequestというリクエストをごにょごにょいじれてしまうオブジェクトを使い、前の画面からトークンパラメータが渡され、更にそのトークン値をセッションに保存しておき、isTokenValid()のチェックをスルーしています。
tokenチェックは前の画面で行ったsaveToken()でセッションに保存されたtoken値と、submitイベントで渡されたhiddenのtoken値が同じかどうかを見ているだけなので、token値がパラメータが渡され、セッションにそのtoken値が入っていれば、isTokenValid()を突破できます。詳しくは org.apache.struts.util.TokenProcessorクラスを見るといいでしょう。ソースが200行くらいしかないので、見ると簡単に理解できます。
フロントエンドエンジニア養成読本[HTML ,CSS,JavaScriptの基本から現場で役立つ技術まで満載!] Software Design Plus
- 出版社/メーカー: 技術評論社
- 発売日: 2014/08/04
- メディア: Kindle版
- この商品を含むブログを見る
- 作者: きしだなおき,のざきひろふみ,吉田真也,菊田洋一,渡辺修司,伊賀敏樹
- 出版社/メーカー: 技術評論社
- 発売日: 2014/12/11
- メディア: Kindle版
- この商品を含むブログ (1件) を見る
JavaScriptエンジニア養成読本[Webアプリ開発の定番構成Backbone.js+CoffeeScript+Gruntを1冊で習得!]
- 作者: 吾郷協,山田順久,竹馬光太郎,和智大二郎
- 出版社/メーカー: 技術評論社
- 発売日: 2014/12/11
- メディア: Kindle版
- この商品を含むブログを見る
WordPress プロフェッショナル 養成読本 [Webサイト運用の現場で役立つ知識が満載!] Software Design plus
- 出版社/メーカー: 技術評論社
- 発売日: 2014/10/16
- メディア: Kindle版
- この商品を含むブログを見る