单点登录1

sso单点登录

1.session的复制

2.cookie+redis 将数据保存在redis中返回给cookie保存,查询redis有没有数据

3.token(令牌)实现  生成一字符串

 1.保存在url字符串地址,携带用户信息

2.字符串保存在cookie中

jwt:一个规定好的规则,token生成的字符串就是按照这个规则生成的。

 

使用jwt

1.引入依赖

<!-- JWT-->
<dependency>
<groupId>io.jsonwebtoken</groupId>
<artifactId>jjwt</artifactId>
</dependency>

2.工具类

public class JwtUtils {

public static final String APP_SECRET = "ukc8BDbRigUDaY6pZFfWus2jZWLPHO";

private static Key getKeyInstance(){
SignatureAlgorithm signatureAlgorithm = SignatureAlgorithm.HS256;
byte[] bytes = DatatypeConverter.parseBase64Binary(APP_SECRET);
return new SecretKeySpec(bytes,signatureAlgorithm.getJcaName());
}

public static String getJwtToken(JwtInfo jwtInfo, int expire){

String JwtToken = Jwts.builder()
.setHeaderParam("typ", "JWT")
.setHeaderParam("alg", "HS256")
.setSubject("MindSchool-user")//主题
.setIssuedAt(new Date())//颁发时间
.setExpiration(DateTime.now().plusSeconds(expire).toDate())//过期时间
.claim("id", jwtInfo.getId())//用户id

.claim("nickname", jwtInfo.getNickname())//用户昵称
.claim("avatar", jwtInfo.getAvatar())//用户头像
.signWith(SignatureAlgorithm.HS256, getKeyInstance())
.compact();

return JwtToken;
}

/**
* 判断token是否存在与有效
* @param jwtToken
* @return
*/
public static boolean checkJwtTToken(String jwtToken) {
if(StringUtils.isEmpty(jwtToken)) return false;
try {
Jwts.parser().setSigningKey(getKeyInstance()).parseClaimsJws(jwtToken);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}

/**
* 判断token是否存在与有效
* @param request
* @return
*/
public static boolean checkJwtTToken(HttpServletRequest request) {
try {
String jwtToken = request.getHeader("token");
if(StringUtils.isEmpty(jwtToken)) return false;
Jwts.parser().setSigningKey(getKeyInstance()).parseClaimsJws(jwtToken);
} catch (Exception e) {
e.printStackTrace();
return false;
}
return true;
}

 

 

/**
* 根据token获取会员id
* @param request
* @return
*/
public static JwtInfo getMemberIdByJwtToken(HttpServletRequest request) {
String jwtToken = request.getHeader("token");
if(StringUtils.isEmpty(jwtToken)) return null;
Jws<Claims> claimsJws = Jwts.parser().setSigningKey(getKeyInstance()).parseClaimsJws(jwtToken);
Claims claims = claimsJws.getBody();
JwtInfo jwtInfo = new JwtInfo(claims.get("id").toString(), claims.get("nickname").toString(), claims.get("avatar").toString());
// JwtInfo jwtInfo = new JwtInfo(claims.get("id").toString(), claims.get("nickname").toString(), claims.get("avatar").toString(), claims.get("age").toString(), claims.get("sex").toString(), claims.get("mobile").toString());
return jwtInfo;
}
}

//public class JwtUtils {
//
// //常量
// public static final long EXPIRE = 1000 * 60 * 60 * 24; //token过期时间
// public static final String APP_SECRET = "ukc8BDbRigUDaY6pZFfWus2jZWLPHO"; //秘钥加密操作
//
// //生成token字符串的方法
// public static String getJwtToken(String id, String nickname){
//
// String JwtToken = Jwts.builder()
// /*jwt头信息*/
// .setHeaderParam("typ", "JWT")
// .setHeaderParam("alg", "HS256")
//
// /*设置过期时间*/
// .setSubject("MindSchool-user") //主题
// .setIssuedAt(new Date()) //颁发时间
// .setExpiration(new Date(System.currentTimeMillis() + EXPIRE))
//
// //设置token主体部分 ,存储用户信息
// .claim("id", id)
// .claim("nickname", nickname)
//
// /*签名哈希*/
// .signWith(SignatureAlgorithm.HS256, APP_SECRET)
// .compact();
//
// return JwtToken;
// }
//
// /**
// * 判断token是否存在与有效
// * @param jwtToken
// * @return
// */
// public static boolean checkToken(String jwtToken) {
// if(StringUtils.isEmpty(jwtToken)) return false;
// try {
// Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
// } catch (Exception e) {
// e.printStackTrace();
// return false;
// }
// return true;
// }
//
// /**
// * 判断token是否存在与有效
// * @param request
// * @return
// */
// public static boolean checkToken(HttpServletRequest request) {
// try {
// String jwtToken = request.getHeader("token");
// if(StringUtils.isEmpty(jwtToken)) return false;
// Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
// } catch (Exception e) {
// e.printStackTrace();
// return false;
// }
// return true;
// }
//
// /**
// * 根据token字符串获取会员id
// * @param request
// * @return
// */
// public static String getMemberIdByJwtToken(HttpServletRequest request) {
// String jwtToken = request.getHeader("token");
// if(StringUtils.isEmpty(jwtToken)) return "";
// Jws<Claims> claimsJws = Jwts.parser().setSigningKey(APP_SECRET).parseClaimsJws(jwtToken);
// Claims claims = claimsJws.getBody();
// return (String)claims.get("id");
// }
//}

 

阿里短信服务

1.引入依赖

<dependencies>
<!--json转换工具-->
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
</dependency>

<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
</dependency>
</dependencies>

2.代码实现

工具类


/**
* 获取随机数
* @author
*
*/
public class RandomUtil {

private static final Random random = new Random();

private static final DecimalFormat fourdf = new DecimalFormat("0000");

private static final DecimalFormat sixdf = new DecimalFormat("000000");

public static String getFourBitRandom() {
return fourdf.format(random.nextInt(10000));
}

public static String getSixBitRandom() {
return sixdf.format(random.nextInt(1000000));
}

/**
* 给定数组,抽取n个数据
* @param list
* @param n
* @return
*/
public static ArrayList getRandom(List list, int n) {

Random random = new Random();

HashMap<Object, Object> hashMap = new HashMap<Object, Object>();

// 生成随机数字并存入HashMap
for (int i = 0; i < list.size(); i++) {

int number = random.nextInt(100) + 1;

hashMap.put(number, i);
}

// 从HashMap导入数组
Object[] robjs = hashMap.values().toArray();

ArrayList r = new ArrayList();

// 遍历数组并打印数据
for (int i = 0; i < n; i++) {
r.add(list.get((int) robjs[i]));
System.out.print(list.get((int) robjs[i]) + "\t");
}
System.out.print("\n");
return r;
}
}

2.controller代码
@Api(description="短信服务")
@RestController
@RequestMapping("/edumsm/msm")
//@CrossOrigin
public class MsmController {
@Autowired
private MsmService msmService;

@Autowired
private RedisTemplate<String,String> redisTemplate;

//发送短信的方法
@ApiOperation(value = "发送短信")
@GetMapping("send/{phoneNumber}")
public R sendMsm(@PathVariable String phoneNumber){
//1 从redis获取验证码,如果获取到直接返回
String code = redisTemplate.opsForValue().get(phoneNumber);
if(!StringUtils.isEmpty(code)) {
return R.success();
}

//2 如果redis获取 不到,进行阿里云发送
//生成随机值,传递阿里云进行发送
code = RandomUtil.getFourBitRandom();
Map<String,Object> param = new HashMap<>();
param.put("code",code);

//调用service发送短信的方法
boolean isSend = msmService.send(param,phoneNumber);
if(isSend) {
//发送成功,把发送成功验证码放到redis里面
//设置有效时间
redisTemplate.opsForValue().set(phoneNumber,code,5, TimeUnit.MINUTES);
return R.success();
} else {
return R.error().message("短信发送失败");
}
}

 

service层


@Service
public class MsmServiceImpl implements MsmService {

//发送短信的方法
@Override
public boolean send(Map<String, Object> param, String phoneNumber) {

if(StringUtils.isEmpty(phoneNumber)) return false;

DefaultProfile profile =
DefaultProfile.getProfile("default", "LTAI4FqTqfScRaXGUsDXWyPA", "kJkzK5EXZScqMW1fMvheVvwM9pzKtB");
IAcsClient client = new DefaultAcsClient(profile);

//设置相关参数 全部固定的
CommonRequest request = new CommonRequest();
//request.setProtocol(ProtocolType.HTTPS);
request.setMethod(MethodType.POST);
request.setDomain("dysmsapi.aliyuncs.com");
request.setVersion("2017-05-25");
request.setAction("SendSms");

 

//设置发送相关的参数
request.putQueryParameter("PhoneNumbers", phoneNumber); //手机号
request.putQueryParameter("SignName", "申请阿里云 签名名称"); //申请阿里云 签名名称
request.putQueryParameter("TemplateCode", "申请阿里云 模板code"); //申请阿里云 模板code
request.putQueryParameter("TemplateParam", JSONObject.toJSONString(param)); //验证码数据,转换json数据传递

try {
//最终发送
CommonResponse response = client.getCommonResponse(request);
boolean success = response.getHttpResponse().isSuccess();
return success;
}catch(Exception e) {
e.printStackTrace();
return false;
}
}
}

 

登录代码

 

posted @ 2021-03-11 11:14  阿布v  阅读(142)  评论(0)    收藏  举报