当前位置: 首页 > news >正文

扫黄打非网站建设培训报名

扫黄打非网站建设,培训报名,无锡 公共建设中心网站,本地佛山企业网站建设这两天 一直和京东对接接口#xff0c;我们用.net api 提供接口#xff0c;对方用java调用#xff0c;本来没什么问题#xff0c;但是对方对数据安全要求特别严#xff0c;要验签#xff0c;于是噩梦开始了。 1、在传输的时候#xff0c;约定传输格式#xff1a; HttpW…这两天 一直和京东对接接口我们用.net api 提供接口对方用java调用本来没什么问题但是对方对数据安全要求特别严要验签于是噩梦开始了。 1、在传输的时候约定传输格式 HttpWebRequest request (HttpWebRequest)WebRequest.Create(Url);// ?RequestData paramrequest.Method POST;request.ContentType application/json;//参数是接送//request.ContentType application/x-www-form-urlencoded;//参数为拼接request.ContentLength param.Length;   2、双方平台对编码不一致所以在对数据进行MD5加密前先进行UTF8编码 byte[] md5Token md5.ComputeHash(Encoding.UTF8.GetBytes(data));string base64Token Convert.ToBase64String(md5Token); 3、我们遇到了这个问题https://bbs.csdn.net/topics/340058520 具体的描述就是C#和java对二进制的编码值不一样 java byte : -128~127C#   byte : 0~255 但是这只是视觉欺骗做硬件的经理说虽然两边看到对字符的编码得到的值不一样但是实际上计算机对这个的值的识别是一样的。所以这根本就不是个问题。但是对方特别有毅力反复的试了各种编码格式于是我就跟在他后面一个一个的试又是远程合作不得不佩服研究生果然比我这种本科毕业的做事有毅力然而最后发现是他在做加密的时候忘记把私钥放进去了。哎感觉身体被掏空┭┮﹏┭┮ 4、Cookie在传输的过程中、/、会丢失所以使用了替换 string base64Token2 base64Token.Replace(, -).Replace(/, _).Replace(, *); 5、我们使用模型接收数据这时候会出现数据接收不到的情况那么上面1的ContentType 就显得比较重要了既然我上面已经注释了就不多写了。 6、应为我们使用模型接收数据而对方见有的数据不是必填的所以就没有写这样对方填3个参数进行加密计算而我这边会把没有填的null值也加进来进行加密计算并且计算的时候我们这边采用序列化使用两边还要对参数进行排序所以我们的加密结果始终不一样崩溃┭┮﹏┭┮中间考虑过用string接收参数但是api不支持直接接收string参数必须要加一个[FromBody]的标记然而问题有开始来了对方的请求根本进不来继续崩溃┭┮﹏┭┮。最终我们还是使用模型对数据进行接收不过接收参数的方式改了一下用流来接收这样对方传什么我们接收的就是什么具体代码如下 这是原来的代码 var jsonSetting new JsonSerializerSettings { NullValueHandling NullValueHandling.Ignore };var dataOld JsonConvert.SerializeObject(actionContext.ActionArguments[ArgumentsName], Formatting.Indented, jsonSetting);//这两行用来去除为空的参数 dataOld JsonSort.SortJson(JToken.Parse(dataOld), null);//排序 这是修改后的代码 Stream stream HttpContext.Current.Request.InputStream;StreamReader streamReader new StreamReader(stream);responseJson streamReader.ReadToEnd(); 可以看到 接收参数的方式由 actionContext.ActionArguments[ArgumentsName] 换成了下面的 streamReader.ReadToEnd()如果有哪位大神指导string类型的怎么发送怎么接收还请告知一下毕竟第一次做没有经验   7、整体的验签处理使用的是ActionFilterAttribute 拦截具体的思路就是将秘钥各自保存一份将数据用秘钥加密然后将验签的Token可用户标识不是秘钥写一份到cookie里面然后逻辑上就可以不做任何更改直接使用啦 具体的代码如下但是验签部分因为对方是京东还是省略的好大家可以根据自己的应用场景脑补 using Aito.Entity; using Aito.ServBll.JDBll; using Newtonsoft.Json; using Newtonsoft.Json.Linq; using System; using System.Collections.Generic; using System.IO; using System.Linq; using System.Net; using System.Net.Http; using System.Net.Http.Headers; using System.Security.Cryptography; using System.Text; using System.Threading; using System.Threading.Tasks; using System.Web; using System.Web.Http; using System.Web.Http.Controllers; using System.Web.Http.Filters; using System.Web.Script.Serialization; using ZP.Comm;namespace Aito.JDService {/// summary/// 在action执行前后做额外处理/// /summarypublic class TokenProjectorAttribute : ActionFilterAttribute{public string TokenName { get; set; } Token;public string UserTagName { get; set; } UserTag;public string ArgumentsName { get; set; } RequestData;public string UserInfoName { get; set; } UserInfo;/// summary/// 在action执行之前验证Token的合法性/// /summary/// param nameactionContext/param//public override void OnActionExecuting(HttpActionContext actionContext)public override Task OnActionExecutingAsync(HttpActionContext actionContext, CancellationToken cancellationToken){string token ,tag;CookieHeaderValue cookieToken actionContext.Request.Headers.GetCookies(TokenName).FirstOrDefault();//从cookie中取出Tokenif (cookieToken null)ThrowException(new JDServiceModelstring() { Success false, Code -4001, Msg Token不能为空!, Data });CookieHeaderValue cookieTag actionContext.Request.Headers.GetCookies(UserTagName).FirstOrDefault();//从cookie中取出用户标识if (cookieTag null)ThrowException(new JDServiceModelstring() { Success false, Code -4002, Msg 用户标识能为空!, Data });token cookieToken[TokenName].Value;//获取到Tokentag cookieToken[UserTagName].Value;//获取到Tagint userID -1;if(!int.TryParse(tag,out userID))ThrowException(new JDServiceModelstring() { Success false, Code -4007, Msg 用户标识错误!, Data });//验证用户合法性if (CommOpreJD.UserInfos.Where(u u.UserID userID).Count() 1)ThrowException(new JDServiceModelstring() { Success false, Code -4003, Msg 用户标识不合法!, Data });//验证数据的合法性if (!actionContext.ActionArguments.ContainsKey(ArgumentsName))ThrowException(new JDServiceModelstring() { Success false, Code -4004, Msg 请求参数不能为空!, Data });string msg 68行请求Token token \n;msg UserTag tag \n;ErrHandler.WriteServerInfo(msg);//参数验证var modelState actionContext.ModelState;if (!modelState.IsValid){string error string.Empty;foreach (var key in modelState.Keys){var state modelState[key];if (state.Errors.Any()){error state.Errors.First().ErrorMessage;if (String.IsNullOrEmpty(error)){error 请求参数缺失或错误;}break;}}ThrowException(new JDServiceModelstring() { Success false, Code -4008, Msg 参数验证失败- error, Data });}//参数验证//校验数据是否被篡改UserInfoServModel model CommOpreJD.UserInfos.Where(u u.UserID userID).ToList()[0];#region 验签string responseJson string.Empty;try{Stream stream HttpContext.Current.Request.InputStream;StreamReader streamReader new StreamReader(stream);responseJson streamReader.ReadToEnd();//responseJson JsonSort.SortJson(JToken.Parse(responseJson), null);}catch { }//var jsonSetting new JsonSerializerSettings { NullValueHandling NullValueHandling.Ignore };//var dataOld JsonConvert.SerializeObject(actionContext.ActionArguments[ArgumentsName], Formatting.Indented, jsonSetting);//这两行用来去除为空的参数//dataOld JsonSort.SortJson(JToken.Parse(dataOld), null);此处为验签操作目的是计算出 base64Token2 msg 108行用户数据 data \n;msg 用户Token token \n;msg 校验Token base64Token2 \n;ErrHandler.WriteServerInfo(msg);if (base64Token2 ! token)ThrowException(new JDServiceModelstring() { Success false, Code -4005, Msg 数据被篡改!, Data });#endregion actionContext.Request.Properties[UserInfoName] model;return base.OnActionExecutingAsync(actionContext, cancellationToken);}private void ThrowException(JDServiceModelstring exp){var response new HttpResponseMessage();response.Content new StringContent(new JavaScriptSerializer().Serialize(exp));response.StatusCode HttpStatusCode.Conflict;throw new HttpResponseException(response);}/// summary/// 在Action方法调用后result方法调用前执行使用场景异常处理。/// /summary/// param nameactionExecutedContext/param//public override void OnActionExecuted(HttpActionExecutedContext actionExecutedContext)public override Task OnActionExecutedAsync(HttpActionExecutedContext actionExecutedContext, CancellationToken cancellationToken){string resultData GetResponseValues(actionExecutedContext);object user null;if (!actionExecutedContext.Request.Properties.TryGetValue(UserInfoName, out user))ThrowException(new JDServiceModelstring() { Success false, Code -4006, Msg 数据返回时用户信息丢失!, Data });//HttpStatusCode StatusCode actionExecutedContext.ActionContext.Response.StatusCode;// 取得由 API 返回的状态代码JDServiceModelstring result actionExecutedContext.ActionContext.Response.Content.ReadAsAsyncJDServiceModelstring().Result;// 取得由 API 返回的资料result.Success actionExecutedContext.ActionContext.Response.IsSuccessStatusCode; //请求是否成功此处为验签操作目的是计算出 base64Token2 result.Token base64Token2;// 重新封装回传格式actionExecutedContext.Response ToJson(result);string msg 返回数据 result.Data \n;msg 返回Token base64Token2 \n;ErrHandler.WriteServerInfo(msg);ErrHandler.WriteServerInfo(msg);return base.OnActionExecutedAsync(actionExecutedContext, cancellationToken);//base.OnActionExecuted(actionExecutedContext);}/// summary/// 读取action返回的result/// /summary/// param nameactionExecutedContext/param/// returns/returnsprivate string GetResponseValues(HttpActionExecutedContext actionExecutedContext){Stream stream actionExecutedContext.Response.Content.ReadAsStreamAsync().Result;Encoding encoding Encoding.UTF8;/*这个StreamReader不能关闭也不能dispose 关了就傻逼了因为你关掉后后面的管道 或拦截器就没办法读取了*/var reader new StreamReader(stream, encoding);string result reader.ReadToEnd();/*这里也要注意 stream.Position 0; 当你读取完之后必须把stream的位置设为开始因为request和response读取完以后Position到最后一个位置交给下一个方法处理的时候就会读不到内容了。*/stream.Position 0;return result;}private HttpResponseMessage ToJson(Object obj){String str;if (obj is String || obj is Char)//如果是字符串或字符直接返回{str obj.ToString();}else//否则序列为json字串{JavaScriptSerializer serializer new JavaScriptSerializer();str serializer.Serialize(obj);}HttpResponseMessage result new HttpResponseMessage { Content new StringContent(str, Encoding.GetEncoding(UTF-8), application/json) };return result;}} }   参考出处 https://www.cnblogs.com/hnsongbiao/p/7039666.html   https://www.cnblogs.com/goodlucklzq/p/4481956.html  转载于:https://www.cnblogs.com/bamboo-zhang/p/9177087.html
http://www.zqtcl.cn/news/537262/

相关文章:

  • 烟台住房和城乡建设厅网站重庆网站界面设计
  • 企业网站推广服务协议html编程语言
  • 上海知名网站建设公司合肥建设云平台证书查询
  • 网站响应度西安哪家公司做的网站好
  • 广州市白云区网站建设维护wordpress如何匹配模板
  • 360网站导航公司地址怎么做seo 优化一般包括哪些内容
  • 龙岗高端建设网站建设南京旅游网页设计
  • 企业网站优化问题wordpress滑动
  • 亳州网站建设费用广东网站建设报价
  • ai生成作文网站驾校网站源码下载
  • icon图标素材下载网站郑州做定制网站的公司
  • 网站建设培训哪家好北京有几个区几个县
  • 县局网站建设招标最新网页游戏传奇
  • 咋么做进网站跳转加群代理记账公司如何寻找客户
  • 可以做pos机的网站app网站建设制作
  • 手机移动端网站影视摄影传媒公司
  • 做化工资讯的网站湖南省做网站的
  • 廊坊哪些公司做网站做网站域名是什么意思
  • 印刷网络商城网站建设上海那家公司做响应式网站建设
  • 四川省建设厅职称查询网站购物网站页面设计
  • 网站开发导航可以进不良网站的浏览器
  • 一个中介平台网站的建设费wordpress 文章列表只显示标题
  • 网站建设包括两个方面聊城建设路小学网站
  • 怎么样做一个自己的网站遵义软件制作平台
  • 推广网站实例建设厅的证在哪里查询
  • 分类网站建设方案做学校教务处网站
  • 如何做链接淘宝客的网站只做画册的网站
  • docker可以做网站吗专业的营销型网站
  • 重庆市建设工程安全网站上海制造网站公司
  • 咨询网站公司建设计划书安卓软件开发软件