-
-
Save kawasima/11275430 to your computer and use it in GitHub Desktop.
/** | |
* A Resolver that doesn't call getClass(). | |
* | |
* @author kawasima | |
*/ | |
public class SafeResolver extends DefaultResolver { | |
private static final char NESTED = '.'; | |
private static final char MAPPED_START = '('; | |
private static final char MAPPED_END = ')'; | |
private static final char INDEXED_START = '['; | |
private static final char INDEXED_END = ']'; | |
@Override | |
public String next(String expression) { | |
if (expression == null || expression.length() == 0) { | |
return null; | |
} | |
boolean indexed = false; | |
boolean mapped = false; | |
for (int i = 0; i < expression.length(); i++) { | |
char c = expression.charAt(i); | |
if (indexed) { | |
if (c == INDEXED_END) { | |
return expression.substring(0, i + 1); | |
} | |
} else if (mapped) { | |
if (c == MAPPED_END) { | |
return expression.substring(0, i + 1); | |
} | |
} else { | |
if (c == NESTED) { | |
String props = expression.substring(0, i); | |
if (props.equalsIgnoreCase("class")) { | |
return ""; | |
} else { | |
return props; | |
} | |
} else if (c == MAPPED_START) { | |
mapped = true; | |
} else if (c == INDEXED_START) { | |
indexed = true; | |
} | |
} | |
} | |
return expression; | |
} | |
} |
public class SafeResolverListener implements ServletContextListener{ | |
@Override | |
public void contextInitialized(ServletContextEvent event){ | |
SafeResolver resolver = new SafeResolver(); | |
PropertyUtilsBean.getInstance().setResolver(resolver); | |
} | |
@Override | |
public void contextDestoryed(ServletContextEvent event){ | |
} | |
} |
私も親クラスのメソッドを呼ぶ方がメソッドを再利用できて良いのではと思います。
また、 Resolver の設定に PropertyUtilsBean
の protected なメソッドが使用されていますが、 public なメソッドで設定できると良いのではと思いました。
package と import 宣言をつけて整理してみました。
https://gist.github.com/nakamura-to/11347570
使わせていただきました。ありがとうございます。
nakamura-toさんのコードがさらによいと思いました。
あと、web.xmlへの追記も必要ですね。
少し違うのですが、BeanUtils#populate()の時点で弾くようにしてみました。
パターンはStruts2.13.16.2のcom.opensymphony.xwork2.ExcludedPatternsに合わせています。
MBSDさんのフィルタと同様、IllegalArgumentExceptionで落とすようにしています。
https://gist.github.com/ykare/1fb2d5d11e16cb0003c3
みなさま、ありがとうございます。
ご指摘のとおりですね(雑に作ってしまいました)。
■修正していただいてありがとうございます。本コメントは対応済です(2014/05/12)
貴重な情報ありがとうございます。
ところで、
SafeResolver.java:L31 のIF節において、オリジナルソースでは
return expression.substring(0, i);
にて、ループを抜け返却していますが、L33の条件を満さない場合にループを抜けないように書き変わっているために正しく動きません。
確認をお願いいたします。
qiita.com の記事でも、nakamura-to さんのGistを使ってねと書かれているので、影響は小さいと思いますが、念のためのコメントです。
現時点で世に出回っているFilterでの対応はmultipart/form-dataのPOSTに対処できておらず不完全なので他の対処法を探していたところ、本Gistに出会いました。
貴重な情報をありがとうございます。
蛇足ながら、SafeResolver#nextメソッドの実装方法について、個人的には、親クラスのメソッドを呼び出す方法に安心感を覚えます。