反省
OGNLのなんでもできる便利さは実装の甘さにより脅威に対して無防備となる可能性がありましたね。
https://www.sec-consult.com/files/20120104-0_Apache_Struts2_Multiple_Critical_Vulnerabilities.txt
2.3.1 など相当枯れたと思われたバージョンでも外部からなんでもできてしまうセキュリティホールが多数(笑)発見されるなど恐ろしすぎてとても業務で使えるものではないかもしれません。
日本語Struts2本が発売になります
毎日コミュニケーションズ社から本サイト関連のStruts2と各コンポーネントの日本語の本が出版されることになりました。
Struts2 フルスタック化&Webアプリケーション開発 ~Struts2+Spring 2+Tiles+iBATIS+GWTで作るショッピングサイト~
- 作者: 三国逸文
- 出版社/メーカー: 毎日コミュニケーションズ
- 発売日: 2008/11/28
- メディア: 単行本(ソフトカバー)
- 購入: 4人 クリック: 185回
- この商品を含むブログ (12件) を見る
サンプルアプリケーションの作成を通してStruts2+Spring2+Tiles+iBATIS+GWTのフルスタック構成でのWebサイト作成がとても簡単に行るようになります。
struts 2.0.12
Struts2が2.0.12にバージョンアップしていた。
アップグレードはjarを差し替えるだけなので問題は無いけどちょっとはまったので。。。
WTP環境で、WEB-INF/lib 下の古いバージョンのjarを削除して、新しいjarに入れ替えサーバーを起動しようとしたところ
Unable to load bean: type: class:com.opensymphony.xwork2.ObjectFactory - bean - jar:file:/C:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/struts2test/WEB-INF/lib/struts2-core-2.0.12.jar!/struts-default.xml:30:72 at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.register(XmlConfigurationProvider.java:208) at org.apache.struts2.config.StrutsXmlConfigurationProvider.register(StrutsXmlConfigurationProvider.java:101) at com.opensymphony.xwork2.config.impl.DefaultConfiguration.reload(DefaultConfiguration.java:131) at com.opensymphony.xwork2.config.ConfigurationManager.getConfiguration(ConfigurationManager.java:52) at org.apache.struts2.dispatcher.Dispatcher.init_PreloadConfiguration(Dispatcher.java:395) at org.apache.struts2.dispatcher.Dispatcher.init(Dispatcher.java:452) at org.apache.struts2.dispatcher.FilterDispatcher.init(FilterDispatcher.java:201) at org.apache.catalina.core.ApplicationFilterConfig.getFilter(ApplicationFilterConfig.java:275) at org.apache.catalina.core.ApplicationFilterConfig.setFilterDef(ApplicationFilterConfig.java:397) at org.apache.catalina.core.ApplicationFilterConfig.<init>(ApplicationFilterConfig.java:108) at org.apache.catalina.core.StandardContext.filterStart(StandardContext.java:3696) at org.apache.catalina.core.StandardContext.start(StandardContext.java:4343) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) at org.apache.catalina.core.StandardHost.start(StandardHost.java:719) at org.apache.catalina.core.ContainerBase.start(ContainerBase.java:1045) at org.apache.catalina.core.StandardEngine.start(StandardEngine.java:443) at org.apache.catalina.core.StandardService.start(StandardService.java:516) at org.apache.catalina.core.StandardServer.start(StandardServer.java:710) at org.apache.catalina.startup.Catalina.start(Catalina.java:566) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) at java.lang.reflect.Method.invoke(Method.java:597) at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:288) at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:413) Caused by: Bean type class com.opensymphony.xwork2.ObjectFactory with the name xwork has already been loaded by bean - jar:file:/C:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/struts2test/WEB-INF/lib/struts2-core-2.0.11.jar!/struts-default.xml:30:72 - bean - jar:file:/C:/workspace/.metadata/.plugins/org.eclipse.wst.server.core/tmp0/wtpwebapps/struts2test/WEB-INF/lib/struts2-core-2.0.12.jar!/struts-default.xml:30:72 at com.opensymphony.xwork2.config.providers.XmlConfigurationProvider.register(XmlConfigurationProvider.java:193) ... 24 more
というエラーで起動できず。
http://issues.apache.org/struts/browse/WW-2478
こんな感じです。
で、結局 WTPのデプロイされた側に古いjarが消されず残っていたのが原因だった。
古いjarを削除したところ問題ないなく起動するようになった。
どうもWTPだと WEB-INF/lib 下に関しては追加は同期してくれるが、削除はされないようだ。
このエラーが出たらWTPのデプロイ先の
<ワークスペース>\.metadata\.plugins\org.eclipse.wst.server.core\tmp0\wtpwebapps
の下あたりに配置してあるアプリを確認する必要がある。
Interceptorパラメータ設定
Struts2でInterceptorのパラメータを設定する場合、
<interceptor-ref name="hoge"> <param name="fileUpload.maxallowsize">10000</param> </intrerceptor-ref>
などと記述することができて便利であるが、hogeインターセプター・スタックに fileUpload インターセプターが無くてもエラーにならないので注意が必要だ。
存在しないインターセプター名であれば警告が出るし、存在しないプロパティでも警告が出る。しかし存在するインターセプター名だとインターセプター・スタックに列挙されていなくても警告してくれないのだ。
実際には設定は無視されて機能しないので警告ぐらいしてくれてもよさそうだ。
ちょっとTIPS:devModeをtureにしても警告してくれない。
OGNLでNestしたMapへのアクセス
Struts2のOGNLでのNestしたMapへのアクセスで少し躓いた。
<s:set name="nestmap" value="#{ 'a' : #{ 'A' : 'aa', 'B' : 'bb' }, 'b' : #{ 'A' : 'cc', 'B' : 'dd' } }"/>
このようなNestしたMapがあったとして、これにアクセスする場合次のどれでもアクセスできる
<s:property value="#nestmap.a.A"/> <s:property value="#nestmap['a'].A"/> <s:property value="#nestmap['a']['A']"/>
これは問題ない。しかし、次のように一階層を代入してアクセスしようとすると意図通りに動作しない
<s:set name="secondmap" value="#nestmap.a"/> <s:property value="#secondmap.A"/>
なぜだろう。