问题

在idea上开发阿里云SCB接口时,发现一个问题,在main方法中执行方法:

STDOrg org = CSBUtil.getRealOrgInfo("李氏餐饮店", "92120610MA16CR3U21");

能够正确获取到信息。而使用idea启动项目,在项目的定时任务中执行相同的代码,却报出了:

signature verification failed

一模一样的代码,为什么执行结果会一个成功一个签名验证呢。

参数都是一样的,首先排除了参数问题。回头去查看SCB文档,发现:

SDK在将参数签名完成后,在发送给服务端之前,会把请求参数进行URLEncoder编码,编码方式为当前Java系统中的file.encoding系统参数所指定的值。

如请求参数中包含有中文,并且客户单的系统Charset编码参数与服务端的不一致的时候,当使用GET方式调用就可能出现验签失败的问题;

当这种情况发生时要检查两端的Charset编码是否一致, 可以在SDK客户端设置编码方式(如: -Dfile.encoding=UTF-8)使编码与服务器一致。如果你的中文参数是写死在Java程序代码中,需要保证源码的编码方式与服务端要求的一致,否则也会出现签名失败的问题.

怀疑是编码问题。于是在main方法和项目中分别使用:

System.out.println(System.getProperty("file.encoding"));

输出file.encoding属性,果然main中编码为UTF-8,项目中是GBK,至此确认了是编码问题。

main中执行成功,说明对方的编码是使用的UTF-8。因为我的项目在tomcat中部署,所以打开idea的tomcat部署设置:

在图中处填入jvm参数:

-Dfile.encoding=UTF-8

如果是jar启动,请在参数中也指定:

-Dfile.encoding=UTF-8

还可以直接修改tomcat配置文件,如果部署在Linux系统,可以在catalina.sh加入如下配置:

JAVA_OPTS="-Xms7168m -Xmx7168m -Dfile.encoding=UTF8"

如果是windows系统,则为:

set "JAVA_OPTS=-Xms7168m -Xmx7168m -Dfile.encoding=UTF8"

忽略内存配置,主要是-Dfile.encoding=UTF8,这时候就解决了file.encoding的问题。
当然如果编码和对方一致,不需做如上处理。

什么决定了file.encoding属性?

在main方法中,main方法所在类文件的编码决定了file.encoding属性。在启动java虚拟机时,idea自动将文件属性中的编码设置为运行时参数。所以在main中执行成功。

在使用tomcat启动项目时,如果不手动设置file.encodinng值,这时系统不知道用什么编码,所以只能采用系统默认编码,windows系统的默认编码是GBK,所以签名验证失败了。

可以看下面关于file.encoding的一段话:

This property is used for the default encoding in Java, all readers and writers would default to use this property. “file.encoding” is set to the default locale of Windows operationg system since Java 1.4.2. System.getProperty(“file.encoding”) can be used to access this property. Code such as System.setProperty(“file.encoding”, “UTF-8”) can be used to change this property. However, the default encoding can not be changed dynamically even this property can be changed. So the conclusion is that the default encoding can’t be changed after JVM starts. “java -Dfile.encoding=UTF-8” can be used to set the default encoding when starting a JVM.

附1:String获取默认编码源码:

查看String的getBytes方法,可以看到如下:

    public byte[] getBytes() {return StringCoding.encode(value, 0, value.length);}

继续:

    static byte[] encode(char[] ca, int off, int len) {String csn = Charset.defaultCharset().name();// 省略......}

看到获取默认编码的是Charset.defaultCharset(),查看:

    public static Charset defaultCharset() {if (defaultCharset == null) {synchronized (Charset.class) {String csn = AccessController.doPrivileged(new GetPropertyAction("file.encoding"));Charset cs = lookup(csn);if (cs != null)defaultCharset = cs;elsedefaultCharset = forName("UTF-8");}}return defaultCharset;}

先去获取file.encoding属性,如果没有,默认返回"UTF-8"。在windows系统file.encoding=GBK,所以会导致文中的错误。

附2:idea控制台乱码处理

修改tomcatfile.encoding属性后,发现idea控制台乱码了,处理方法为打开Intellij的安装的bin目录,找到如下两个文件:

idea.exe.vmoptions
idea64.exe.vmoptions

根据系统是32位或64位选择其中一个配置文件,在配置文件中添加:

-Dfile.encoding=UTF-8

Java file.encoding相关推荐

  1. 系统变量file.encoding对Java的运行影响有多大?(转)good

    这个话题来自: Nutz的issue 361 在考虑这个issue时, 我一直倾向于使用系统变量file.encoding来改变JVM的默认编码. 今天,我想到, 这个系统变量,对JVM的影响到底有多 ...

  2. java命令修改user.home file.encoding等参数值

    使用java命令可以修改user.home file.encoding等参数值,但仅本次运行有效. 修改user.home的命令如下: java -Duser.home="D:\java_u ...

  3. java命令查看环境变量 user.home file.encoding等参数值

    有时候想看一下jvm环境的user.home.file.encoding等参数,可以通过下面的命令查看: java -XshowSettings:all -version -------------- ...

  4. java文件编码格式环境变量_Jenkins maven 构建乱码,修改file.encoding系统变量编码为UTF-8...

    一切都是windows的控制台默认编码GBK问题 情景: 使用jenkins构建,console 输出的中文乱码.代码编码格式是utf-8,因为Jenkins会默认读取当前系统的编码格式,导致构建日志 ...

  5. java file ip_java常用工具类 IP、File文件工具类

    本文实例为大家分享了java常用工具类的具体实现代码,供大家参考,具体内容如下 IP工具类 package com.jarvis.base.util; import java.io.IOExcepti ...

  6. file.encoding到底指的是什么呢?

    转载请注明来源:http://blog.csdn.net/loongshawn/article/details/50918506 <Java利用System.getProperty(" ...

  7. java file.io的各种使用

    File类 File可以表示一个文件的名字也可以表示某个目录下一堆文件的名字,如果是表示多个文件,那么可以使用list方法来获取他们的set集合,返回的是一系列的字符串.下面我们就来看下如何使用这个类 ...

  8. java file 工具_JAVA文件类工具

    FileUtil package cn.jiangzeyin.util.file; import org.springframework.util.Assert; import java.io.*; ...

  9. JAVA File类、IO流体验与简介(字节流、字符流、序列流、打印流、编码、递归)

    1. File类 1.1. File类说明 存储在变量,数组和对象中的数据是暂时的,当程序终止时他们就会丢失.为了能够永 久的保存程序中创建的数据,需要将他们存储到硬盘或光盘的文件中.这些文件可以移动 ...

  10. java File类 常用相关函数

    java File类 相关函数 1.构建函数 2.判断相关函数 4.创建相关函数 5.删除相关函数 6.获取相关函数 1.构建函数 /*** File 构造方法* file 常用构造方法* 1: Fi ...

最新文章

  1. mpvue 转uni-app 操作记录
  2. 分布式锁,进程锁,线程锁到底是什么
  3. golang 切片 slice 拼接
  4. mysql 的 VARCHAR VARCHAR2
  5. php 笔试 龙腾简合_记录面试龙腾简合-java开发工程师经历
  6. Node.jsNPM的安装与配置(转)
  7. 仲裁文件夹服务器,仲裁服务器是什么
  8. 接口规范 14.转码接口
  9. 计算机网络 第五章 运输层
  10. 0可用,0已用 U盘问题 重解~
  11. 2020美亚团队赛复盘
  12. Yingye Zhu‘s Luogu Background
  13. 暴走P图APP隐私政策
  14. 《NVM-Express-1_4-2019.06.10-Ratified》学习笔记(8)
  15. MOS管GS两端并联阻容的作用分析
  16. 简述相关分析(Correlation)
  17. Warmup Learning
  18. python爬虫专家_Python爬虫入门教程:微医挂号网专家团队数据抓取pyspider
  19. 电子计算机应用是啥,第二代电子计算机使用的电子元件是什么
  20. vue生成二维码带图标

热门文章

  1. searchEngin_设置bing国际版为默认引擎
  2. 【文案是做什么?】来源某乎“吾老湿”的精彩回答,我收藏一下,以后学习。
  3. 笔试题——团队活动分组
  4. C语言 十进制转换为二进制
  5. python怎么复数乘方开方_一篇小文入门 Python
  6. PS制作水印的简单教程
  7. 推荐图书《周一清晨的领导课》
  8. 小工程结算书范本_建筑工程结算书范本
  9. Chi-Plots和Kendall Plots
  10. 无线键鼠接收器配对怎么就那么难?简直就是浪费