sso单点登录
sso单点登录
记录,cookie方法
仅仅只是学习记录,参考别人代码,不足之处,请尽情指出。
登录页面
<h3>欢迎来到登录页面</h3>
<form action="/login" method="post">
用户名:
<input type="text" name="username"/>
密码:
<input type="password" name="password"/>
<input type="submit" value="登录"/>
<p style="color: red" th:text="${session.msg}"></p>
</form>
实体类对象
@Data//setter和getter方法
@NoArgsConstructor//无参构造
@AllArgsConstructor//有参构造
@Accessors(chain = true)//链式编程
public class User {
private int id;
private String username;
private String password;
}
util
public class UserUtil {
//创建一个Map对象
public static Map<String,User> loginUser = new HashMap<>();
}
controller
LoginController
//伪造用户
private static Set<User> dbUsers;
static {
dbUsers=new HashSet<>();
dbUsers.add(new User().setId(1).setUsername("admin").setPassword("admin"));
}
@PostMapping
public String Login(User user, HttpSession session, HttpServletResponse response){
String target=(String)session.getAttribute("target");
Optional<User> first=dbUsers.stream().filter(dbUser -> dbUser.getUsername().equals(user.getUsername()) &&
dbUser.getPassword().equals(user.getPassword())).findFirst();//查找集合中的第一个元素,filter括号里是筛选条件
if (first.isPresent()){
//创建令牌
String token = UUID.randomUUID().toString();
//创建cookie
Cookie cookie = new Cookie("TOKEN", token);
//设置域
cookie.setDomain("localhost");
//添加cookie,将令牌放到全局对话中
response.addCookie(cookie);
//将token信息添加到map
UserUtil.loginUser.put(token, first.get());
}else{
session.setAttribute("msg","登陆失败");
System.out.println(target);
return "login";
}
//重定向地址
return "redirect:"+target;
}
其中一个Optional
Optional是一个容器,其值可以是null也可以不是,可以封装可能为空的引用。
详情查看菜鸟,jdk8新特性
//获取用户信息
@GetMapping("/info")
public ResponseEntity<User> getUserInfo(String token){
//令牌不是空的
if (!StringUtils.isEmpty(token)) {
//获取令牌
User user = UserUtil.loginUser.get(token);
//进行响应
return ResponseEntity.ok(user);
}else{
//null响应,http状态错误
return new ResponseEntity<>(null, HttpStatus.BAD_REQUEST);
}
}
//退出登录
@GetMapping("/loginOut")
public String loginOut(@CookieValue(value = "TOKEN") Cookie cookie,String target){
cookie.setMaxAge(0);
//移除cookie
UserUtil.loginUser.remove(cookie.getValue());
//重定向地址
return "redirect:"+target;
}
//在每个系统的前端页面调用此方法,一键退出所有系统
ViewController
public class ViewController {
@GetMapping("/login")
public String toLogin(@RequestParam(required = false,defaultValue = "")String target,
HttpSession session, @CookieValue( required = false,value = "TOKEN") Cookie cookie){
if (cookie != null) {
String value = cookie.getValue();
User user = UserUtil.loginUser.get(value);
if (user!=null){
return "redirect:"+target;
}
}
session.removeAttribute("msg");
if (StringUtils.isEmpty(target)){
target="http://localhost:9005/view/index";
}
session.setAttribute("target",target);
return "login";
}
}
系统一
前端
<h3>这是首页</h3>
<p th:if="${session.loginUser != null}">
欢迎<span style="color: pink" th:text="${session.loginUser.username}"></span>登录
</p>
<a th:if="${session.loginUser == null}" href="http://localhost:9004/view/login?target=http://localhost:9005/view/index">登录</a>
<a th:unless="${session.loginUser == null}" href="http://localhost:9004/login/loginOut?target=http://localhost:9005/view/index">退出</a>
ViewController
@Controller
@RequestMapping("/view")
public class ViewController {
@Autowired
private RestTemplate restTemplate;
private final String LOGIN_INFO_URL="http://localhost:9004/login/info?token=";
@GetMapping("/index")
public String toIndex(@CookieValue(value = "TOKEN",required = false) Cookie cookie, HttpSession session){
if (cookie != null){
String token = cookie.getValue();
if (!StringUtils.isEmpty(token)){
Map map = restTemplate.getForObject(LOGIN_INFO_URL + token, Map.class);
session.setAttribute("loginUser",map);
}
}
return "index";
}
}
多系统同理,系统一。重申仅仅只是学习。

浙公网安备 33010602011771号