精华内容
下载资源
问答
  • javaweb乱码

    2014-07-27 11:43:06
    可以解决 javaweb乱码的完整的 方案
  • javaweb乱码的问题

    2021-05-12 11:36:01
    javaweb乱码的问题 首先将idea的编码全部设置为UTF-8 查看tomcat 的配置文件 conf下的server.xml 加一行设置编码 <Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort=...

    javaweb乱码的问题

    • 首先将idea的编码全部设置为UTF-8

    image-20210512113353065

    • 查看tomcat 的配置文件 conf下的server.xml 加一行设置编码
       <Connector port="8080" protocol="HTTP/1.1"
                   connectionTimeout="20000"
                   redirectPort="8443"
                URIEncoding="UTF-8"	 />
    
    • spring自带的过滤器
    <!--    配置springmvc的乱码过滤-->
        <filter>
            <filter-name>encoding</filter-name>
            <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
            <init-param>
                <param-name>encoding</param-name>
                <param-value>utf-8</param-value>
            </init-param>
        </filter>
        <filter-mapping>
            <filter-name>encoding</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    

    网上的自定义过滤器:

    import javax.servlet.*;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletRequestWrapper;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.UnsupportedEncodingException;
    import java.util.Map;
    
    /**
    * 解决get和post请求 全部乱码的过滤器
    */
    public class GenericEncodingFilter implements Filter {
    
       @Override
       public void destroy() {
      }
    
       @Override
       public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
           //处理response的字符编码
           HttpServletResponse myResponse=(HttpServletResponse) response;
           myResponse.setContentType("text/html;charset=UTF-8");
    
           // 转型为与协议相关对象
           HttpServletRequest httpServletRequest = (HttpServletRequest) request;
           // 对request包装增强
           HttpServletRequest myrequest = new MyRequest(httpServletRequest);
           chain.doFilter(myrequest, response);
      }
    
       @Override
       public void init(FilterConfig filterConfig) throws ServletException {
      }
    
    }
    
    //自定义request对象,HttpServletRequest的包装类
    class MyRequest extends HttpServletRequestWrapper {
    
       private HttpServletRequest request;
       //是否编码的标记
       private boolean hasEncode;
       //定义一个可以传入HttpServletRequest对象的构造函数,以便对其进行装饰
       public MyRequest(HttpServletRequest request) {
           super(request);// super必须写
           this.request = request;
      }
    
       // 对需要增强方法 进行覆盖
       @Override
       public Map getParameterMap() {
           // 先获得请求方式
           String method = request.getMethod();
           if (method.equalsIgnoreCase("post")) {
               // post请求
               try {
                   // 处理post乱码
                   request.setCharacterEncoding("utf-8");
                   return request.getParameterMap();
              } catch (UnsupportedEncodingException e) {
                   e.printStackTrace();
              }
          } else if (method.equalsIgnoreCase("get")) {
               // get请求
               Map<String, String[]> parameterMap = request.getParameterMap();
               if (!hasEncode) { // 确保get手动编码逻辑只运行一次
                   for (String parameterName : parameterMap.keySet()) {
                       String[] values = parameterMap.get(parameterName);
                       if (values != null) {
                           for (int i = 0; i < values.length; i++) {
                               try {
                                   // 处理get乱码
                                   values[i] = new String(values[i]
                                          .getBytes("ISO-8859-1"), "utf-8");
                              } catch (UnsupportedEncodingException e) {
                                   e.printStackTrace();
                              }
                          }
                      }
                  }
                   hasEncode = true;
              }
               return parameterMap;
          }
           return super.getParameterMap();
      }
    
       //取一个值
       @Override
       public String getParameter(String name) {
           Map<String, String[]> parameterMap = getParameterMap();
           String[] values = parameterMap.get(name);
           if (values == null) {
               return null;
          }
           return values[0]; // 取回参数的第一个值
      }
    
       //取所有值
       @Override
       public String[] getParameterValues(String name) {
           Map<String, String[]> parameterMap = getParameterMap();
           String[] values = parameterMap.get(name);
           return values;
      }
    }
    
       
    <filter>
            <filter-name>encoding</filter-name>
            <filter-class>com.phq.filter.EncodingFilter</filter-class>
        </filter>
        <filter-mapping>
            <filter-name>encoding</filter-name>
            <url-pattern>/*</url-pattern>
        </filter-mapping>
    
    • 如果控制台打印乱码 ,在tomcat VMoptions设置
    -Dfile.encoding=UTF-8
    

    image-20210512112505808

    • 日志乱码可以考虑设置 conf目录下的logging.properties下的java.util.logging.ConsoleHandler.encoding = UTF-8

    image-20210512113038610

    展开全文
  • 主要给大家介绍了关于JavaWeb乱码问题的终极解决方案,文中通过示例代码介绍的非常详细,对大家学习或者使用JavaWeb具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
  • JavaWeb 乱码问题处理

    2019-04-11 11:23:42
    JavaWeb 乱码问题终极解决方案! 整体思路 首先出现乱码之后,要先去确认乱码的地方,当一个网页上出现乱码,有可能是浏览器显示问题,也有可能是 Java 编码问题,也有可能数据库中的数据本身就是乱码的,所以我们要...

    JavaWeb 乱码问题终极解决方案!

    整体思路

    首先出现乱码之后,要先去确认乱码的地方,当一个网页上出现乱码,有可能是浏览器显示问题,也有可能是 Java 编码问题,也有可能数据库中的数据本身就是乱码的,所以我们要做的第一件事就是确认乱码发生的位置,缩小 bug 范围,通过打印日志或者debug 首先去确认乱码发生的位置,然后再去进一步解决,一般来说,乱码的原因大致上可以分为两类:

    请求乱码
    响应乱码

    请求乱码,可能是因为参数放在 URL 地址中乱码,也有可能是参数放在请求体中乱码,不同传参方案也对应了不同的乱码解决方案。如果是响应乱码,那么原因就会比较多了,一般来说,有如下几种可能的原因:

    数据库本身乱码
    数据在 Java 代码中乱码
    数据在浏览器显示的时候乱码
    数据在从 Java 应用传到数据库的过程中乱码
    

    对于不同的乱码原因,会有不同的解决方案,对症下药,才能药到病除,所以当出现乱码时,大家要做的第一件事就是分析乱码发生的原因,找到原因了,才能找到解决方案。

    基本原则
    发生乱码是因为各自编码不同导致的,所以,大家首先要有一个良好的开发习惯,项目编码,文件编码都要统一起来,一般来说,公司制度稍微成熟一些,都会对项目编码,文件编码有硬性规定的。在Eclipse 中,设置项目编码方式如下(工程的编码要提前设置,如果项目已经开发一半再去设置,已有的中文就会乱码):

    Window->Preferences->General
    在这里插入图片描述
    然后对于 JSP 文件也需要提前设置好编码方式,如下:
    在这里插入图片描述
    这是在 Eclipse 中设置文件编码,如果是在 IntelliJ IDEA中,则不需要设置JSP文件编码,因为默认就是 UTF-8,只需要提前设置下工程编码即可:
    在这里插入图片描述
    除了开发工具的编码,数据库的编码也要统一,一般来说,主要是设置一下数据库的编码和数据表的编码,如下:

    设置数据库编码:

    CREATE DATABASE `vhr` DEFAULT CHARACTER SET utf8;
    

    设置数据表编码:

    DROP TABLE IF EXISTS `adjustsalary`;
    CREATE TABLE `adjustsalary` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `eid` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    这些是准备工作,这些工作做好了,还是有可能会遇到乱码问题,接下来我们就具体问题具体分析。

    请求乱码

    请求乱码,就是说数据在浏览器中显示是正常的,但是传到 Java 后端之后,就乱码了,这种乱码一般来说,分为两种:

    • 参数放在 URL 地址中导致的乱码
    • 参数放在请求体中导致的乱码
      两种乱码原因,对应了两种不同的解决方案。分别来看。
    URL 地址中的参数乱码

    这种乱码主要发生在 GET 请求中,因为在 GET 请求中我们一般通过 URL 来传递参数,这个问题可以在代码中解决,但是太过于麻烦,因此一般我们直接在Tomcat配置中解决,修改 Tomcat的conf/server.xml 文件,修改 URL 编码格式,如下:在这里插入图片描述
    这样就可以搞定 URL 地址中的参数乱码。

    请求体中的参数乱码

    请求体中的参数乱码,我们可以在解析参数之前通过设置 HttpServletRequest 的编码来解决,如下:

    request.setCharacterEncoding("UTF-8");
    

    但是一样也太过于麻烦,所以如果是普通的 Servlet/JSP 项目,我们就可以直接定义一个过滤器来处理,如下:

    public class EncodingFilter implements Filter {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            request.setCharacterEncoding("UTF-8");
            chain.doFilter(request, response);
        }
    }
    

    过滤器配置:

    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.sang.filter.EncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    在工程编码和JSP/HTML编码都没问题的情况下,请求乱码基本上就是这两种情况。

    响应乱码

    如果在浏览器上加载页面看到了乱码,大家首先要确认在从服务端往浏览器写数据的前一刻,这个数据还没有乱码(即数据库中查询出来的数据是OK的,没有发生乱码的问题),那么对于这种乱码,我们只需要设置响应数据的 ContentType 就可以了,如下:

    response.setContentType("text/html;charset=UTF-8");
    

    如果从数据库中查询出来的数据就是乱码的,那么就需要去确认数据库中的编码是否 OK 。

    框架处理
    前面提到的方案,都是在 Servlet/JSP 项目中我们可以采用的方案,在 SSM 框架中当然也可以使用,但是,SpringMVC 框架本身也提供了一个过滤器,我们可以借用这个过滤器更加高效的解决响应乱码问题,如下:

    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    当然,上面这段配置并不能代替 Tomcat 中 conf/server.xml 中的编码配置,如果是在 Spring Boot 中,配置可以更加简单,只需要在 application.properties 中添加如下配置即可:

    server.tomcat.uri-encoding=UTF-8
    spring.http.encoding.force-request=true
    spring.http.encoding.force-response=true
    

    其他乱码
    其他乱码主要是指使用一些第三方框架导致的乱码,例如使用 Alibaba 的 fastjson,开发者就需要在配置 HttpMessageConverter 时指定编码格式,否则就有可能出现乱码,这种第三方框架的乱码,大伙在使用时需要注意看官方文档,fastjson 的 HttpMessageConverter 配置如下:

    @Bean
    FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig config = new FastJsonConfig();
        config.setCharset(Charset.forName("UTF-8"));
        converter.setFastJsonConfig(config);
        converter.setDefaultCharset(Charset.forName("UTF-8"));
        return converter;
    }
    

    一个隐蔽的乱码

    除了前面介绍的这几种乱码之外,还有一个比较隐蔽的乱码,容易被很多初学者忽略的地方,就是数据在从 Java 应用传递到 MySQL 的过程中,发生了乱码,这种问题一般在 Windows 上不易发生,如果数据库装在 Linux 上,则这个问题就很容易发生,数据在代码中命名没有乱码,存到 MySQL 上就乱码了,但是如果直接使用 Navicat 等工具往 MySQL 上存储数据,又不会乱码,或者 MySQL 中数据没有乱码,但是用 Java 查询出来就乱码了,这种都是数据在 应用 和 数据库 之间传递时发生了乱码,解决方式很简单,在数据库连接地址上指定编码即可,如下:

    db.url=jdbc:mysql:///yuetong?useUnicode=true&characterEncoding=UTF-8
    

    大致就这些,还有一些非常偶尔的情况可能会用到 @RequestMapping 注解中的 produces 属性,在这里指定数据类型即可。

    好了,差不多就这些,下次有人问你为啥我的又乱码了,直接把这篇文章甩给他。大伙有什么解决乱码的独门密器也可以一起来讨论。

    原文转载地址:http://www.javaboy.org/post/e1369978.html

    展开全文
  • JavaWeb 乱码问题终极解决方案!

    JavaWeb 乱码问题终极解决方案!

    参考文章:

    (1)JavaWeb 乱码问题终极解决方案!

    (2)https://www.cnblogs.com/lenve/p/10675044.html


    备忘一下。


    展开全文
  • JavaWeb 乱码问题终极解决方案! 整体思路 首先出现乱码之后,要先去确认乱码的地方,当一个网页上出现乱码,有可能是浏览器显示问题,也有可能是 Java 编码问题,也有可能数据库中的数据本身就是乱码的,所以我们要...

    JavaWeb 乱码问题终极解决方案!

    整体思路

    首先出现乱码之后,要先去确认乱码的地方,当一个网页上出现乱码,有可能是浏览器显示问题,也有可能是 Java 编码问题,也有可能数据库中的数据本身就是乱码的,所以我们要做的第一件事就是确认乱码发生的位置,缩小 bug 范围,通过打印日志或者 debug 首先去确认乱码发生的位置,然后再去进一步解决,一般来说,乱码的原因大致上可以分为两类:

    请求乱码
    响应乱码

    请求乱码,可能是因为参数放在 URL 地址中乱码,也有可能是参数放在请求体中乱码,不同传参方案也对应了不同的乱码解决方案。如果是响应乱码,那么原因就会比较多了,一般来说,有如下几种可能的原因:

    数据库本身乱码
    数据在 Java 代码中乱码
    数据在浏览器显示的时候乱码
    数据在从 Java 应用传到数据库的过程中乱码
    

    对于不同的乱码原因,会有不同的解决方案,对症下药,才能药到病除,所以当出现乱码时,大家要做的第一件事就是分析乱码发生的原因,找到原因了,才能找到解决方案。

    基本原则

    发生乱码是因为各自编码不同导致的,所以,大家首先要有一个良好的开发习惯,项目编码,文件编码都要统一起来,一般来说,公司制度稍微成熟一些,都会对项目编码,文件编码有硬性规定的。在Eclipse 中,设置项目编码方式如下(工程的编码要提前设置,如果项目已经开发一半再去设置,已有的中文就会乱码):

    Window->Preferences->General

    在这里插入图片描述

    然后对于 JSP 文件也需要提前设置好编码方式,如下:

    在这里插入图片描述

    这是在 Eclipse 中设置文件编码,如果是在 IntelliJ IDEA中,则不需要设置JSP文件编码,因为默认就是 UTF-8,只需要提前设置下工程编码即可:

    在这里插入图片描述

    除了开发工具的编码,数据库的编码也要统一,一般来说,主要是设置一下数据库的编码和数据表的编码,如下:

    设置数据库编码:

    CREATE DATABASE `vhr` DEFAULT CHARACTER SET utf8;
    

    设置数据表编码:

    DROP TABLE IF EXISTS `adjustsalary`;
    CREATE TABLE `adjustsalary` (
      `id` int(11) NOT NULL AUTO_INCREMENT,
      `eid` int(11) DEFAULT NULL,
      PRIMARY KEY (`id`),
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
    

    这些是准备工作,这些工作做好了,还是有可能会遇到乱码问题,接下来我们就具体问题具体分析。

    请求乱码

    请求乱码,就是说数据在浏览器中显示是正常的,但是传到 Java 后端之后,就乱码了,这种乱码一般来说,分为两种:

    • 参数放在 URL 地址中导致的乱码
    • 参数放在请求体中导致的乱码 两种乱码原因,对应了两种不同的解决方案。分别来看。
    URL 地址中的参数乱码

    这种乱码主要发生在 GET 请求中,因为在 GET 请求中我们一般通过 URL 来传递参数,这个问题可以在代码中解决,但是太过于麻烦,因此一般我们直接在Tomcat配置中解决,修改 Tomcat的conf/server.xml 文件,修改 URL 编码格式,如下:

    在这里插入图片描述

    这样就可以搞定 URL 地址中的参数乱码。

    请求体中的参数乱码

    请求体中的参数乱码,我们可以在解析参数之前通过设置 HttpServletRequest 的编码来解决,如下:

    request.setCharacterEncoding("UTF-8");
    

    但是一样也太过于麻烦,所以如果是普通的 Servlet/JSP 项目,我们就可以直接定义一个过滤器来处理,如下:

    public class EncodingFilter implements Filter {
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
            request.setCharacterEncoding("UTF-8");
            chain.doFilter(request, response);
        }
    }
    

    过滤器配置:

    <filter>
        <filter-name>encodingFilter</filter-name>
        <filter-class>org.sang.filter.EncodingFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>encodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    在工程编码和JSP/HTML编码都没问题的情况下,请求乱码基本上就是这两种情况。

    响应乱码

    如果在浏览器上加载页面看到了乱码,大家首先要确认在从服务端往浏览器写数据的前一刻,这个数据还没有乱码(即数据库中查询出来的数据是OK的,没有发生乱码的问题),那么对于这种乱码,我们只需要设置响应数据的 ContentType 就可以了,如下:

    response.setContentType("text/html;charset=UTF-8");
    

    如果从数据库中查询出来的数据就是乱码的,那么就需要去确认数据库中的编码是否 OK 。

    框架处理

    前面提到的方案,都是在 Servlet/JSP 项目中我们可以采用的方案,在 SSM 框架中当然也可以使用,但是,SpringMVC 框架本身也提供了一个过滤器,我们可以借用这个过滤器更加高效的解决响应乱码问题,如下:

    <filter>
        <filter-name>encoding</filter-name>
        <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
        <init-param>
            <param-name>forceRequestEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
        <init-param>
            <param-name>forceResponseEncoding</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>encoding</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    

    当然,上面这段配置并不能代替 Tomcat 中 conf/server.xml 中的编码配置,如果是在 Spring Boot 中,配置可以更加简单,只需要在 application.properties 中添加如下配置即可:

    server.tomcat.uri-encoding=UTF-8
    spring.http.encoding.force-request=true
    spring.http.encoding.force-response=true
    

    其他乱码 其他乱码主要是指使用一些第三方框架导致的乱码,例如使用 Alibaba 的 fastjson,开发者就需要在配置 HttpMessageConverter 时指定编码格式,否则就有可能出现乱码,这种第三方框架的乱码,大伙在使用时需要注意看官方文档,fastjson 的 HttpMessageConverter 配置如下:

    @Bean
    FastJsonHttpMessageConverter fastJsonHttpMessageConverter() {
        FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
        FastJsonConfig config = new FastJsonConfig();
        config.setCharset(Charset.forName("UTF-8"));
        converter.setFastJsonConfig(config);
        converter.setDefaultCharset(Charset.forName("UTF-8"));
        return converter;
    }
    

    一个隐蔽的乱码

    除了前面介绍的这几种乱码之外,还有一个比较隐蔽的乱码,容易被很多初学者忽略的地方,就是数据在从 Java 应用传递到 MySQL 的过程中,发生了乱码,这种问题一般在 Windows 上不易发生,如果数据库装在 Linux 上,则这个问题就很容易发生,数据在代码中命名没有乱码,存到 MySQL 上就乱码了,但是如果直接使用 Navicat 等工具往 MySQL 上存储数据,又不会乱码,或者 MySQL 中数据没有乱码,但是用 Java 查询出来就乱码了,这种都是数据在 应用 和 数据库 之间传递时发生了乱码,解决方式很简单,在数据库连接地址上指定编码即可,如下:

    db.url=jdbc:mysql:///yuetong?useUnicode=true&characterEncoding=UTF-8
    

    大致就这些,还有一些非常偶尔的情况可能会用到 @RequestMapping 注解中的 produces 属性,在这里指定数据类型即可。

    好了,差不多就这些,下次有人问你为啥我的又乱码了,直接把这篇文章甩给他。大伙有什么解决乱码的独门密器也可以一起来讨论。

    转载于:https://my.oschina.net/u/4116644/blog/3053886

    展开全文
  • 经常有读者在公众号上问 JavaWeb 乱码的问题,昨天又有一个小伙伴问及此事,其实这个问题很简单,但是想要说清楚却并不容易,因为每个人乱码的原因都不一样,给每位小伙伴都把乱码的原因讲一遍也挺费时间的,因此,...
  • javaweb乱码问题

    2021-04-26 16:16:24
    Javaweb: 1.客户端传回服务器端: 在客户端通过浏览器将表单发回时,若表单是 1.get传输 2.post方法传输出现乱码 解决方法: req.setCharacterEncoding("utf-8"); 设置request对象的解码方式 2.服务器传给客户端...
  • javaWEB乱码根源于解决班车一、Servlet中response乱码原因 1. 因为response默认使用ISO-8859-1编码,当我们的servlet在输出过程出现中文。response默认使用ISO-8859-1将中文进行编码,而中文在ISO-8859-1对应的...
  • 今天来讲一下关于解决javaweb乱码出现的原因与解决办法,欢迎大家交流指正。 首先,先明确两个问题,为什么会出现乱码?我们在编写web应用时什么时候会出现乱码? 第一个问题:很多初学者会发现,我们...
  • Javaweb乱码问题

    2021-02-19 17:31:46
    乱码问题 测试步骤: 我们可以在首页编写一个提交的表单 <form action="/e/t" method="post"> <input type="text" name="name"> <input type="submit"> </form> 后台编写对应的处理...
  • javaWeb乱码解决

    2019-09-18 11:22:21
    在doGet()方法的首行加入 response.setContentType(“text/html;charset=UTF-8”);

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 1,804
精华内容 721
关键字:

javaweb乱码

java 订阅