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

个人网站模板代码门户型网站都有哪些

个人网站模板代码,门户型网站都有哪些,王烨燃中国中医科学院,网站开发工程师优势一、何为签名 我们知道无论是restful api还是传统接口、亦或是其他形式接口的调用#xff0c;接口签名都是非常重要的安全机制#xff0c;它可以确保请求的发起者是经过认证和授权的客户端#xff0c;同时也可以防止接口被攻击#xff0c;请求参数被篡改等等。 用大白话来解… 一、何为签名 我们知道无论是restful api还是传统接口、亦或是其他形式接口的调用接口签名都是非常重要的安全机制它可以确保请求的发起者是经过认证和授权的客户端同时也可以防止接口被攻击请求参数被篡改等等。 用大白话来解释就是如果你写的接口没有签名验证那么不管是谁都可以调用只要路径、参数是对的就可以调用这样就会非常不安全因此我们会对接口添加签名验证。 首先我们要了解原理举个例子来讲假设有一场线上的会议而会议室呢并不是谁都可以进去的光有会议室号是不行的还需要密码如果更严格一些可能还需要填写公共的信息内容等那这些密码信息等都是实现约定好的提供给相关人就可以。 同理签名也是双方约定好的客户端(调用接口的用户)需要带着事先约定好的签名去调用然后服务端被调用需要对这个签名进行验证如果是他约定好的那么就放行让其直接调用即可。 二、签名设计 那么签名该如何设计呢那就要说道签名的规则了。 签名一般会包括以下几部分 appid 和 app\secret timestamp 时间戳 version 版本号 signature 所有数据的签名信息。 接下来依次介绍他们的作用 1) appid appsecret appid 应用的标识   appsecret私匙相当于密码 通常我们会线下分配appid和appsecret也就是提前声明好针对不同的调用方分配不同的appid和appsecret。一般来说appid 和appsecret是一一对应的用于对接口数据进行加密、解密。 2) timestamp时间戳用时间戳可以防止暴力请求 sign机制可以防止参数被篡改但无法防ddos攻击第三方使用正确的参数不停的请求服务器使之无法正常提供服务。因此还需要引入时间戳机制。 而服务端则需要根据当前时间和sign值的时间戳进行比较差值超过一段时间则不予通过客户端的请求直接给客户端响应某些错误提示等。 若要求不高则客户端和服务端可以仅仅使用精确到秒或分钟的时间戳据此形成sign值来校验有效性。这样可以使一秒或一分钟内的请求是有效的。 若要求较高则还需要约定一个解密算法使服务端可以从sign值中解析出发起请求的时间戳。 3) 版本号version 防止重复提交至少为10位。针对查询接口版本号只用于日志落地便于后期日志核查。 针对办理类接口需校验流水号在有效期内的唯一性以避免重复请求。 4signature signature 的规则可以随便定义按照自己的想法即可我们以 md5(sort(body)appSecret)举例即 先对请求体的字段按照字母a-z顺序进行排序然后在其尾部拼接appSecret再经过md5计算出签名然后用户在请求中添加签名即可。 正常会将appid、timestamp、nonce、signature这四个字段放入请求头中但我们这里暂时定义规则为只要将body中的key按照大小顺序排好序以后在拼接上appsecret即可。 三、代码演示 1、传统的http请求 package com.demo.test;import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.alibaba.fastjson.JSON; import com.alibaba.fastjson.JSONObject; import com.alibaba.fastjson.serializer.SerializerFeature; import com.fasterxml.jackson.databind.JsonNode; import com.jfinal.aop.Clear; import com.jfinal.core.Controller; import com.jfinal.kit.Prop; import com.jfinal.kit.PropKit; import oracle.jdbc.proxy.annotation.Post; import org.apache.commons.codec.digest.DigestUtils; import org.apache.commons.lang3.StringUtils; import org.apache.log4j.LogManager; import org.apache.log4j.Logger;import javax.servlet.ServletInputStream; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.*;Clear public class DemoController extends Controller {private static final long EXPIRE_TIME 10 * 60 * 1000; // 10分钟的毫秒数public void save() throws IOException {// 检查请求方法是否为 POSTif (!POST.equalsIgnoreCase(getRequest().getMethod())) {System.out.println(Request method getRequest().getMethod());renderText(Only POST requests are allowed for this method.);return;}// 获取请求头信息String headerValue getHeader(sign);System.out.println(Header Value: headerValue);// 获取请求参数String paramValue getPara(paramName);System.out.println(Request Parameter Value: paramValue);// 获取请求 URLString requestUrl getRequest().getRequestURL().toString();System.out.println(Request URL: requestUrl);// 获取请求体信息String requestBody getRawRequestBody(getRequest().getInputStream());System.out.println(Request Body: requestBody);JSONObject pass validateSign(headerValue,requestBody);if(pass.getString(success).equals(false)){logger.warn(签名认证失败请求接口{}请求IP{}请求参数{}requestUrl JSON.toJSONString(paramValue)); // String url request.getRequestURI()? getIpAddress(request) JSON.toJSONString(request.getParameterMap()); // CacheKit.put(eam, url, url);renderJson(pass);}else{//成功逻辑renderJson(pass);} // renderText(POST request processed);}private JSONObject validateSign(String requestSign,String requestBody) throws IOException {JSONObject reponseJson new JSONObject();String msg;boolean flag;try {if (StringUtils.isEmpty(requestSign)) {logger.info(签名为空, signature requestSign);msg 签名为空;reponseJson.put(msg, msg);reponseJson.put(flag, false);return reponseJson;}//时间戳JSONObject jsonObject JSONObject.parseObject(requestBody);Long now System.currentTimeMillis();Long requestTimestamp Long.parseLong( jsonObject.getString(timestamp));if ((now - requestTimestamp) EXPIRE_TIME) {logger.info(请求时间超过规定范围时间10分钟, signature requestSign);msg 请求时间超过规定范围时间10分钟;reponseJson.put(msg, msg);reponseJson.put(flag, false);return reponseJson;}//排序 requestBodyString body sortJsonString(requestBody);//获取密钥,这里密钥为了方便写在了配置文件中可随意定义一些复杂内容如jgjgro4h3h5b5b5b9nnkx0fkeProp p PropKit.use(config.properties);String secret p.get(emsSecret);String ls body secret;String sign DigestUtils.md5Hex(ls.getBytes());//混合密钥md5,加密后的sign用它来和请求传过来的sign对比如果一致则通过if(StringUtils.equals(sign, requestSign)){logger.info(请求时间超过规定范围时间10分钟, signature requestSign);msg 请求成功;reponseJson.put(msg, msg);reponseJson.put(flag, true);return reponseJson;}else {msg 请求失败sign不匹配;reponseJson.put(msg, msg);reponseJson.put(flag, false);return reponseJson;}}catch (Exception e){logger.error(Error in execute EmaController. The wrong message is: e.getMessage());}msg 请求失败;reponseJson.put(msg, msg);reponseJson.put(flag, false);return reponseJson;}private static String sortJsonString(String requestBody) throws JsonProcessingException {// 将 JSON 字符串转换为 JsonNodeObjectMapper objectMapper new ObjectMapper();JsonNode jsonNode objectMapper.readTree(requestBody);// 使用 TreeMap 对属性进行排序TreeMapString, JsonNode sortedProperties new TreeMap();IteratorMap.EntryString, JsonNode fields jsonNode.fields();while (fields.hasNext()) {Map.EntryString, JsonNode entry fields.next();sortedProperties.put(entry.getKey(), entry.getValue());}// 创建新的 JsonNode按照字母a-z的顺序排列JsonNode sortedJsonNode objectMapper.valueToTree(sortedProperties);// 将排序后的 JsonNode 转换回 JSON 字符串String sortedJsonString objectMapper.writeValueAsString(sortedJsonNode);// 输出排序后的 JSON 字符串return sortedJsonString;}// 读取请求体的方法private String getRawRequestBody(ServletInputStream inputStream) {StringBuilder stringBuilder new StringBuilder();BufferedReader bufferedReader null;try {bufferedReader new BufferedReader(new InputStreamReader(inputStream));char[] charBuffer new char[128];int bytesRead;while ((bytesRead bufferedReader.read(charBuffer)) ! -1) {stringBuilder.append(charBuffer, 0, bytesRead);}} catch (IOException e) {e.printStackTrace();} finally {if (bufferedReader ! null) {try {bufferedReader.close();} catch (IOException e) {e.printStackTrace();}}}return stringBuilder.toString();} }2、Restful风格 这里由于无法直接获取请求体因此封装了个方法getRawRequestBody 如果是采用restful风格开发可以直接通过ReqequstBody MapString Stringparams获取请求体如: RestController public class UserController {PostMapping(/test)public void createUser(RequestBody MapString String body) {// 在这里处理System.out.pring(body);} } 获取请求参数如: RequestMapping(value /test, method RequestMethod.POST) ResponseBody public StringTestUrl(RequestParam(username)String username, RequestParam(pwd)String pwd) {String txt username pwd;return txt; } 暂时先写到这里。。。未完
http://www.dnsts.com.cn/news/38779.html

相关文章:

  • 简洁 手机 导航网站模板下载安装厦门网站建设优化企业
  • html5 单页 响应式 网站模板微信小程序视频网站开发教程
  • 汕头有没有做网站做好网站外链建设的最新方法
  • 建立网站的意义网站建设实践论文
  • 广东网站开发哪家强广东省农业农村厅官网查询
  • 网站建设费能算作无形资产吗购物网站首页图片
  • 网站开发 技术路线新闻软文发布平台
  • 企业网站建设 价格南京广告公司地址
  • 网站搜索框代码怎么做自适应网站什么做
  • 网站建设 核算做淘宝链接模板网站
  • 发泡机 东莞网站建设俄语网站建设
  • 中山本地网站建设如何注册网络公司
  • 县科协微网站建设三网合一 网站建设
  • 做网站大作业的心得体会云服务器上放多个网站
  • wordpress 视频教程wordpress KeyWords优化
  • 旅游电子商务网站规划书用什么软件可以做网站动态
  • 建设网站公司怎么收费做网站要icp备案吗
  • 环保网站模板代码wordpress 机械 主题
  • 公司建设网站公司哈尔滨网站开发制作
  • wordpress设计师主题单页关键词优化费用
  • 以个人名义可以做网站吗登录不了建设银行网站
  • 音乐网站的音乐怎么做音乐试听南京江北建设有限公司
  • asp做的是系统还是网站网络建站程序
  • 南通手机建站模板东方资产营销网站
  • 做网站的人跑了网站可以恢复吗响应式网站微博视频教程
  • 微信公众号排版appseo网站建设公司
  • 动力网站固定ip做网站和域名区别
  • 网站促销计算北京企业网站建设公司
  • 企业网站建设方案书目录wordpress改背景
  • 商业网站开发实训报告总结适合前端做项目的网站