01 创建sso服务,登录信息存储在cookie以及redis
Single Sign On即单点登录,是指多个服务只需要登录一次,就可以满足用户认证需要,多用在分布式服务中。实现单点登录有多种方案。本专辑将阐述使用redis和cookie技术完成单点登录。这一节我们将先创建一个sso服务。
1、前提约束
- 安装和熟练使用redis
https://www.jianshu.com/nb/36732324
注意:笔者的redis服务所在的ip地址为192.168.100.192,端口为6379,请读者根据自己实际情况设置
2、操作步骤
- 基于springboot创建一个web项目 sso,端口设置为8081
https://www.jianshu.com/p/de979f53ad80
注意:这里仅仅是为了提供一个api,读者可以根据自己的实际,使用servlet, springmvc甚至struts都可以 - 在pom.xml中加入以下依赖
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>4.0.0-b07</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>com.alibaba</groupId>
<artifactId>fastjson</artifactId>
<version>1.2.47</version>
</dependency>
<dependency>
<groupId>redis.clients</groupId>
<artifactId>jedis</artifactId>
<version>2.7.3</version>
</dependency>
- 在项目/src/main/resources/static文件夹中引入jquery-1.10.2.js
- 在项目/src/main/resources/static文件夹中创建index.html
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<title>sso</title>
</head>
<body>
<h2>Hello World!</h2>
账号:<input type="text" name="name" id="name" value="ali"/>
密码:<input type="password" name="password" id="password" value="123456" />
<input type="button" value="登录" id="sub"/>
</body>
<script type="text/javascript" src="jquery-1.10.2.js"></script>
<script type="text/javascript">
$(function(){
$("#sub").click(function(){
$.ajax({
data:{name:$("#name").val(),password:$("#password").val()},
type:"post",
dataType:"json",
url:"/login",
success:function (data) {
if(data.status=='200')
{
window.location.href="http://localhost:8082/index.html";
}
else {
alert(data.msg)
}
}
})
})
})
</script>
</html>
- 在项目/src/main/java中创建一个包net.wanho.controller
- 在net.wanho.controller包下面创建一个UserController.java
package net.wanho.controller;
import com.alibaba.fastjson.JSONObject;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.*;
@RestController
public class UserController {
@PostMapping("/login")
public JSONObject login(@RequestParam("name")String name, @RequestParam("password")String password,HttpServletResponse resp)throws Exception
{
JSONObject jsonObject = new JSONObject();
if("ali".equals(name)&&"123456".equals(password))
{
//这里本应该去查询数据库,但此刻我们关注的重点不在于必须由数据库提供用户信息,所以此处做简单处理,只要账号密码为ali/123456,就意味着登录成功
String token = UUID.randomUUID().toString();
Cookie cookie = new Cookie("USER_TOKEN", token);
cookie.setPath("/");
cookie.setMaxAge(30*60);
resp.addCookie(cookie);
Jedis jedis = new Jedis("192.168.100.192",6379);
jedis.set(token,"ali");
jsonObject.put("status",200);
}
else
{
jsonObject.put("status",100);
jsonObject.put("msg","account or password wrong");
}
return jsonObject;
}
}
- 测试
启动项目,进入首页,直接点击“登录”,如果前述操作没有错误,则直接进入404。
以上,我们完成了sso项目并启动,因为我们没有其他服务提供跳转页面,所以出现了404,接下来我们将提供第二个服务。