Source link: https://app.box.com/s/j7sji6xhn1sc26rayosi
Because the implement doFilter of StrutsPrepareAndExecuteFilter will make a wrapRequest for input ServletRequest.
Have a checking in the implememt of wrapRequest
If RequestWrapper of user extends HttpServletRequestWrapper it cannot invoke to user getParameterMap() method to trim() the parameters.
The results:
Create Struts2 project with eclipse and maven
Support UTF-8 in java web
- Create a filter for trimming
- Add the filter to web.xml
1. Create filter for trimming
When you use the struts2 filter org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter use should create a Request wrapper extend StrutsRequestWrapper
The full WhitespaceFilter class:
package com.vmtram.struts2.filters;
import java.io.IOException;
import java.util.HashMap;
import java.util.Iterator;
import java.util.Map;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.HttpServletRequest;
import org.apache.struts2.dispatcher.StrutsRequestWrapper;
public class WhitespaceFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException,
ServletException {
HttpServletRequest request = (HttpServletRequest) req;
chain.doFilter(new RequestWrapper(request), res);
}
@Override
public void destroy() {
}
@Override
public void init(FilterConfig arg0) throws ServletException {
}
class RequestWrapper extends StrutsRequestWrapper {
public RequestWrapper(HttpServletRequest request) {
super(request);
}
@Override
public Map<String, String[]> getParameterMap() {
Map<String, String[]> paramMapIn = super.getParameterMap();
Map<String, String[]> paramMapOut = new HashMap<String, String[]>();
Iterator<String> keys = paramMapIn.keySet().iterator();
while (keys.hasNext()) {
String key = keys.next();
String[] values = paramMapIn.get(key);
if (values.length == 1) {
String value = values[0].trim();
paramMapOut.put(key, new String[] { value });
} else {
paramMapOut.put(key, values);
}
}
return paramMapOut;
}
}
}
Because the implement doFilter of StrutsPrepareAndExecuteFilter will make a wrapRequest for input ServletRequest.
...
prepare.setEncodingAndLocale(request, response);
prepare.createActionContext(request, response);
prepare.assignDispatcherToThread();
request = prepare.wrapRequest(request);
ActionMapping mapping = prepare.findActionMapping(request, response, true);
...
Have a checking in the implememt of wrapRequest
if (request instanceof StrutsRequestWrapper) {
return request;
}
If RequestWrapper of user extends HttpServletRequestWrapper it cannot invoke to user getParameterMap() method to trim() the parameters.
2. Add filter to web.xml
<filter>
<filter-name>whitespaceFilter</filter-name>
<filter-class>com.vmtram.struts2.filters.WhitespaceFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>whitespaceFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
The results:
Relate:


No comments:
Post a Comment