springboot+redis實現token機制
阿新 • • 發佈:2018-12-11
專案結構
pom.xml
<dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-redis</artifactId> <version>1.4.5.RELEASE</version> </dependency> <dependency> <groupId>com.alibaba</groupId> <artifactId>fastjson</artifactId> <version>1.2.31</version> </dependency> <dependency> <groupId>nl.bitwalker</groupId> <artifactId>UserAgentUtils</artifactId> <version>1.2.4</version> </dependency> <dependency> <groupId>commons-codec</groupId> <artifactId>commons-codec</artifactId> <version>1.6</version> </dependency> </dependencies>
application.properties
##指定使用redis資料庫索引(預設為0)
spring.redis.database=0
##指定Redis伺服器地址
spring.redis.host=192.168.126.149
##指定Redis埠號
spring.redis.port=6379
##指定Redis密碼
spring.redis.password=123456
User.java
package com.fengqing.aapredis.bean; public class User { private Integer id; private String username; private String password; public User(Integer id, String username, String password) { this.id = id; this.username = username; this.password = password; } public User() { } public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getUsername() { return username; } public void setUsername(String username) { this.username = username; } public String getPassword() { return password; } public void setPassword(String password) { this.password = password; } }
Dto.java
package com.fengqing.aapredis.bean; public class Dto { private String token; private Long tokenCreatedDate; private Long tokenExpiryDate; private String isLogin; public String getToken() { return token; } public void setToken(String token) { this.token = token; } public Long getTokenCreatedDate() { return tokenCreatedDate; } public void setTokenCreatedDate(Long tokenCreatedDate) { this.tokenCreatedDate = tokenCreatedDate; } public Long getTokenExpiryDate() { return tokenExpiryDate; } public void setTokenExpiryDate(Long tokenExpiryDate) { this.tokenExpiryDate = tokenExpiryDate; } public String getIsLogin() { return isLogin; } public void setIsLogin(String isLogin) { this.isLogin = isLogin; } }
RedisConfig.java
package com.fengqing.aapredis.config;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.data.redis.connection.RedisConnectionFactory;
import org.springframework.data.redis.core.RedisTemplate;
@Configuration
public class RedisConfig {
@Bean
public RedisTemplate<String, String> redisTemplate(RedisConnectionFactory redisConnectionFactory) {
RedisTemplate<String, String> redisTemplate = new RedisTemplate<>();
redisTemplate.setConnectionFactory(redisConnectionFactory);
return redisTemplate;
}
}
RedisUtil.java
package com.fengqing.aapredis.util;
import org.springframework.data.redis.core.RedisTemplate;
import org.springframework.data.redis.core.ValueOperations;
import org.springframework.stereotype.Component;
import javax.annotation.Resource;
@Component
public class RedisUtil {
@Resource
private RedisTemplate<String, String> redisTemplate;
public void set(String key, String value) {
ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
valueOperations.set(key, value);
}
public void setex(String key, String value, int seconds) {
ValueOperations<String, String> valueOperations = redisTemplate.opsForValue();
valueOperations.set(key, value, seconds);
}
}
TokenService.java
package com.fengqing.aapredis.service;
import com.alibaba.fastjson.JSONObject;
import com.fengqing.aapredis.bean.User;
import com.fengqing.aapredis.util.RedisUtil;
import nl.bitwalker.useragentutils.UserAgent;
import org.apache.commons.codec.digest.DigestUtils;
import org.springframework.stereotype.Service;
import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.Random;
@Service("tokenService")
public class TokenService {
@Resource
private RedisUtil redisUtil;
//生成token(格式為token:裝置-加密的使用者名稱-時間-六位隨機數)
public String generateToken(String userAgentStr, String username) {
StringBuilder token = new StringBuilder("token:");
//裝置
UserAgent userAgent = UserAgent.parseUserAgentString(userAgentStr);
if (userAgent.getOperatingSystem().isMobileDevice()) {
token.append("MOBILE-");
} else {
token.append("PC-");
}
//加密的使用者名稱
token.append(DigestUtils.md5Hex(username) + "-");
//時間
token.append(new SimpleDateFormat("yyyyMMddHHmmssSSS").format(new Date()) + "-");
//六位隨機字串
token.append(new Random().nextInt(999999 - 111111 + 1) + 111111 );
System.out.println("token-->" + token.toString());
return token.toString();
}
//把token存到redis中
public void save(String token, User user) {
if (token.startsWith("token:PC")) {
redisUtil.setex(token, JSONObject.toJSONString(user), 2*60*60);
} else {
redisUtil.set(token, JSONObject.toJSONString(user));
}
}
}
UserService.java
package com.fengqing.aapredis.service;
import com.fengqing.aapredis.bean.User;
import org.springframework.stereotype.Service;
@Service("userService")
public class UserService {
public User login(String username, String password) {
if ("tom".equals(username) && "123".equals(password)){
return new User(1, "tom", "123");
} else {
return null;
}
}
}
UserController.java
package com.fengqing.aapredis.controller;
import com.alibaba.fastjson.JSONObject;
import com.fengqing.aapredis.bean.Dto;
import com.fengqing.aapredis.bean.User;
import com.fengqing.aapredis.service.TokenService;
import com.fengqing.aapredis.service.UserService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
@Controller
@RequestMapping("/user")
public class UserController {
@Autowired
private UserService userService;
@Autowired
private TokenService tokenService;
@RequestMapping("/login")
@ResponseBody
public String login(String username, String password, HttpServletRequest request) {
Dto dto = new Dto();
User user = this.userService.login(username, password);
if (user != null) {
String userAgent = request.getHeader("user-agent");
String token = this.tokenService.generateToken(userAgent, username);
this.tokenService.save(token, user);
dto.setIsLogin("true");
dto.setToken(token);
dto.setTokenCreatedDate(System.currentTimeMillis());
dto.setTokenExpiryDate(System.currentTimeMillis() + 2*60*60*1000);
} else {
dto.setIsLogin("false");
}
return JSONObject.toJSONString(dto);
}
}