1.使用cookie简单实现单点登录流程
1.动手
- 实现了简单使用多系统,单一位置同时登陆,以及注销
- 主要认证中心流程代码编写在为在sso-login包下的ViewConreoller和LoginController;各系统的用户名显示是写在各自的ViewController中
- 在ViewController类中的toLogin方法
@Controller
@RequestMapping("/view)
public class ViewControler{
@RequestMapping("/login")
public String toLogin(@RequestParam(requires=false, default=")String target, HttpSession session,
@CookieValue(required=false, value="TOKEN") Cookie cookie){
if(StringUtils.isEmpty(target)){
target = "htttp://www.codeshop.com:8092/view/login";
}
if(cookie != null){
String token = cookie.getValue();
User user = LoginCacheUtil.loginUser.get(token);
if(user != null){
return "redirext:"+target;
}
}
session.setAttribute("target",target);
return "login";
}
}
- 在LoginController类中的doLogin方法用于实现用户登录,getUserInfo方法获取用户信息,保存在session中,logout方法注销用户
@Controller
@RequestMapping("/login")
public class LoginController {
private static Set<User>dbUsers;
static{ dbUsers = new HashSet<>();
dbUsers.add(new User(0."ku","123456"));
dbUsers.add(new User(1,"yan","654321")); }
@PostMapping public String doLogin(User user, HttpSession session, HttpServletResponse response){
String target = (String)session.getAtttribute("target");
Optional<User>first = dbUsers.stream().filter( dbUser - >dbUser.getUsername().equals(user.getUsername() &&
dbUser.getPassword().equals(user.geyPassword())).findFirst();
if(first.isPresent()){
String token = UUID.randomUUID().toString();
LoginUtil.loginUser.put(token,first.get());
Cookie cookie = new Cookie("TOKEN",token);
cookie.setDomain("codeshop.com");
response.addCookie(cookie);
}else{
session.setAttribute("msg","用户名或密码错误");
return "loign"; } return "redirect:"+target;
}
@GetMaping("info")
public ResponseEntity<User>getUserInfo(String token){
if(!StingUtils.isEmpty(token)){
User user = LoginCacheUtil.loginUser.get(token);
return ResopnseEntity.ok(user);
}else{
return new ResponseEntity<>(HttpStatus.BAD_REQUEST);
}
}
@GetMappping("/logout")
public String logOut(@CookieValue(required=false,value="TOKEN") Cookie cookkie, HttpServletResponse response, String target){
cookie.setMaxAge(0);
LoginCacheUtil.loginUser.remove(cookie.getValue());
response.addCookie(cookie);
return "redirect"+target;
}
}
- 在sso-cart、sso-main、sso-vip包下的ViewController的toIndex方法用于实现用户信息登录、显示用户信息,注销用户信息
@Controller
@RequestMapping("/view")
public class ViewController{
@AutoWired RestTemplate restTemplate;
private final String USER_INFO_ADDRESS="http://login.codeshop.com:8090/login/info?token=";
@RequestMapping("/login")
public String toLogin(@){
if(cookie != null){
String token = cookie.getValue();
if(token != null){
Map result = restTemplate.getForObject(USER_INFPO_ADDRESS,Map.class);
session.setAttribute("loginUser",result);
}
}
}
}
2.总结,反思,复盘
- 总结:大体实现了使用cookie完成单点登录,学到咯整体是如何实现的,流程是怎么样的,doLogin中将token作为键,用户信息坐位置存储在缓存类中(可以考虑使用Redis实现),再将token以“TOKEN”方式存在cookie;getUserInfo是判断token是否存在,再通过ResponseEntity形式返回状态;logOut方法主要通过删除cookie,以及缓存类中cookie,响应给浏览器实现注销
- ViewController中,判断cookie是否存在,token是否存在,login中通过token判断用户是否存在,返回登录页面 ,而其他系统是根据token以getForObject方法以JSON形式返回用户信息到页面
- 反思:自己敲了几遍,但是还是没法记住每个类的功能和具体的作用,需要反复理解,敲打,复盘
- 这次单点登录功能用到了前端的一些<form action="" method="">表单,以及<input name="username"/>标签,还有@RequestMapping,根据请求访问注解下的方法,404错误是请求路径与实际路径不配问题