zoukankan      html  css  js  c++  java
  • web中文编码

    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>
  • 相关阅读:
    c++ 在window下创建窗口的基本步骤
    visual studio 2015 安装MSDN全称Microsoft Developer Network 安装离线的MSDN
    interp1一维数据插值在matlab中的用法
    Win32控制台、Win32项目、MFC项目、CLR控制台、CLR空项目、空项目区别
    C# 中的延时的方法。
    C#入门——Console.Write()与Console.WriteLine()
    php发送短信验证码
    来自联想、百度的团队,带着颠覆的理想,做短信服务平台
    python发送短信验证码
    uperTextView-从未如此惊艳!一个超级的TextView
  • 原文地址:https://www.cnblogs.com/smartmsl/p/12132658.html
Copyright © 2011-2022 走看看