時間:2023-06-12 03:15:01 | 來源:網(wǎng)站運營
時間:2023-06-12 03:15:01 來源:網(wǎng)站運營
SpringBoot+Vue+ElementUI實現(xiàn)后臺管理系統(tǒng)模板(附代碼地址):【官網(wǎng)地址:】 https://www.aliyun.com/【官方文檔:】 https://help.aliyun.com/product/44282.html 【使用流程參考文檔:】 https://help.aliyun.com/document_detail/59210.html
(2)進入 短信服務(wù) 控制臺【后臺管理系統(tǒng)】您的驗證碼758644,該驗證碼5分鐘內(nèi)有效,請勿泄漏于他人!
點擊發(fā)送短信,該手機號即可接收到短信。【參考文檔:】 https://help.aliyun.com/document_detail/112148.html
(1)引入依賴:引入 短信服務(wù)所需的 jar 包。<!-- aliyun sms --><dependency> <groupId>com.aliyun</groupId> <artifactId>aliyun-java-sdk-core</artifactId> <version>4.5.1</version></dependency>
(2)編寫配置信息# 阿里云配置信息aliyun: # common 配置信息 accessKeyId: LTAI4GEWZbLZocBzXKYEfmmq accessKeySecret: rZLsruKxWex2qGYVA3UsuBgW5B3uJQ # SMS 短信服務(wù) regionId: cn-hangzhou signName: 后臺管理系統(tǒng) templateCode: SMS_194050461
(3)編寫一個工具類 SmsUtil.java 用來操作短信發(fā)送。短信發(fā)送參數(shù): package com.lyh.admin_template.back.common.utils;import com.aliyuncs.CommonRequest;import com.aliyuncs.CommonResponse;import com.aliyuncs.DefaultAcsClient;import com.aliyuncs.IAcsClient;import com.aliyuncs.http.MethodType;import com.aliyuncs.profile.DefaultProfile;import com.lyh.admin_template.back.modules.sms.entity.SmsResponse;import lombok.Data;import org.apache.commons.lang3.StringUtils;import org.springframework.beans.factory.annotation.Value;import org.springframework.stereotype.Component;/** * sms 短信發(fā)送工具類 */@Data@Componentpublic class SmsUtil { @Value("${aliyun.accessKeyId}") private String accessKeyId; @Value("${aliyun.accessKeySecret}") private String accessKeySecret; @Value("${aliyun.signName}") private String signName; @Value("${aliyun.templateCode}") private String templateCode; @Value("${aliyun.regionId}") private String regionId; private final static String OK = "OK"; /** * 發(fā)送短信 */ public boolean sendSms(String phoneNumbers) { if (StringUtils.isEmpty(phoneNumbers)) { return false; } DefaultProfile profile = DefaultProfile.getProfile(regionId, accessKeyId, accessKeySecret); IAcsClient client = new DefaultAcsClient(profile); CommonRequest request = new CommonRequest(); // 固定參數(shù),無需修改 request.setSysMethod(MethodType.POST); request.setSysDomain("dysmsapi.aliyuncs.com"); request.setSysVersion("2017-05-25"); request.setSysAction("SendSms"); request.putQueryParameter("RegionId", regionId); // 設(shè)置手機號 request.putQueryParameter("PhoneNumbers", phoneNumbers); // 設(shè)置簽名模板 request.putQueryParameter("SignName", signName); // 設(shè)置短信模板 request.putQueryParameter("TemplateCode", templateCode); // 設(shè)置短信驗證碼 request.putQueryParameter("TemplateParam", "{/"code/":" + getCode() +"}"); try { CommonResponse response = client.getCommonResponse(request); System.out.println(response.getData()); // 轉(zhuǎn)換返回的數(shù)據(jù)(需引入 Gson 依賴) SmsResponse smsResponse = GsonUtil.fromJson(response.getData(), SmsResponse.class); // 當 message 與 code 均為 ok 時,短信發(fā)送成功、否則失敗 if (SmsUtil.OK.equals(smsResponse.getMessage()) && SmsUtil.OK.equals(smsResponse.getCode())) { return true; } return false; } catch (Exception e) { throw new RuntimeException(e); } } /** * 獲取 6 位驗證碼 */ public String getCode() { return String.valueOf((int)((Math.random()*9+1)*100000)); }}
在上面代碼中,為了更好地獲取到返回數(shù)據(jù),使用 Gson 對其數(shù)據(jù)進行轉(zhuǎn)換(之前博客中已有介紹,此處直接使用,可參考:package com.lyh.admin_template.back.modules.sms.entity;import lombok.Data;/** * 用于接收并轉(zhuǎn)換 sms 返回的數(shù)據(jù) */@Datapublic class SmsResponse { private String Message; private String RequestId; private String Code; private String BizId;}
(4)編寫一個代碼 TestSMSController.java 測試一下。package com.lyh.admin_template.back.modules.sms.controller;import com.lyh.admin_template.back.common.utils.Result;import com.lyh.admin_template.back.common.utils.SmsUtil;import io.swagger.annotations.Api;import io.swagger.annotations.ApiImplicitParam;import io.swagger.annotations.ApiOperation;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RequestParam;import org.springframework.web.bind.annotation.RestController;@RestController@RequestMapping("/sms")@Api(tags = "短信發(fā)送")public class TestSMSController { @Autowired private SmsUtil smsUtil; @ApiOperation(value = "測試短信發(fā)送功能") @ApiImplicitParam(name = "phoneNumber", required = true, value = "手機號", paramType = "query", dataType = "String") @PostMapping("/testSend") public Result testSend(@RequestParam String phoneNumber) { if (smsUtil.sendSms(phoneNumber)) { return Result.ok().message("短信發(fā)送成功"); } return Result.error().message("短信發(fā)送失敗"); }}
{ "alg": "HS256", "typ": "JWT"}【注:】 HS256 指的是 HMAC SHA256(默認),一種對稱算法,采用同一個密鑰生成、驗證簽名。 RS256 指的是 RSA SHA256,一種非對稱算法,采用私鑰生成簽名,用公鑰驗證簽名。
Payload: 【默認字段:】iss:發(fā)行人(JWT 生成的一方)exp:過期時間(要大于 iat)sub:主題aud:用戶(接收 JWT 的一方)nbf:在此時間之前 JWT 不可用iat:JWT 發(fā)布時間jti:JWT ID用于標識該JWT
Signature: HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(claims), secret)【理解:】 對 header、payload 分別進行 Base64URL 加密,使用 點(.)連接。 并根據(jù) header 中指定的 加密算法,使用 secret 對數(shù)據(jù)再次加密。注: 由于 JWT 可以放在 URL 中(比如:/home?token=xxx), 由于 Base64 中 =、+、/ 在 url 中有特殊含義,使用 base64 生成的 token 會出現(xiàn)問題。 Base64url 對這些符號進行了轉(zhuǎn)換,(去掉 =,用 - 替換 +, 用 _ 替換 /).
<!-- JWT --><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.0</version></dependency>
(2)創(chuàng)建一個工具類(JwtUtil.java)用于操作 JWT。package com.lyh.admin_template.back.common.utils;import io.jsonwebtoken.Claims;import io.jsonwebtoken.Jws;import io.jsonwebtoken.Jwts;import io.jsonwebtoken.SignatureAlgorithm;import org.apache.commons.lang3.StringUtils;import javax.servlet.http.HttpServletRequest;import java.util.Date;/** * JWT 操作工具類 */public class JwtUtil { // 設(shè)置過期時間(15 分鐘) public static final long EXPIRE = 1000 * 60 * 15; // 設(shè)置 jwt 生成 secret(隨意指定) public static final String APP_SECRET = "ukc8BDbRigUDaY6pZFfWus2jZWLPHO"; /** * 生成 jwt token */ public static String getJwtToken(String userId, String userName) { String JwtToken = Jwts.builder() // 設(shè)置 jwt 類型 .setHeaderParam("typ", "JWT") // 設(shè)置 jwt 加密方法 .setHeaderParam("alg", "HS256") // 設(shè)置 jwt 主題 .setSubject("admin-user") // 設(shè)置 jwt 發(fā)布時間 .setIssuedAt(new Date()) // 設(shè)置 jwt 過期時間 .setExpiration(new Date(System.currentTimeMillis() + EXPIRE)) // 設(shè)置自定義數(shù)據(jù) .claim("userId", userId) .claim("userName", userName) // 設(shè)置密鑰與算法 .signWith(SignatureAlgorithm.HS256, APP_SECRET) // 生成 token .compact(); return JwtToken; } /** * 判斷token是否存在與有效,true 表示未過期,false 表示過期或不存在 */ public static boolean checkToken(String jwtToken) { if (StringUtils.isEmpty(jwtToken)) { return false; } try { // 獲取 token 數(shù)據(jù) Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken); // 判斷是否過期 return claimsJws.getBody().getExpiration().after(new Date()); } catch (Exception e) { throw new RuntimeException(e); } } /** * 判斷token是否存在與有效 */ public static boolean checkToken(HttpServletRequest request) { return checkToken(request.getHeader("token")); } /** * 根據(jù) token 獲取數(shù)據(jù) */ public static Claims getTokenBody(HttpServletRequest request) { return getTokenBody(request.getHeader("token")); } /** * 根據(jù) token 獲取數(shù)據(jù) */ public static Claims getTokenBody(String jwtToken) { if (StringUtils.isEmpty(jwtToken)) { return null; } Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken); return claimsJws.getBody(); }}
(3)編寫一個測試類(TestJWTController.java) ,用于測試package com.lyh.admin_template.back.controller.test;import com.lyh.admin_template.back.common.utils.JwtUtil;import com.lyh.admin_template.back.common.utils.Result;import io.jsonwebtoken.Claims;import io.swagger.annotations.Api;import io.swagger.annotations.ApiOperation;import org.springframework.web.bind.annotation.PostMapping;import org.springframework.web.bind.annotation.RequestMapping;import org.springframework.web.bind.annotation.RestController;@RequestMapping("/test/jwt")@RestController@Api(tags = "測試 JWT")public class TestJWTController { @ApiOperation(value = "獲取 token") @PostMapping("/getToken") public Result testJwt() { return Result.ok().data("token", JwtUtil.getJwtToken("1", "tom")); } @ApiOperation(value = "測試是否過期") @PostMapping("/testExpire") public Result testJwtExpire(String jwtToken) { if (JwtUtil.checkToken(jwtToken)) { Claims claims = JwtUtil.getTokenBody(jwtToken); return Result.ok().message("token 未過期").data("claims", claims); } return Result.ok().message("token 已過期"); }}
測試結(jié)果如下: 定義過期時間為 30s,未過期時,返回 json 數(shù)據(jù)。來源:
https://www.cnblogs.com/l-y-h/p/13214493.html
GitHub地址:
https://github.com/lyh-man/admin-vue-template.git
關(guān)鍵詞:模板,地址,系統(tǒng),管理,實現(xiàn),后臺
微信公眾號
版權(quán)所有? 億企邦 1997-2025 保留一切法律許可權(quán)利。