Eclipse设置的编码环境是:utf-8
思想:中文,编码器和解码器必须相匹配,否则需要转码
1、servlet接受Edge的中文请求参数,无需转码,如果是iso8859-1编码的中文,需要转码为utf-8
String username = new String(request.getParameter("username").getBytes("iso8859-1"),"utf-8");
2、接受Edge的post请求,需要设置接受的字符集,然后开始获取参数值
request.setCharacterEncoding("utf-8");
3、如果需要servlet写回中文到页面,需要设置编码,get和post相同
response.setContentType("text/html;charset=utf-8");
4、始终判断请求方式设置编码方式,servlet处理编码
package user; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import service.UserService; /** * 编码测试 */ public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // String username = new String(request.getParameter("username").getBytes("iso8859-1"),"utf-8"); if(request.getMethod().equalsIgnoreCase("post")) { request.setCharacterEncoding("utf-8"); } System.out.println(request.getParameter("username")); response.setContentType("text/html;charset=utf-8"); response.getWriter().append("Served at: ").append(request.getContextPath()).append(request.getParameter("username")); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
5、使用filter统一编码
package filter; import java.io.IOException; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Method; import java.lang.reflect.Proxy; 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 javax.servlet.http.HttpServletResponse; /** * Servlet Filter implementation class EncodingFilter2 */ public class EncodingFilter implements Filter { public void init(FilterConfig fConfig) throws ServletException { } /** * @see Filter#doFilter(ServletRequest, ServletResponse, FilterChain) */ public void doFilter(ServletRequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { // 强转类型 final HttpServletRequest request = (HttpServletRequest)req; HttpServletResponse response = (HttpServletResponse)res; // 动态代理 // Proxy.newProxyInstance(HttpServletRequest.class, request.getClass().getInterfaces(), new InvocationHandler() { HttpServletRequest requspProxy = (HttpServletRequest) Proxy.newProxyInstance(HttpServletRequest.class.getClassLoader(), request.getClass().getInterfaces(), new InvocationHandler() { @Override public Object invoke(Object proxy, Method method, Object[] args) throws Throwable { if("getParameter".equals(method.getName())) { String m = request.getMethod(); if("get".equalsIgnoreCase(m)) { String s = (String) method.invoke(request, args); //return new String(s.getBytes("iso8859-1"), "utf-8"); // 用于浏览器默认使用iso8859-1编码,edge中不需要此设置 return s; }else if("post".equalsIgnoreCase(m)) { request.setCharacterEncoding("utf-8"); return (String) method.invoke(request, args); } } response.setContentType("text/html;charset=utf-8"); return method.invoke(request, args); } }); chain.doFilter(requspProxy, response); } public void destroy() { } }
web.xml配置
<filter> <display-name>EncodingFilter</display-name> <filter-name>EncodingFilter</filter-name> <filter-class>filter.EncodingFilter</filter-class> </filter> <filter-mapping> <filter-name>EncodingFilter</filter-name> <url-pattern>/login</url-pattern> </filter-mapping>