第一种:原始编码转换
- 在get请求中,每次获取参数,都使用下列方式转化
- new String(name.getBytes(“ISO-8859-1”), “UTF-8”);
- post方式在获取参数前转化编码格式即可
- req.setCharacterEncoding(“UTF-8”);
- 缺点:需要在每个Servlet上每次请求都需要转化处理,太过麻烦,推荐使用第二种或第三种
代码
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
String name = req.getParameter("name");
name = new String(name.getBytes("ISO-8859-1"), "UTF-8");
System.out.println("Get name:" + name);
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException
{
req.setCharacterEncoding("UTF-8");
String name = req.getParameter("name");
System.out.println("Post name:" + name);
}
第二种:动态代理编码过滤
过滤器代码
public class EncodingFilter implements Filter
{
@Override
public void destroy()
{
}
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws IOException, ServletException
{
HttpServletRequest request = (HttpServletRequest) req;
HttpServletRequest proxy = (HttpServletRequest) Proxy.newProxyInstance(this.getClass().getClassLoader(),
req.getClass().getInterfaces(), new InvocationHandler()
{
Object obj = null;
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable
{
if ("getParameter".equals(method.getName()))
{
String m = request.getMethod();
if ("GET".equals(m))
{
String value = (String) method.invoke(req, args);
value = new String(value.getBytes("ISO-8859-1"), "UTF-8");
return value;
} else
{
req.setCharacterEncoding("UTF-8");
obj = method.invoke(req, args);
}
} else
{
obj = method.invoke(req, args);
}
return obj;
}
});
chain.doFilter(proxy, resp);
}
@Override
public void init(FilterConfig arg0) throws ServletException
{
}
}
web.xml配置
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.zgd.learn.servlet.demo.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>
第三种:装饰着模式编码过滤
- 除get请求,一般都只需要在获取请求参数前添加下列代码即可
- request.setCharacterEncoding(“UTF-8”);
- get请求,为避免每次请求都手动转化参数太过麻烦,可以使用装饰者模式,修改ServletRequest请求
过滤器代码
public class EncodingFilter implements Filter
{
@Override
public void destroy()
{
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException
{
HttpServletRequest httpRequest = (HttpServletRequest) request;
String method = httpRequest.getMethod();
response.setContentType("text/html;charset=utf-8");
if ("GET".equals(method))
{
EncodingServletRequest encodingServletRequest = new EncodingServletRequest(httpRequest);
chain.doFilter(encodingServletRequest, response);
} else if ("POST".equals(method))
{
request.setCharacterEncoding("UTF-8");
chain.doFilter(request, response);
}
}
@Override
public void init(FilterConfig filterConfig) throws ServletException
{
}
}
装饰者EncodingServletRequest
public class EncodingServletRequest extends HttpServletRequestWrapper
{
private HttpServletRequest request;
public EncodingServletRequest(HttpServletRequest request)
{
super(request);
this.request = request;
}
@Override
public String getParameter(String name)
{
String value = request.getParameter(name);
try
{
return new String(value.getBytes("ISO-8859-1"), "UTF-8");
} catch (UnsupportedEncodingException e)
{
e.printStackTrace();
throw new RuntimeException("Encoding is not ISO-8859-1");
}
}
}
web.xml配置
<filter>
<filter-name>EncodingFilter</filter-name>
<filter-class>com.zgd.learn.servlet.demo.EncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>EncodingFilter</filter-name>
<url-pattern>