鍘婚櫎鍓嶅悗絀烘牸鐪嬩技闈炲父綆鍗曠殑浜嬶紝浣嗘槸鏈夎澶氫漢鍙兘灝辨槸鍥犱負榪欎竴涓皬闂錛屾姌紓ㄨ嚜宸卞崐澶╋紝瀹㈡埛绔彁浜ゅ埌鎵鏈夌殑涓滆タ錛岄兘鏄互瀛楃涓插艦寮忔彁浜ょ殑錛屾垜浠笉鐭ラ亾瀹㈡埛鏄庝箞鎿嶄綔鐨勶紝浠栧彲鑳芥妸涓涓猘ge灞炴у搴旂殑鍊鹼紝鍦ㄨ緭鍏ユ椂澶氬姞浜嗕竴涓┖鏍鹼紝鑰屾湇鍔″櫒age瀵瑰簲鐨勫嵈鏄疘nteger綾誨瀷錛屽鏋滀綘浣跨敤servlet榪欎簨涔熷ソ瑙e喅錛屼絾鏄鏋滀綘浣跨敤鐨勬槸MVC妗嗘灦錛岃嚜鍔ㄥ皝瑁呮椂灝變細寰楀埌涓涓被鍨嬭漿鎹㈠紓甯革紝鐒惰岃繖涓椂鍊欎綘鏄惁鏈夊ソ鐨勮В鍐沖姙娉曞憿錛?br />
榪欓噷鎴戜嬌鐢‵ilter鏉ヨВ鍐寵繖涓闂錛岃繖鏄渶綆鍗曟柟渚挎湁鏁堢殑瑙e喅鏂瑰紡錛屽洜涓轟綘涓嶉渶瑕佸姣忎竴涓睘鎬у湪灝佽鍓嶉兘鍘籺rim()錛屽洜涓鴻繖鏄竴浠墮潪甯鎬箯鍛崇殑浜嬫儏銆傚ぇ瀹墮兘鐭ラ亾filter鍙互榪囨護鎴戜滑鎯寵瀹冭繃婊ょ殑姣忎竴涓姹傦紝鍦ㄨ繖璇鋒眰涓湁HttpServletRequest銆丠ttpServletResponse銆傛垜浠煡閬撴湇鍔″櫒鍙栧緱瀹㈡埛绔彂閫佺殑鍙傛暟閮芥槸閫氳繃HttpServletRequest鏉ヨ幏鍙栫殑錛岄偅鎴戜滑鍙笉鍙互鍦ㄤ嬌鐢℉ttpServletRequest鍙栧肩殑鏃跺欏氨涓烘瘡涓涓鎴風鎻愪氦鐨勫睘鎬у幓闄ゅ墠鍚庣┖鏍鹼紝鎴栬呭叾瀹冪殑涓浜涜繃婊ゆ搷浣溿傝繖鑲畾鏄彲浠ョ殑錛岄偅鎴戜滑鍏堟潵浜嗚В涓涓嬫湇鍔″櫒鏄庝箞鍙栧緱瀹㈡埛绔殑鍊肩殑銆?br />
1.getParameter(name)錛岃繑鍥炲崟涓箋?br />
2.getParameterValues(name)錛岃繑鍥炰竴涓暟緇勩?br />
3.getParameterMap()錛屾妸瀹㈡埛绔彁浜ゅ弬鏁板皝瑁呬負涓涓狹ap榪斿洖銆侹錛歯ame錛孷錛歷alue銆?br />
褰撴垜浠嬌鐢╯ervlet鐨勬椂鍊欎竴鑸兘鏄嬌鐢ㄥ墠涓ょ錛宻truts1浣跨敤鐨勭2縐嶏紝struts2(xwork)鍒欎嬌鐢ㄧ殑絎?縐嶏紝閭d箞鎴戜滑鍙鍦ㄨ繖涓変釜鏂規硶璋冪敤鐨勬椂鍊欏鐞嗗墠鍚庣┖鏍鹼紝閭d箞榪斿洖鍒版湇鍔″櫒鐨勫弬鏁板氨鍙堝噺灝戜簡涓鍒嗗嚭bug鐨勬満浼氾紝鐪嬩笅闈㈢殑瀹炵幇銆?br />
public class RequestParameterFilter implements Filter {
private static Log log = LogFactory.getLog(RequestParameterFilter.class);
private List<String> excludeNames;
public void destroy() {
}
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//
request = new HttpServletRequestWrapper2((HttpServletRequest) request);
chain.doFilter(request, response);
}
public void init(FilterConfig config) throws ServletException {
String exclude = config.getInitParameter("exclude");
// not is null.
if (exclude != null && exclude.length() > 0) {
excludeNames = Arrays.asList(exclude.split(","));
if (log.isDebugEnabled()) {
log.debug("initialize arguments.");
}
}
}
/**
* 璇ョ被緇ф壙涔婬ttpServletRequestWrapper錛屽茍閲嶅啓浜嗗搴斿彇寰楀鎴風鐩稿綋鍙傛暟鍊肩殑鎵鏈夌殑鏂規硶銆?br />
* <ul>
* <li>getParameter</li>
* <li>getParameterValues</li>
* <li>getParameterMap</li>
* </ul>
*
* @version 1.0/2010-6-10 涓婂崍11:25:47
* @author Aidan
* @see HttpServletRequestWrapper
*/
private class HttpServletRequestWrapper2 extends HttpServletRequestWrapper {
private ParameterMap2 pm2;
public HttpServletRequestWrapper2(HttpServletRequest request) {
super(request);
}
public String getParameter(String name) {
if (excludeNames != null && excludeNames.contains(name)) {
return super.getParameter(name);
}
return trim(super.getParameter(name));
}
@SuppressWarnings("unchecked")
public Map getParameterMap() {
// xwork渚夸嬌鐢ㄦ鏂規硶鍙栧?br />
// 璇ユ柟娉曡繑鍥炰竴涓狹ap錛孧ap鏄犲皠浜嗗鎴風璇鋒眰瀵瑰簲鐨勯敭鍊?K,V)銆?/span>
if (pm2 == null) {
pm2 = new ParameterMap2(super.getParameterMap());
}
return pm2;
}
public String[] getParameterValues(String name) {
// Struts1浣跨敤姝ゆ柟娉曞彇寰楁墍鏈夌殑鍙傛暟鍊?/span>
if (excludeNames != null && excludeNames.contains(name)) {
return super.getParameterValues(name);
}
return (String[]) trim(super.getParameterValues(name));
}
}
/**
* 璇ユ緇ф壙鑷狧ashMap銆?br />
*
* @version 1.0/2010-6-10 涓婂崍11:30:13
* @author Aidan
* @see HashMap
*/
@SuppressWarnings( { "unchecked", "serial" })
private class ParameterMap2 extends HashMap {
private Set entrySet;
/**
* 鑻ヨ鏋勯犳綾誨璞★紝鍒欓渶瑕佷紶鍏ヤ竴涓猰ap鍙傛暟錛岃map瀵瑰簲鐨勫鎴風璇鋒眰鐨勫弬鏁?K,V)銆?br />
*
* @param map
* 鏄犲皠瀹㈡埛绔弬鏁般?br />
*/
public ParameterMap2(Map map) {
super(map);
}
public Set entrySet() {
// xwork浣跨敤浜嗘鏂規硶鍙栧?/span>
if (entrySet == null) {
entrySet = new HashSet();
Set temSet = super.entrySet();
for (Iterator iterator = temSet.iterator(); iterator.hasNext();) {
Map.Entry me = (Map.Entry) iterator.next();
Entry2 entry = new Entry2(me);
entrySet.add(entry);
}
}
return entrySet;
}
// 鑻ョ洿鎺ヤ粠map浣跨敤key鍙栧緱
public Object get(Object key) {
Object value = super.get(key);
// 涓嶈繃婊ゆ瀵硅薄
if (excludeNames != null && excludeNames.contains(key)) {
return value;
}
if (value != null) {
return trim(value);
}
return null;
}
}
@SuppressWarnings("unchecked")
private class Entry2<K, V> implements Map.Entry<K, V> {
private Map.Entry me;
private boolean isTrim = true;
public Entry2(Map.Entry me) {
if (me == null) {
throw new IllegalArgumentException(
"Map.Entiry argument not null.");
}
this.me = me;
// 涓嶈繃婊ゆ瀵硅薄
if (excludeNames != null && excludeNames.contains(me.getKey())) {
isTrim = false;
}
}
public K getKey() {
return (K) me.getKey();
}
public V getValue() {
if (isTrim) {
return (V) trim(me.getValue());
}
return (V) me.getValue();
}
public V setValue(V value) {
return (V) me.setValue(value);
}
}
/**
* 鍘婚櫎涓涓狾bject綾誨瀷瀵瑰簲鐨勫墠鍚庣┖鏍鹼紝鍥犱負瀹㈡埛绔彁浜ゅ弬鏁版湁涓ょ錛屼竴縐嶏細String錛屽彟涓縐嶏細String[]錛屾鏂規硶浼氳嚜鍔ㄥ垽鏂皟鐢ㄥ摢涓柟娉曘?br />
*
* @param value
* 闇瑕佸鐞嗙殑鍙傛暟銆?br />
* @return 澶勭悊鍚庣殑鍊箋?br />
*/
protected Object trim(Object value) {
if (value instanceof String[]) {
return trim((String[]) value);
}
return trim(value.toString());
}
/**
* 鍘婚櫎鏌愪釜瀛楃涓茬殑鍓嶅悗絀烘牸銆?br />
*
* @param value
* 闇瑕佸鐞嗙殑鍙傛暟銆?br />
* @return 澶勭悊鍚庣殑鍊箋?br />
*/
protected String trim(String value) {
if (value != null && value.length() > 0) {
return value.trim();
}
return value;
}
/**
* 鍘婚櫎鏌愪釜鏁扮粍涓墍鏈夌殑鍊肩殑鍓嶅悗絀烘牸銆?br />
*
* @param values
* 闇瑕佸鐞嗙殑鏁扮粍銆?br />
* @return 澶勭悊鍚庣殑鍊鹼紝褰撴暟緇勭殑length涓?鏃訛紝鍒欒繑鍥炰竴涓猄tring錛屽弽涔嬭繑鍥炰竴涓暟緇勩?br />
*/
protected Object trim(String[] values) {
if (values != null && values.length > 0) {
int len = values.length;
for (int i = 0; i < len; i++) {
values[i] = trim(values[i]);
}
}
if (values.length == 1) {
return values[0];
}
return values;
}
/**
*
* @return 涓嶅鐞嗙殑瀵硅薄銆?br />
*/
public List<String> getExcludeNames() {
return excludeNames;
}
}
榪欎釜Filter瀹炵幇鍘熺悊闈炲父綆鍗曪紝鎴戜細榪囨護鎵鏈夌殑璇鋒眰錛孒ttpServletRequestWrapper2緇ф壙鑷狧ttpServletRequestWrapper錛屽湪鏋勯犲嚱鏁頒腑闇瑕佷竴涓狧ttpServletRequest瀵硅薄(榪欎釜request鏄痺eb紿楀彛鍒涘緩鐨?錛岀劧鍚庢垜閲嶈澆浜嗕笂闈㈡墍璇寸殑3涓柟娉曪紝鍦ㄦ柟娉曞唴閮ㄦ瘡嬈′細鍘昏繃婊ゅ綋鍓嶅鹼紝榪欐槸鍒╃敤浜咼ava澶氭佺壒鎬с傚湪浣跨敤getParameterMap鏃惰緝涓洪夯鐑︼紝鍘熺悊涓鏍楓?br />
褰撶劧鎴戜滑鏈夋椂鍊欏彲鑳芥湁浜涚壒孌婃儏鍐典笉闇瑕佽繃婊ゅ墠鍚庣┖鏍兼垨鑰呭叾瀹冧竴浜涜鍒欙紝榪欓噷鎴戜滑鍙互浣跨敤exclude灞炴ф潵鍒ゆ柇鏄惁榪囨護姝ゅ睘鎬с?br />
DEMO錛?br />
<form action="test!create.action" method="post">
name:
<input name="name" value=" My name is haha.. " />
<br />
<!-- This is a String,isn't number. -->
age:
<input name="age" value=" 15 " />
<br />
email:
<input name="email" value=" grasszring@gmail.com " />
<br />
email2:
<input name="email" value=" grasszring@foxmail.com " />
<br />
<input type="submit" value=" submit " />
</form>
web.xml
<filter>
<filter-name>requestParameter</filter-name>
<filter-class>com.onlyeffort.commons.web.filter.RequestParameterFilter</filter-class>
<init-param>
<!-- 涓嶉渶瑕佽繃婊ゆ鍙傛暟 -->
<param-name>exclude</param-name>
<param-value>email</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>requestParameter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
action
@Action(params = { "actionName", "test" })
@Result(location = "http://www.google.com", type = "redirect")
@SuppressWarnings("serial")
public class TestController extends ActionSupport {
private String name;
private Integer age;
private String[] email;
//.. get set method.
@Override
public String create() throws CreateFailureException {
System.out.println(name);
System.out.println(age);
for (String mail : email) {
System.out.println(mail);
}
return SUCCESS;
}
}
OK,濡傛灉澶у鏈変粈涔堥棶棰樻垨鏈変粈涔堟剰瑙侀兘灝界鐣欒█錛屾劅嬋涓嶅敖銆?br />

]]>