9月28
最近和前端同学调试,发现我这里总是无法验证通过,因为他传给我的MD5和我生成的MD5总是对不上。
但是一开始的时候,我是验证了两边的方法的,以test为例
在页面的console中输入
MD5('test')
则输出结果为
098f6bcd4621d373cade4e832627b4f6
在java中的代为如下
System.out.println(DigestUtils.md5Hex("test"));
则输出的结果为
098f6bcd4621d373cade4e832627b4f6
通过对比可以发现是一致的,OK,那就开始调试吧,刚开始就出问题了,验证不通过
拿出有问题的数据做了一下验证,果然不一致,比如“小妹妹,叔叔给你棒棒糖吃”
js的输出结果是 792050820fd52f250ee4f47f58d6198f
java的输出结果是 863088240a7c59d82b7792be48d371ec
果然是中文问题,具体原因没有去详查,于是和前端约定,大家都先encode,然后再求MD5
在页面的console中输入
MD5(encodeURIComponent('小妹妹,叔叔给你棒棒糖吃'))
此时的输出为
8bb9c0940ce8fcc0790303a6a5266a34
在java中的代为进行如下修改
System.out.println(DigestUtils.md5Hex(URLEncoder.encode("小妹妹,叔叔给你棒棒糖吃")));
修改的输出结果如下
8bb9c0940ce8fcc0790303a6a5266a34
终于一致了,继续调试,验证通过。
但是一开始的时候,我是验证了两边的方法的,以test为例
在页面的console中输入
MD5('test')
则输出结果为
098f6bcd4621d373cade4e832627b4f6
在java中的代为如下
System.out.println(DigestUtils.md5Hex("test"));
则输出的结果为
098f6bcd4621d373cade4e832627b4f6
通过对比可以发现是一致的,OK,那就开始调试吧,刚开始就出问题了,验证不通过
拿出有问题的数据做了一下验证,果然不一致,比如“小妹妹,叔叔给你棒棒糖吃”
js的输出结果是 792050820fd52f250ee4f47f58d6198f
java的输出结果是 863088240a7c59d82b7792be48d371ec
果然是中文问题,具体原因没有去详查,于是和前端约定,大家都先encode,然后再求MD5
在页面的console中输入
MD5(encodeURIComponent('小妹妹,叔叔给你棒棒糖吃'))
此时的输出为
8bb9c0940ce8fcc0790303a6a5266a34
在java中的代为进行如下修改
System.out.println(DigestUtils.md5Hex(URLEncoder.encode("小妹妹,叔叔给你棒棒糖吃")));
修改的输出结果如下
8bb9c0940ce8fcc0790303a6a5266a34
终于一致了,继续调试,验证通过。
9月25
项目要做一个后台消息推送,在测试过程中,发现每隔1分半自由,WebSocket会走OnError方法,将异常抛出,异常是java.io.EOFException.然后走@OnClose方法,将连接自动关闭,首先需要加上心跳,并且将nginx中加上proxy_read_timeout 设置为 2000s。
heartCheckFun(){
var that = this;
//心跳检测,每20s心跳一次
that.heartCheck = {
timeout: 20000,
timeoutObj: null,
serverTimeoutObj: null,
reset: function(){
clearTimeout(this.timeoutObj);
clearTimeout(this.serverTimeoutObj);
return this;
},
start: function(){
var self = this;
this.timeoutObj = setTimeout(function(){
//这里发送一个心跳,后端收到后,返回一个心跳消息,
//onmessage拿到返回的心跳就说明连接正常
that.websocketSend("HeartBeat");
console.info("客户端发送心跳");
self.serverTimeoutObj = setTimeout(function(){//如果超过一定时间还没重置,说明后端主动断开了
that.websock.close();//如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
}, self.timeout)
}, this.timeout)
}
}
},
nginx的设置为:
location /{
proxy_pass http://xx.xxx.xxx.xx:xxxx;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 2000s;
keepalive_timeout 2000s;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
尽管设置2000s,但是当到达设置时间,如果websocket没有进行通讯,还是会断开连接.可以前端做一个心跳检测,每隔20秒钟发起一次通信就行.
希望能帮到你;
heartCheckFun(){
var that = this;
//心跳检测,每20s心跳一次
that.heartCheck = {
timeout: 20000,
timeoutObj: null,
serverTimeoutObj: null,
reset: function(){
clearTimeout(this.timeoutObj);
clearTimeout(this.serverTimeoutObj);
return this;
},
start: function(){
var self = this;
this.timeoutObj = setTimeout(function(){
//这里发送一个心跳,后端收到后,返回一个心跳消息,
//onmessage拿到返回的心跳就说明连接正常
that.websocketSend("HeartBeat");
console.info("客户端发送心跳");
self.serverTimeoutObj = setTimeout(function(){//如果超过一定时间还没重置,说明后端主动断开了
that.websock.close();//如果onclose会执行reconnect,我们执行ws.close()就行了.如果直接执行reconnect 会触发onclose导致重连两次
}, self.timeout)
}, this.timeout)
}
}
},
nginx的设置为:
location /{
proxy_pass http://xx.xxx.xxx.xx:xxxx;
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "upgrade";
proxy_read_timeout 2000s;
keepalive_timeout 2000s;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
尽管设置2000s,但是当到达设置时间,如果websocket没有进行通讯,还是会断开连接.可以前端做一个心跳检测,每隔20秒钟发起一次通信就行.
希望能帮到你;
9月21
在安装npm时,可能根据某个教程设置了例如:
npm config set prefix "C:\Program Files\nodejs\node_global"
以及
npm config set cache "C:\Program Files\nodejs\node_cache"
之类的东西,可是后来不想要了,想要恢复默认值,怎么办呢?
方法是删除C:\Users\Administrator\.npmrc这个文件。如果.npmrc不在这个目录下,就全局搜一下啦。
npm config set prefix "C:\Program Files\nodejs\node_global"
以及
npm config set cache "C:\Program Files\nodejs\node_cache"
之类的东西,可是后来不想要了,想要恢复默认值,怎么办呢?
方法是删除C:\Users\Administrator\.npmrc这个文件。如果.npmrc不在这个目录下,就全局搜一下啦。
9月21
npm config set registry https://registry.npm.taobao.org --global
npm config set disturl https://npm.taobao.org/dist --global
yarn config set registry https://registry.npm.taobao.org --global
yarn config set disturl https://npm.taobao.org/dist --global
执行下面的指令就可以使用cnpm利用国内镜像服务了:
npm install -g cnpm --registry=https://registry.npm.taobao.org;
npm config set disturl https://npm.taobao.org/dist --global
yarn config set registry https://registry.npm.taobao.org --global
yarn config set disturl https://npm.taobao.org/dist --global
执行下面的指令就可以使用cnpm利用国内镜像服务了:
npm install -g cnpm --registry=https://registry.npm.taobao.org;
9月14
SELECT COUNT(*)
FROM (SELECT 分组字dao段 FROM 表
GROUP BY 分组字段
)别名
或者
SELECT COUNT(*)
FROM (SELECT distinct 分组字段 FROM 表)别名
扩展资料:
SQL分组查询
在SQL Server中使用的分组查询是ORDER BY子句,使用ORDER BY子句要同聚合函数配合使用才能完成分组查询,在SELECT查询的字段中如果字段没有使用聚合函数就必须出现在ORDER BY子句中(即SELECT后边的字段名要么出现在聚合函数中,要么在ORDER BY子句中使用)
在分组查询中还可以配合使用HAVING子句,定义查询条件。
使用group by进行分组查询
在使用group by关键字时,在select列表中可以指定的项目是有限制的,select语句中仅许以下几项:
1、被分组的列
2、为每个分组返回一个值得表达式,例如用一个列名作为参数的聚合函数
3、group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面
要得到每组的合计可以用下面的,要总计用上面的,想一次性得到分组合计以内及总计,可以这么写:
SELECT 分组容字段 FROM 表
GROUP BY 分组字段
compute sum(COUNT(*))
那就这样
SELECT COUNT(*)
FROM (SELECT 分组字段 FROM 表
GROUP BY 分组字段
)别名
或者
SELECT COUNT(*)
FROM (SELECT distinct 分组字段 FROM 表)别名
FROM (SELECT 分组字dao段 FROM 表
GROUP BY 分组字段
)别名
或者
SELECT COUNT(*)
FROM (SELECT distinct 分组字段 FROM 表)别名
扩展资料:
SQL分组查询
在SQL Server中使用的分组查询是ORDER BY子句,使用ORDER BY子句要同聚合函数配合使用才能完成分组查询,在SELECT查询的字段中如果字段没有使用聚合函数就必须出现在ORDER BY子句中(即SELECT后边的字段名要么出现在聚合函数中,要么在ORDER BY子句中使用)
在分组查询中还可以配合使用HAVING子句,定义查询条件。
使用group by进行分组查询
在使用group by关键字时,在select列表中可以指定的项目是有限制的,select语句中仅许以下几项:
1、被分组的列
2、为每个分组返回一个值得表达式,例如用一个列名作为参数的聚合函数
3、group by 有一个原则,就是 select 后面的所有列中,没有使用聚合函数的列,必须出现在 group by 后面
要得到每组的合计可以用下面的,要总计用上面的,想一次性得到分组合计以内及总计,可以这么写:
SELECT 分组容字段 FROM 表
GROUP BY 分组字段
compute sum(COUNT(*))
那就这样
SELECT COUNT(*)
FROM (SELECT 分组字段 FROM 表
GROUP BY 分组字段
)别名
或者
SELECT COUNT(*)
FROM (SELECT distinct 分组字段 FROM 表)别名
9月14
location / {
proxy_http_version 1.1;
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection "Upgrade";
proxy_set_header X-real-ip $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_pass http://localhost:6633/;
}
9月3
最近在做项目时,需要要工具类中对属性进行赋值,里面有appID和appsecret,因为这两个都是相对固定不会变动的东西,所以配在配置文件 或者数据库配置表最好,这边使用的是配置文件(application.yml),然后通过@Value()属性注入到对应的属性中。
刚开始在做的时候,启动项目后发现通过使用@Value注解对这两个属性进行赋值,结果两个都注不进去。
这个让我很苦恼,通过查找资料。找到了通过set的办法进行注入,并成功。
解决办法:
1.将这两个私有属性的set方法从私有变成公开(private -->>> public);
2.生成这两个静态属性的set方法;
3.将原来在静态属性上的@Value() 注解改到设在 set方法上;
4.去除这两个静态属性set方法的static关键字
类上面的@Compoent 注解一定要有,一定要注意set方法是没有static的,否则取不到值的。
刚开始在做的时候,启动项目后发现通过使用@Value注解对这两个属性进行赋值,结果两个都注不进去。
这个让我很苦恼,通过查找资料。找到了通过set的办法进行注入,并成功。
解决办法:
1.将这两个私有属性的set方法从私有变成公开(private -->>> public);
2.生成这两个静态属性的set方法;
3.将原来在静态属性上的@Value() 注解改到设在 set方法上;
4.去除这两个静态属性set方法的static关键字
类上面的@Compoent 注解一定要有,一定要注意set方法是没有static的,否则取不到值的。