细细思索一番,昨天?? 近一周都没有了新版本上线,怎么昨天出现问题???? 带着满脑子问号冲向工位 迅速走过以下操作在一个阳光明媚的早晨,客服小姐姐甜美的声音照常的响起:”昨天客户平台数千条用户充值失败,钱打到客户手中了,但是订单生成失败“
啊这…这……阳光逐渐暗淡,温馨的画面变成了黑白,甜美的声音也逐渐变的刺耳。脑子中出现了四个字【重大事故】
- 不信任原则 迅速验证消息的真实性(消息属实)
- 查错误数据,查看数据范围,评定事故等级(还好:51条失败订单)
- 回复客服以及上级,说明事情已经开始处理
- 根据上面出错数据查询日志,定位问题
- 经过比对用户更改了微信参数【前面多打一个空格】
- 微信回调参数与数据库中保存进行比对【多一个空格必定比对不成功】
- 结局就是,回调失败,订单生成失败
- 立刻联系客户修复错误参数(保证不再扩大事故范围)
- 立即着手修复错误数据,保证平台运行
- 随后进行程序优化【即增加过滤器去除请求参数前后空格】
每个SpringBoot项目增加过滤器(对外提供API的模块,web网站模块,微信小程序模块。。。)
import com.zy.common.xss.TrimFilter;
import org.springframework.boot.web.servlet.FilterRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
@Configuration
public class FilterConfig {
@Bean
public FilterRegistrationBean trimFilter() {
FilterRegistrationBean registration = new FilterRegistrationBean();
registration.setDispatcherTypes(DispatcherType.REQUEST);
registration.setFilter(new TrimFilter());
registration.addUrlPatterns("
@Override
public ServletInputStream getInputStream() throws IOException {
//非json类型,直接返回
if(!super.getHeader(HttpHeaders.CONTENT_TYPE).equalsIgnoreCase(MediaType.APPLICATION_JSON_VALUE)){
return super.getInputStream();
}
//为空,直接返回
String json = IOUtils.toString(super.getInputStream(), "utf-8");
if (!StringUtils.hasLength(json)) {
return super.getInputStream();
}
ByteArrayInputStream bis = new ByteArrayInputStream(JsonTrimUtils.jsonTrim(json).getBytes("utf-8"));
return new MyServletInputStream(bis);
}
public void modifyParameterValues(){
Set set =params.keySet();
Iterator it=set.iterator();
while(it.hasNext()){
String key= it.next();
String[] values = params.get(key);
for (int i = 0; i < values.length; i++) {
values[i] = values[i].trim();
}
params.put(key, values);
}
}
@Override
public String getParameter(String name) {
String[]values = params.get(name);
if(values == null || values.length == 0) {
return null;
}
return values[0];
}
@Override
public String[] getParameterValues(String name) {//同上
return params.get(name);
}
class MyServletInputStream extends ServletInputStream{
private ByteArrayInputStream bis;
public MyServletInputStream(ByteArrayInputStream bis){
this.bis=bis;
}
@Override
public boolean isFinished() {
return true;
}
@Override
public boolean isReady() {
return true;
}
@Override
public void setReadListener(ReadListener listener) {
}
@Override
public int read() {
return bis.read();
}
}
}
工具类,去除JSON中值前后空格
import com.alibaba.fastjson.JSONArray;
import com.alibaba.fastjson.JSONObject;
import java.util.Iterator;
import java.util.Map;
public final class JsonTrimUtils {
private JsonTrimUtils() {
}
public static JSONObject jsonTrim(String jsonStr) {
return jsonTrim(JSONObject.parseObject(jsonStr));
}
public static JSONObject jsonTrim(JSONObject jsonObject) {
Iterator> iterator = jsonObject.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry next = iterator.next();
Object value = next.getValue();
if (value != null) {
if (value instanceof String) {
//清空值前后空格
jsonObject.put(next.getKey(), ((String) value).trim());
} else if (value instanceof JSONObject) {
jsonTrim((JSONObject) value);
} else if (value instanceof JSONArray) {
jsonTrimArray((JSONArray) value);
}
}
}
return jsonObject;
}
private static void jsonTrimArray(JSONArray array) {
if (array.size() > 0) {
for (int i = 0; i < array.size(); i++) {
Object object = array.get(i);
if (object != null) {
if (object instanceof String) {
array.set(i, ((String) object).trim());
} else if (object instanceof JSONObject) {
jsonTrim((JSONObject) object);
} else if (object instanceof JSONArray) {
jsonTrimArray((JSONArray) object);
}
}
}
}
}
}
JSON 的支持使用的JAR
在此就全部搞定了,有需要的复制即可使用,有用就关注一下吧com.alibaba fastjson 1.2.69_sec11



