上篇地址:https://blog.csdn.net/qq_36154832/article/details/90718252
单点登录的系统实现
单点登录的服务端项目结构
1、新建一个Springboot项目,添加依赖同需求端
2、UserController实现登陆跳转
@Controller
public class UserController {
@Autowired
private UserService userService;
@RequestMapping(value = "/loginPage")
public ModelAndView login(String redirect,ModelAndView mv,HttpServletRequest request) {
mv.addObject("redirect", redirect);
HttpSession session = request.getSession();
session.setAttribute("redirect", redirect);
mv.setViewName("loginPage");
return mv;
}
@RequestMapping(value="/login")
@ResponseBody
public TitResult userLogin(String username, String password,
HttpServletRequest request, HttpServletResponse response,ModelAndView mv) throws ServletException, IOException {
TitResult titResult = null ;
try {
titResult = userService.userLogin(username, password, request, response);
} catch (Exception e) {
}
if(titResult == null){
titResult = TitResult.getTitResult(500, "");
}
return titResult;
}
}
3、UserRepositoryImpl.java 模拟连接数据库检验用户名密码
@Repository
public class UserRepositoryImpl implements UserRepository{
/**
* @param username
* @param password
* @return
*/
@Override
public User findByUserNameAndPassword(String username, String password) {
//模拟查询数据库校验用户名密码
if("user".equals(username) && "123".equals(password)){
return new User(username, password);
}
return null;
}
}
4、UserService.java 登陆服务如果登陆成功生成token并存入redis,并将user返回
@Service
@Transactional
public class UserService {
@Autowired
private UserRepository userRepository;
@Autowired
private RedisUtil redisUtil;
public TitResult userLogin(String username, String password,
HttpServletRequest request, HttpServletResponse response) throws Exception {
// 判断账号密码是否正确
User user = userRepository.findByUserNameAndPassword(username,password);
if (user == null) {
return TitResult.getTitResult(400, "账号名或密码错误");
}
// 生成token
String token = UUID.randomUUID().toString();
// 把用户信息写入 redis
redisUtil.set("REDIS_USER_SESSION:" + token, JsonUtils.objectToJsonStr(user));
// 设置 session 的过期时间
redisUtil.expire("REDIS_USER_SESSION:" + token, 600);
// 添加写 cookie 的逻辑,cookie 的有效期是关闭浏览器就失效。
CookieUtils.setCookie(request, response, "USER_TOKEN", token);
// 返回token
return TitResult.success(token);
}
}
5、实体类和工具类同需求端
6、登陆界面及配置文件
loginPage.html
<!DOCTYPE html>
<html>
<head lang="en">
<meta charset="UTF-8" />
<title>thymeleaf demo</title>
<script src="https://cdn.bootcss.com/jquery/3.4.1/jquery.min.js"></script>
</head>
<body>
<div>
ID:<input id="username" type="text"/>
Password:<input id="password" type="password" />
<button id="submit">登录</button>
</div>
</body>
<script>
$(function(){
$('#submit').on('click',function(){
var href = window.location.search
var params = href.split('=');
var url = params[1];
$.ajax({
type:'POST',
url:'./login',
data:{username:$("#username").val(),password:$("#password").val()},
dataType:"json",
success:function(data){
if (data.code == 200) {
if (url == "") {
location.href = "http://localhost:8080";
} else {
location.href = url;
}
} else {
alert("登录失败,原因是:" + data.msg);
}
}
})
})
})
</script>
</html>
application.properties
server.port=8081
spring.redis.host=127.0.0.1
spring.redis.port=6379
测试效果
1、访问http://localhost:8080/ 自动跳转登陆界面
2、用户名密码输入正确
3、再新建一个登陆需求项目端口号8082,启动项目。打开http://localhost:8080/和http://localhost:8082/都跳转到需要登陆界面
4、在8082那页面输入用户名密码登陆
5、直接访问http://localhost:8080/也自动登陆了