关于javaWeb的开发中,使用get方法提交中文会乱吗,而每一次都要进行一次转码,这里使用java的过滤器Filter来实现编码的转换,将过滤器过滤全部信息,也就是在web.xml文件中进行如下配置:
[code]
<filter-mapping>
<url-pattern>/*</url-pattern>
</filter-mapping>
[/code]
当然这里的只是给了配置文件的一小部分,还没有配完全。
同时还是用了HttpServletRequestWrapper这个类,这个类实现了HttpServletRequest和ServletRequest这两个接口,所以这也可以算是一个Request对象,类的构建代码如下:
[code]
public class HttpServletRequestWrapperTest extendsHttpServletRequestWrapper {
// 存储所有的name和value
private Map<String, String[]> map = newjava.util.concurrent.ConcurrentHashMap<>();
public HttpServletRequestWrapperTest(HttpServletRequestrequest) {
super(request);
}
@Override
public Map<String, String[]> getParameterMap() {
return map;
}
public void put(String key, String value[]) {
};
@Override
public String getParameter(String key) {
String[] value = map.get(key);
if (value[0] != null && value.length > 0) {
return value[0];
} else {
return null;
}
}
@Override
public String[] getParameterValues(String key) {
return map.get(key);
}
}
[code]
新建的过滤器在doFilter加入如下代码:
public void doFilter(ServletRequest request, ServletResponseresponse, FilterChain chain) throws IOException, ServletException {
//设置这个支付编码在get方法中是没有用的,所以要进行转码
request.setCharacterEncoding("UTF-8");
HttpServletRequest req = (HttpServletRequest)request;
//如果是GET方法
if(req.getMethod().equals("GET")){
HttpServletRequestWrapperTestwrap = new HttpServletRequestWrapperTest(req);
Map<String,String[]> map = req.getParameterMap();
List<String> list = new ArrayList<>();
for(Map.Entry<String, String[]> entry:map.entrySet()){
for(String value:entry.getValue()){
byte[] debuff = value.getBytes("ISO-8859-1");
String enValue = new String(debuff,"UTF-8");
list.add(enValue);
}
map.put(entry.getKey(), list.toArray(new String[0]));
}
chain.doFilter(wrap, response);
}
//否则执行Post方法
else{
// pass the request along the filter chain
chain.doFilter(request, response);}
}
[code]
上面已经把所有请求的参数进行了字符编码的转化,存储进去了wrap的map对象。
注意到上面的chain.Filter(wrap,response)的一个参数已经变成了wrap,这样以后request.getParameter(“”)获取到的值都已经是转码后的值了。