zoukankan      html  css  js  c++  java
  • servlet乱码以及解决

    //  浏览器提交的数据是000110011(码表中对应的《编码》 )等东西。

    // 浏览器以什么《码表》打开浏览器(而空中浏览器使用的编码是:<meta http-equiv="content-type" content="text/html; charset=UTF-8"> 这条语句控制的),那么就以什么《码表》提交数据。



    public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { test1(request, response); }
        //get提交时候的乱码处理
        private void test1(HttpServletRequest request, HttpServletResponse response)
                throws IOException, UnsupportedEncodingException {
            response.getWriter().write(request.getCharacterEncoding()+"<br/>");
            //得到以get类型提交的数据,由于设置request.setCharacterEncoding("UTF-8")对get类型的无效
            String username=request.getParameter("username");
            username=new String(username.getBytes("iso8859-1"),"UTF-8");
            response.getWriter().write(username);
        }

    我用的是tomcat服务器,tomcat默认使用的码表ISO8889

    也可以设服务器的conf下的server.xml文件(不过这个一般不推荐使用!)

        服务器下的server.xml 文件的设置:

           如: <Connector port="8080" protocol="HTTP/1.1"

                   connectionTimeout="20000"

                   redirectPort="8443" URIEncoding="UTF-8" />

           另外一种设置(这样就表示使用post方式中的编码):

               <Connector port="8080" protocol="HTTP/1.1"

                   connectionTimeout="20000"

                   redirectPort="8443"  useBodyEncodingForURI="true"/>

               假如使用这种形式:那么request.setCharacterEncoding("UTF-8");也对get类型提交的数据有效

    也就是下面这种设置:

      

        //处理浏览器提交的数据《post》类型的
        private void test(HttpServletRequest request, HttpServletResponse response)
                throws UnsupportedEncodingException, IOException {
            //这种只能处理《post提交的数据有效,对get提交的数据没有用》
            request.setCharacterEncoding("UTF-8");//假如提交的时候用的是《UTF-8》的编码,那么在这里使用
            //UTF-8来解析   request.getParameter("username");在这里的时候就会以UTF-8来解析了
            
            response.setCharacterEncoding("UTF-8");//由于response.getWriter()返回的字符流,所以需要设置输出的
            response.setHeader("Content-type", "text/html;charset=UTF-8");//这个高速浏览器以什么编码解析html文件
            String username=request.getParameter("username");
            String password=request.getParameter("userpassWord");
            response.getWriter().write(username);
            response.getWriter().write(password);
        }

    如有错误,欢迎指点

    最终版本,使用filer解决全站乱码

    public class CharacterEncodingFilter implements Filter {
        private FilterConfig config=null;
        private String defaultCharset="UTF-8";//缺省的编码
        public void init(FilterConfig filterConfig) throws ServletException {
            this.config=filterConfig;
        }
        public void doFilter(ServletRequest req, ServletResponse resp,
                FilterChain chain) throws IOException, ServletException { 
            HttpServletRequest request=(HttpServletRequest) req;
            HttpServletResponse response=(HttpServletResponse) resp;
            
            String charset=this.config.getInitParameter("charset");
            if(charset==null||"".equals(charset)){
                charset=defaultCharset;
            }
            
            request.setCharacterEncoding(charset);
            response.setCharacterEncoding(charset);
            response.setContentType("text/html;charset="+charset);
            
            CharacterEncodingRequest requestWrapper=new CharacterEncodingRequest(request);
            chain.doFilter(requestWrapper, response);
            
    
        }
        public void destroy() {
    
        }
    
    }
    
    class CharacterEncodingRequest extends HttpServletRequestWrapper{
        private HttpServletRequest requst;
        public CharacterEncodingRequest(HttpServletRequest request) {
            super(request);
            this.requst=request;
        }
        
        @Override
        public String getParameter(String name) {        
            try {
                String value=this.getParameter(name);
                if(value==null)return null;
                if(!this.requst.getMethod().equalsIgnoreCase("get"))return value;//忽略大小写        
            
                value=new String (value.getBytes("ISO8859-1"),this.requst.getCharacterEncoding());//这里是没有更改tomcat默认编码的时候
                return value;
            } catch (UnsupportedEncodingException e) {
                throw new RuntimeException(e);
            }
        }    
    }

    xml文件

        <filter>
            <filter-name>CharacterEncodingFilter</filter-name>
            <filter-class>cn.my.web.filter.CharacterEncodingFilter</filter-class>
            <init-param>
                <param-name>charset</param-name>
                <param-value>UTF-8</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>CharacterEncodingFilter</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
  • 相关阅读:
    HDU 1150 Machine Schedule(二分匹配最小点覆盖)
    CodeForces 748F Santa Clauses and a Soccer Championship
    CodeForces 748E Santa Claus and Tangerines(二分)
    CodeForces 748D Santa Claus and a Palindrome (贪心+构造)
    POJ 3657 Haybale Guessing(二分+并查集)
    【JZOJ5773】简单数学题【数论,数学】
    【洛谷P4085】Haybale Feast【分块】
    【洛谷P4085】Haybale Feast【分块】
    【洛谷P4085】Haybale Feast【分块】
    【洛谷P4212】外太空旅行【随机】【贪心】
  • 原文地址:https://www.cnblogs.com/wucaifang/p/3397513.html
Copyright © 2011-2022 走看看