jwt+mysql+拦截器 实现限时登录
时间: 2023-09-29 16:09:07 浏览: 43
public class SearchArray {
public static void main(String[] args) {
int[] array = {1, 5, 3, 7, 9, 2};
int x = 9;
int index = -1;
// 遍历数组寻找x是否存在
for (int i = 0; i < array.length; i++) {
if (array[i] == x) {
index = i;
break;
}
}
// 判断是否找到x
if (index != -1) {
System.out.println("x存在于数组中,位置为:" + index);
} else {
System.out.println("x不存在于数组中");
}
}
}
相关问题
boot +security + jwt + mysql 菜单权限控制
菜单权限控制是指通过对用户的身份和角色进行鉴权,并根据其权限设置对应的菜单功能的访问权限。在使用boot、security、jwt、mysql实现菜单权限控制时,可以按照以下步骤进行:
1. 首先,使用MySQL数据库存储用户、角色和菜单信息。可以创建三张表,分别用于存储用户信息、角色信息和菜单信息,表之间通过外键关联。
2. 使用Spring Boot框架和Spring Security进行用户认证和授权。通过配置Spring Security,可以设定访问接口的权限要求,包括菜单接口。可以使用JWT(Json Web Token)来生成和验证用户的身份,将用户的角色和权限信息存储在JWT中。
3. 在Spring Boot中定义你的数据模型,例如User、Role和Menu,与数据库中的表对应。设置它们之间的关联关系。
4. 创建相应的Controller和Service来处理用户的注册、登录、角色分配和菜单授权等操作。例如,可以创建一个UserController来处理用户相关的操作,一个RoleController来处理角色相关的操作。
5. 实现菜单权限控制。可以在角色和菜单表中设置对应的权限字段,如角色的权限标识和菜单的访问路径等。在用户登录成功后,根据用户的角色查询对应的菜单权限,将权限信息返回给前端。前端根据权限信息动态生成菜单。
6. 在不同的接口中加入相应的安全注解,如@PreAuthorize,用于验证用户是否具有访问该接口的权限。可以在Controller的方法上添加注解,指定需要的角色或权限。
通过上述步骤,就可以实现基于boot、security、jwt和mysql的菜单权限控制。用户登录后,根据其角色和权限,设定相应的菜单访问权限,并在后端接口中进行访问权限的验证,确保用户只能访问其具有权限的菜单功能。
springboot+阿里云短信+jwt+Redis+mysql实现用户手机号验证码登录
实现用户手机号验证码登录可以分为以下几个步骤:
1. 用户输入手机号和验证码,点击登录按钮。
2. 后端接收到手机号和验证码后,先验证验证码是否正确。
3. 如果验证码正确,后端生成JWT token并将token存储到Redis中,同时将token返回给前端。
4. 前端将token存储到本地,以便后续请求时使用。
5. 后续请求时,前端需要在请求头中加入token,后端通过解析token来判断用户是否已登录。
下面是具体实现过程:
1. 在阿里云短信控制台创建短信模板,获取accessKeyId和accessKeySecret。
2. 在Spring Boot项目中添加依赖:
```
<dependency>
<groupId>com.aliyun</groupId>
<artifactId>aliyun-java-sdk-core</artifactId>
<version>4.0.3</version>
</dependency>
```
3. 实现发送短信验证码的接口:
```
@PostMapping("/sendSms")
public Result sendSms(@RequestParam("phone") String phone) {
// 生成随机验证码
String code = String.valueOf((int) ((Math.random() * 9 + 1) * 100000));
// 发送短信验证码
DefaultProfile profile = DefaultProfile.getProfile("cn-hangzhou", 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", "cn-hangzhou");
request.putQueryParameter("PhoneNumbers", phone);
request.putQueryParameter("SignName", "短信签名");
request.putQueryParameter("TemplateCode", "短信模板编号");
request.putQueryParameter("TemplateParam", "{\"code\":\"" + code + "\"}");
try {
CommonResponse response = client.getCommonResponse(request);
// 将验证码存储到Redis中,有效期为5分钟
redisTemplate.opsForValue().set(phone, code, 5, TimeUnit.MINUTES);
return Result.success("短信验证码发送成功");
} catch (Exception e) {
return Result.error("短信验证码发送失败");
}
}
```
4. 实现用户手机号验证码登录的接口:
```
@PostMapping("/login")
public Result login(@RequestParam("phone") String phone, @RequestParam("code") String code) {
// 验证验证码是否正确
String redisCode = redisTemplate.opsForValue().get(phone);
if (StringUtils.isBlank(redisCode)) {
return Result.error("验证码已过期,请重新发送");
}
if (!redisCode.equals(code)) {
return Result.error("验证码不正确");
}
// 生成JWT token,并存储到Redis中
String token = JwtUtils.generateToken(phone);
redisTemplate.opsForValue().set(phone, token, 1, TimeUnit.DAYS);
// 将token返回给前端
return Result.success(token);
}
```
5. 实现JWT token的生成和解析:
```
public class JwtUtils {
private static final String SECRET_KEY = "jwt_secret_key"; // JWT密钥
private static final long EXPIRATION_TIME = 7 * 24 * 60 * 60 * 1000; // JWT过期时间(7天)
public static String generateToken(String phone) {
Date now = new Date();
Date expiration = new Date(now.getTime() + EXPIRATION_TIME);
return Jwts.builder()
.setSubject(phone)
.setIssuedAt(now)
.setExpiration(expiration)
.signWith(SignatureAlgorithm.HS256, SECRET_KEY)
.compact();
}
public static String getPhoneFromToken(String token) {
try {
Claims claims = Jwts.parser().setSigningKey(SECRET_KEY).parseClaimsJws(token).getBody();
return claims.getSubject();
} catch (Exception e) {
return null;
}
}
}
```
6. 在拦截器中验证token并获取用户信息:
```
public class JwtInterceptor implements HandlerInterceptor {
private static final String AUTH_HEADER = "Authorization"; // token在请求头中的名称
@Autowired
private StringRedisTemplate redisTemplate;
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
String token = request.getHeader(AUTH_HEADER);
if (StringUtils.isBlank(token)) {
throw new BusinessException("未登录或登录已过期");
}
String phone = JwtUtils.getPhoneFromToken(token);
if (StringUtils.isBlank(phone)) {
throw new BusinessException("无效的token");
}
String redisToken = redisTemplate.opsForValue().get(phone);
if (StringUtils.isBlank(redisToken) || !redisToken.equals(token)) {
throw new BusinessException("未登录或登录已过期");
}
return true;
}
}
```