很久没用struts2了,感觉很多知识有些模糊了。复习的时候碰到这个的问题,觉得有必要写篇文档记录下。
servlet的过滤器能够通过把装饰后的request传递给servlet,这样servlet通过request获取的参数就是修正后的。
但是struts的action获取到HttpServletRequest,因为只有一个参数要获取,就直接用
request.getParameter("username")来获取参数,结果获取到的还是乱码,这个地方让我纠结了很久,一直不知道是什么原因,百度也找不到答案。
经过一段思考,我想到了struts2里的request是以map形式存在的,那么我获取参数集合试试,
结果通过Map<String, String[]> map = request.getParameterMap(); map.get("username");这样获取到的参数就是修正后的参数了。
import java.io.UnsupportedEncodingException;
import java.util.Iterator;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.struts2.StrutsStatics;
import com.opensymphony.xwork2.ActionContext;
import com.opensymphony.xwork2.ActionInvocation;
import com.opensymphony.xwork2.interceptor.AbstractInterceptor;
public class EncodingIntereptor extends AbstractInterceptor {
private static final long serialVersionUID = 6826256332417695666L;
@Override
public String intercept(ActionInvocation invo) throws Exception {
ActionContext actionContext = invo.getInvocationContext();
HttpServletRequest request= (HttpServletRequest) actionContext.get(StrutsStatics.HTTP_REQUEST);
HttpServletResponse response= (HttpServletResponse) actionContext.get(StrutsStatics.HTTP_RESPONSE);
if( request.getMethod().compareToIgnoreCase("post")>=0){
try {
request.setCharacterEncoding("utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}else{
Iterator<String[]> iterval=request.getParameterMap().values().iterator();
while(iterval.hasNext()){
String[] parames = iterval.next();
for (int i = 0; i < parames.length; i++) {
try {
parames[i]=new String(parames[i].getBytes("iso8859-1"),"utf-8");
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
}
}
}
response.setContentType("text/html;charset=UTF-8");
response.setHeader("Cache-Control", "no-cache");
return invo.invoke();
}
}
按照这样写后就已经解决乱码问题了,但我在action里想获取拦截器里修正后的数据时,发现struts的拦截器和是servlet里的过滤器不同。
servlet的过滤器能够通过把装饰后的request传递给servlet,这样servlet通过request获取的参数就是修正后的。
但是struts的action获取到HttpServletRequest,因为只有一个参数要获取,就直接用
request.getParameter("username")来获取参数,结果获取到的还是乱码,这个地方让我纠结了很久,一直不知道是什么原因,百度也找不到答案。
经过一段思考,我想到了struts2里的request是以map形式存在的,那么我获取参数集合试试,
结果通过Map<String, String[]> map = request.getParameterMap(); map.get("username");这样获取到的参数就是修正后的参数了。