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,接下来我们将提供第二个服务。
posted @ 2020-03-18 20:25  张力的程序园  阅读(433)  评论(0)    收藏  举报