时间:2023-06-12 03:15:01 | 来源:网站运营
时间:2023-06-12 03:15:01 来源:网站运营
SpringBoot+Vue+ElementUI实现后台管理系统模板(附代码地址):【官网地址:】 https://www.aliyun.com/【官方文档:】 https://help.aliyun.com/product/44282.html 【使用流程参考文档:】 https://help.aliyun.com/document_detail/59210.html
(2)进入 短信服务 控制台【后台管理系统】您的验证码758644,该验证码5分钟内有效,请勿泄漏于他人!
点击发送短信,该手机号即可接收到短信。【参考文档:】 https://help.aliyun.com/document_detail/112148.html
(1)引入依赖:引入 短信服务所需的 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 短信服务 regionId: cn-hangzhou signName: 后台管理系统 templateCode: SMS_194050461
(3)编写一个工具类 SmsUtil.java 用来操作短信发送。短信发送参数: 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 短信发送工具类 */@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"; /** * 发送短信 */ 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(); // 固定参数,无需修改 request.setSysMethod(MethodType.POST); request.setSysDomain("dysmsapi.aliyuncs.com"); request.setSysVersion("2017-05-25"); request.setSysAction("SendSms"); request.putQueryParameter("RegionId", regionId); // 设置手机号 request.putQueryParameter("PhoneNumbers", phoneNumbers); // 设置签名模板 request.putQueryParameter("SignName", signName); // 设置短信模板 request.putQueryParameter("TemplateCode", templateCode); // 设置短信验证码 request.putQueryParameter("TemplateParam", "{/"code/":" + getCode() +"}"); try { CommonResponse response = client.getCommonResponse(request); System.out.println(response.getData()); // 转换返回的数据(需引入 Gson 依赖) SmsResponse smsResponse = GsonUtil.fromJson(response.getData(), SmsResponse.class); // 当 message 与 code 均为 ok 时,短信发送成功、否则失败 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)); }}
在上面代码中,为了更好地获取到返回数据,使用 Gson 对其数据进行转换(之前博客中已有介绍,此处直接使用,可参考:package com.lyh.admin_template.back.modules.sms.entity;import lombok.Data;/** * 用于接收并转换 sms 返回的数据 */@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 = "短信发送")public class TestSMSController { @Autowired private SmsUtil smsUtil; @ApiOperation(value = "测试短信发送功能") @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("短信发送成功"); } return Result.error().message("短信发送失败"); }}
{ "alg": "HS256", "typ": "JWT"}【注:】 HS256 指的是 HMAC SHA256(默认),一种对称算法,采用同一个密钥生成、验证签名。 RS256 指的是 RSA SHA256,一种非对称算法,采用私钥生成签名,用公钥验证签名。
Payload: 【默认字段:】iss:发行人(JWT 生成的一方)exp:过期时间(要大于 iat)sub:主题aud:用户(接收 JWT 的一方)nbf:在此时间之前 JWT 不可用iat:JWT 发布时间jti:JWT ID用于标识该JWT
Signature: HMACSHA256(base64UrlEncode(header) + "." + base64UrlEncode(claims), secret)【理解:】 对 header、payload 分别进行 Base64URL 加密,使用 点(.)连接。 并根据 header 中指定的 加密算法,使用 secret 对数据再次加密。注: 由于 JWT 可以放在 URL 中(比如:/home?token=xxx), 由于 Base64 中 =、+、/ 在 url 中有特殊含义,使用 base64 生成的 token 会出现问题。 Base64url 对这些符号进行了转换,(去掉 =,用 - 替换 +, 用 _ 替换 /).
<!-- JWT --><dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.0</version></dependency>
(2)创建一个工具类(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 { // 设置过期时间(15 分钟) public static final long EXPIRE = 1000 * 60 * 15; // 设置 jwt 生成 secret(随意指定) public static final String APP_SECRET = "ukc8BDbRigUDaY6pZFfWus2jZWLPHO"; /** * 生成 jwt token */ public static String getJwtToken(String userId, String userName) { String JwtToken = Jwts.builder() // 设置 jwt 类型 .setHeaderParam("typ", "JWT") // 设置 jwt 加密方法 .setHeaderParam("alg", "HS256") // 设置 jwt 主题 .setSubject("admin-user") // 设置 jwt 发布时间 .setIssuedAt(new Date()) // 设置 jwt 过期时间 .setExpiration(new Date(System.currentTimeMillis() + EXPIRE)) // 设置自定义数据 .claim("userId", userId) .claim("userName", userName) // 设置密钥与算法 .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 数据 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")); } /** * 根据 token 获取数据 */ public static Claims getTokenBody(HttpServletRequest request) { return getTokenBody(request.getHeader("token")); } /** * 根据 token 获取数据 */ 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 已过期"); }}
测试结果如下: 定义过期时间为 30s,未过期时,返回 json 数据。来源:
https://www.cnblogs.com/l-y-h/p/13214493.html
GitHub地址:
https://github.com/lyh-man/admin-vue-template.git
关键词:模板,地址,系统,管理,实现,后台