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";
    }
}

多系统同理,系统一。重申仅仅只是学习。

posted @ 2021-11-24 17:50  白明泽  阅读(99)  评论(0)    收藏  举报