日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区

您的位置:首頁技術文章
文章詳情頁

Vue+Springboot實現接口簽名的示例代碼

瀏覽:29日期:2022-09-30 14:36:12
1、實現思路

接口簽名目的是為了,確保請求參數不會被篡改,請求的數據是否已超時,數據是否重復提交等。

Vue+Springboot實現接口簽名的示例代碼

接口簽名示意圖

客戶端提交請求時,將以下參數按照約定簽名方式進行簽名,隨后將參數和簽名一同提交服務端:

1.請求頭部分(header)appid:針對不同的調用方分配不同的appid。noce:請求的流水號,防止重復提交。timestamp:請求時間戳,驗證請求是否已超時失效。

2.數據部分Path:按照path中的參數將所有key=value進行拼接。Query:按照所有key=value進行拼接。Form:按照所有key=value進行拼接Body:Json,按照所有key=value進行拼接。String,整個字符串作為一個拼接。

Vue+Springboot實現接口簽名的示例代碼

簽名

服務端提接收交請求后,同樣通過接收的“請求頭部分”、“數據部分”的參數進行拼接。隨后驗證客戶端提交的簽名是否正確。

2、代碼實現

客戶端(Vue)首先需要安裝“jsrsasign”庫,以便實現 RSA 加密、解密、簽名、驗簽等功能。官方地址:http://kjur.github.io/jsrsasign/執行以下命令:

npm install jsrsasign -save

安裝完成后,封裝sign.js

import {KJUR, KEYUTIL, hex2b64, b64tohex} from ’jsrsasign’// 簽名算法const ALGORITHM = ’SHA256withRSA’// 私鑰簽名const RSA_SIGN = (privateKey, src) => { const signature = new KJUR.crypto.Signature({’alg’: ALGORITHM}) // 來解析密鑰 const priKey = KEYUTIL.getKey(privateKey) signature.init(priKey) // 傳入待簽明文 signature.updateString(src) const a = signature.sign() // 轉換成base64,返回 return hex2b64(a) }// 公鑰驗簽const RSA_VERIFY_SIGN = (publicKey, src, data) => { const signature = new KJUR.crypto.Signature({’alg’: ALGORITHM, ’prvkeypem’: publicKey}) signature.updateString(src) return signature.verify(b64tohex(data))}export { RSA_SIGN, RSA_VERIFY_SIGN}

客戶端(Vue)通過sign.js進行加簽、驗簽。

const src = ’我是一段測試字符串2’const publicKey = ’-----BEGIN PUBLIC KEY-----n’ + ’MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC35wxzdTzseajkYL06hEKBCEJun’ + ’JQ/nySId2oTnsxbLiSTEjpAESSbML1lqkKaIwjrSFZzyLMH6DirsoEQcATqqoCDUn’ + ’/H9QNVb5jMSAxxdQusQkTWz6k07bEuy1ppVjpGxNi8o2OGNd+lwPC/hOSDR7lpfmn’ + ’aXLIjEwKSXzil7YAHQIDAQABn’ + ’-----END PUBLIC KEY-----’const privateKey = ’-----BEGIN PRIVATE KEY-----n’ + ’MIICdQIBADANBgkqhkiG9w0BAQEFAASCAl8wggJbAgEAAoGBALfnDHN1POx5qORgn’ + ’vTqEQoEIQm4lD+fJIh3ahOezFsuJJMSOkARJJswvWWqQpojCOtIVnPIswfoOKuygn’ + ’RBwBOqqgINT8f1A1VvmMxIDHF1C6xCRNbPqTTtsS7LWmlWOkbE2LyjY4Y136XA8Ln’ + ’+E5INHuWl+ZpcsiMTApJfOKXtgAdAgMBAAECgYB2PAcGSC7mPoW2ZvfiIlx7hurmn’ + ’0885D1hu5yohqUOTklXgRWQUTU+zYRHU8LERJgcZQKoKDXqdIPS584Q2mRe0uZMrn’ + ’vaiaBVEnHQreUJUQ8UN12pPUdBHDZvOk3L7/fZHk6A8uy5e09p2rsn+Vfki3zijpn’ + ’7Pd758HMtjuiHBb2QQJBAOuN6jdWBr/zb7KwM9N/cD1jJd6snOTNsLazH/Z3Yt0Tn’ + ’jlsFmRJ6rIt/+jaLKG6YTR8SFyW5LIQTbreeQHPw4FECQQDH3Wpd/mBMMcgpxLZ0n’ + ’F5p1ieza+VA5fbxkQ0hdubEP26B6YwhkTB/xMSOwEjmUI57kfgOTvub36/peb8rIn’ + ’JdwNAkB3fzwlrGeqMzYkIU15avomuki46TqCvHJ8jOyXHUOzQbuDI5jfDgrAjkECn’ + ’MKBnUq41J/lEMueJbU5KqmaqKrWxAkAyexlHnl1iQVymOBpBXkjUET8y26/IpZp0n’ + ’1I2tpp4zPCzfXK4c7yFOQTQbX68NXKXgXne21Ivv6Ll3KtNUFEPtAkBcx5iWU430n’ + ’0/s6218/enaa8jgdqw8Iyirnt07uKabQXqNnvbPYCgpeswEcSvQqMVZVKOaMrjKOn’ + ’G319Es83iq/mn’ + ’-----END PRIVATE KEY-----n’console.log(’明文:’, src)const data = RSA_SIGN(privateKey, src)console.log(’簽名后的結果:’, data)const res = RSA_VERIFY_SIGN(publicKey, src, data)console.log(’驗簽結果:’, res)

服務端(Spring boot)接收請求后,需要對數據和簽名,進行驗證。

首先引入依賴——hutool工具包,Hutool是一個Java工具包,也只是一個工具包,它幫助我們簡化每一行代碼,減少每一個方法,讓Java語言也可以“甜甜的”。

官網地址:https://www.hutool.cn/

在pom.xml下增加如下配置:

<dependency> <groupId>cn.hutool</groupId> <artifactId>hutool-all</artifactId> <version>5.3.5</version></dependency>

服務端(Spring boot)首先要獲取客戶端(Vue)請求的數據,上文已經描述了請求的數據有兩部分,分別是“請求頭部分”、“數據部分”。所以需要配置攔截器,對以上兩部分進行獲取。

配置攔截器(MyInterceptor.java),代碼如下:

import lombok.extern.slf4j.Slf4j;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;import org.springframework.util.StreamUtils;import org.springframework.web.servlet.HandlerInterceptor;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletResponse;@Slf4j@Componentpublic class MyInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//獲取請求參數String queryString = request.getQueryString();log.info('請求參數:{}', queryString);// 獲取headerlog.info('key:{}',request.getHeader('timestamp'));MyHttpServletRequestWrapper myRequestWrapper = new MyHttpServletRequestWrapper(request);//獲取請求bodybyte[] bodyBytes = StreamUtils.copyToByteArray(myRequestWrapper.getInputStream());String body = new String(bodyBytes, request.getCharacterEncoding());log.info('請求體:{}', body);return true; }}

在獲取“請求體body”時,由于“HttpServletRequest”只能讀取一次,攔截器讀取后,后續Controller在讀取時為空,所以需要重寫HttpServletRequestWrapper:

import org.springframework.util.StreamUtils;import javax.servlet.ReadListener;import javax.servlet.ServletInputStream;import javax.servlet.http.HttpServletRequest;import javax.servlet.http.HttpServletRequestWrapper;import java.io.*;public class MyHttpServletRequestWrapper extends HttpServletRequestWrapper { /** * 緩存下來的HTTP body */ private byte[] body; public MyHttpServletRequestWrapper(HttpServletRequest request) throws IOException {super(request);body = StreamUtils.copyToByteArray(request.getInputStream()); } @Override public ServletInputStream getInputStream() throws IOException {InputStream bodyStream = new ByteArrayInputStream(body);return new ServletInputStream(){ @Override public int read() throws IOException {return bodyStream.read(); } @Override public boolean isFinished() {return false; } @Override public boolean isReady() {return true; } @Override public void setReadListener(ReadListener readListener) { }}; } @Override public BufferedReader getReader() throws IOException {return new BufferedReader(new InputStreamReader(getInputStream())); }}

之后,需要創建過濾器,將“MyHttpServletRequestWrapper” 替換“ServletRequest”,代碼如下:

import lombok.extern.slf4j.Slf4j;import javax.servlet.*;import javax.servlet.http.HttpServletRequest;import java.io.IOException;@Slf4jpublic class RepeatedlyReadFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {ServletRequest requestWrapper = null;if(servletRequest instanceof HttpServletRequest) { requestWrapper = new MyHttpServletRequestWrapper((HttpServletRequest) servletRequest);}if(requestWrapper == null) { filterChain.doFilter(servletRequest, servletResponse);} else { filterChain.doFilter(requestWrapper, servletResponse);} } @Override public void destroy() { }}

之后創建自定義配置,CorsConfig.java,將過濾器、攔截器加入配置:

import com.xyf.interceptor.MyInterceptor;import com.xyf.interceptor.RepeatedlyReadFilter;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.boot.web.servlet.FilterRegistrationBean;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.config.annotation.InterceptorRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurationSupport;@Configurationpublic class CorsConfig extends WebMvcConfigurationSupport { private MyInterceptor myInterceptor; @Autowired public CorsConfig (MyInterceptor myInterceptor){this.myInterceptor = myInterceptor; } // 注冊過濾器 @Bean public FilterRegistrationBean<RepeatedlyReadFilter> repeatedlyReadFilter() {FilterRegistrationBean registration = new FilterRegistrationBean();RepeatedlyReadFilter repeatedlyReadFilter = new RepeatedlyReadFilter();registration.setFilter(repeatedlyReadFilter);registration.addUrlPatterns('/*');return registration; } @Override protected void addInterceptors(InterceptorRegistry registry) {// addPathPatterns添加需要攔截的命名空間;// excludePathPatterns添加排除攔截命名空間registry.addInterceptor(myInterceptor).addPathPatterns('/**');//.excludePathPatterns('/api/sys/login') }}

最后,完成驗簽,代碼如下:

import cn.hutool.core.codec.Base64;import cn.hutool.crypto.SecureUtil;import cn.hutool.crypto.asymmetric.Sign;import cn.hutool.crypto.asymmetric.SignAlgorithm;byte[] data = '我是一段測試字符串2'.getBytes();String publicKey = 'MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC35wxzdTzseajkYL06hEKBCEJun' +'JQ/nySId2oTnsxbLiSTEjpAESSbML1lqkKaIwjrSFZzyLMH6DirsoEQcATqqoCDUn' +'/H9QNVb5jMSAxxdQusQkTWz6k07bEuy1ppVjpGxNi8o2OGNd+lwPC/hOSDR7lpfmn' +'aXLIjEwKSXzil7YAHQIDAQAB';Sign sign = SecureUtil.sign(SignAlgorithm.SHA256withRSA,null,publicKey);//客戶端傳來的簽名String qm = 'IhY3LNuFn0isud1Pk6BL2eJV3Jl/UzDCYsdG9CYyJwOGqwnzStsv/RiYLnVP4bnQh1NRPMazY6ux/5Zz5Ypcx6RI5W1p5BDbO2afuIZX7x/eIu5utwsanhbxEfvm3XOsyuTbnMDh6BQUrXb4gUz9qgt9IXWjQdqnQRRv3ywzWcA=';byte[] signed = Base64.decode(qm);//驗證簽名boolean verify = sign.verify(data, signed);3、公鑰、私鑰生成

可通過一些網站在線生成公鑰、私鑰網址:https://www.bejson.com/enc/rsa/

Vue+Springboot實現接口簽名的示例代碼

bejson在線生成公鑰、私鑰

4、其他問題

由于客戶端加簽、服務端驗簽。所以加簽、驗簽的方式務必一致,否則將無法驗證簽名。Vue、Java有不同的簽名工具庫,使用前要做好測試。

到此這篇關于Vue+Springboot實現接口簽名的示例代碼的文章就介紹到這了,更多相關Springboot 接口簽名內容請搜索好吧啦網以前的文章或繼續瀏覽下面的相關文章希望大家以后多多支持好吧啦網!

標簽: Spring
相關文章:
日本不卡不码高清免费观看,久久国产精品久久w女人spa,黄色aa久久,三上悠亚国产精品一区二区三区
99久久九九| 国产剧情一区二区在线观看| 精品日产乱码久久久久久仙踪林| 久久国产视频网| 88久久精品| 免费在线视频一区| 亚洲色图国产| 日韩一区二区三区高清在线观看| 色狠狠一区二区三区| 日本一区福利在线| 国产欧美日韩精品一区二区三区| 久久国产精品色av免费看| 国产精品网址| jizzjizz中国精品麻豆| 人人精品亚洲| 国产精品试看| 日韩av中文字幕一区二区| 国产精品乱战久久久| 麻豆国产精品视频| 人在线成免费视频| 99精品视频在线| 99pao成人国产永久免费视频 | 视频一区在线视频| 日韩中文字幕视频网| 国产乱码精品一区二区亚洲| 国产91在线精品| 99成人超碰| 亚洲精品精选| 久久精品免视看国产成人| 日韩综合精品| 国产亚洲午夜| 国产欧美日韩在线观看视频| 国产精品www.| 桃色一区二区| 午夜一区在线| 国产精品s色| 久久九九国产| 日韩激情网站| 日韩国产专区| 亚洲综合国产| 国产精品.xx视频.xxtv| 午夜精品成人av| 综合欧美精品| 国产96在线亚洲| 国产精品嫩草99av在线| 国产精品玖玖玖在线资源| 久久男女视频| 亚洲深夜福利在线观看| 精品视频自拍| 夜夜嗨网站十八久久| 国产欧美三级| 亚洲一级高清| 国产伦理久久久久久妇女| 国产99亚洲| 97成人在线| 久久久精品网| 国产精品一区二区三区www | 成人国产精品一区二区免费麻豆| 国产在线日韩| 国产精品免费不| 黄色日韩精品| 麻豆精品在线视频| 好吊日精品视频| 麻豆国产欧美一区二区三区 | 在线日韩一区| 麻豆精品99| 亚洲午夜免费| 久久国产精品成人免费观看的软件| 日韩成人一级| 亚洲激情久久| 岛国av在线播放| 欧美精品国产| 午夜在线视频观看日韩17c| 日本蜜桃在线观看视频| 日本免费一区二区视频| 久久精品官网| 精品一区二区三区中文字幕视频| 天堂va蜜桃一区二区三区| 日韩电影二区| 国产精品99久久免费观看| 免费看精品久久片| 成人看片网站| 精品在线网站观看| 日韩不卡一区二区| 午夜在线一区| 欧美三区四区| 粉嫩av一区二区三区四区五区| 日韩在线电影| 午夜在线精品| 日韩一级不卡| 91精品一区二区三区综合| 久久97久久97精品免视看秋霞| 亚洲精品三级| 久久不射网站| 免费视频亚洲| 天堂√8在线中文| 精品福利久久久| 国产精品videossex| 日本aⅴ精品一区二区三区| 美女网站久久| 精品1区2区3区4区| 99视频精品全国免费| 色一区二区三区| 国产日韩电影| 国产成人免费av一区二区午夜| 青青草国产成人99久久| 日韩精品一二区| 日韩一区二区久久| 欧美精品一线| 精品在线播放| 蜜臀91精品国产高清在线观看| 久久久噜噜噜| 欧美亚洲激情| 在线日韩一区| 亚洲激情久久| 国产亚洲精品久久久久婷婷瑜伽| 中文国产一区| 伊人久久亚洲美女图片| 欧美日韩少妇| 男女男精品网站| 男人的天堂久久精品| 免费在线观看视频一区| 鲁大师影院一区二区三区| 91精品二区| 在线一区欧美| 少妇精品久久久| 91精品视频一区二区| 欧美日韩一区二区高清| 国产精品手机在线播放| 国产精品a久久久久| 久久一区国产| 国产不卡av一区二区| 日韩国产一区二区| 欧美亚洲国产精品久久| 欧美日韩日本国产亚洲在线| 亚洲国产一区二区三区在线播放| 91久久国产| 久久国产精品毛片| 日韩和欧美一区二区三区| 欧美三区不卡| 精品一区二区三区亚洲| 精品国模一区二区三区| 婷婷六月综合| 视频一区视频二区中文字幕| 日本精品在线播放| 国产精品久久久久久久久久妞妞 | 日韩欧美午夜| 亚洲精品a级片| 噜噜噜久久亚洲精品国产品小说| 免费观看在线综合| 国产情侣久久| 高潮一区二区| 国产在线日韩| 日韩一区二区三区四区五区| 久久久久黄色| 国产在线|日韩| 六月天综合网| 欧美黄页在线免费观看| 日韩毛片视频| 久久亚洲精品伦理| 国产三级一区| 色在线视频观看| 免费观看日韩电影| 国产精品麻豆成人av电影艾秋| 一区二区三区四区日本视频| 亚洲欧洲午夜| 欧美亚洲三级| 日韩欧美看国产| 视频一区欧美日韩| 国产精品va| 免费不卡中文字幕在线| 欧美另类中文字幕| 国产一区二区久久久久| 国产高清久久| 国产色噜噜噜91在线精品| 日本少妇一区| 亚欧洲精品视频在线观看| 精品国产麻豆| 激情婷婷综合| 久久黄色影视| 久久国产亚洲| 国产伦一区二区三区| 欧美91福利在线观看| 69堂免费精品视频在线播放| 日韩精品1区| 日韩和欧美的一区| 久久免费黄色| 国产欧美自拍| 亚洲视频www| 成人台湾亚洲精品一区二区| 免费视频最近日韩| 成人免费网站www网站高清| 日韩国产在线观看一区| 久久精品卡一| 欧美激情五月| 亚洲tv在线| 精品在线99| av资源中文在线天堂| 91欧美日韩在线| 午夜久久免费观看|