SSO单点登录系统分析

项目构建

e3-sso(pom 聚合工程)
|--e3-sso-interface(jar)
|--e3-sso-Service(war)
e3-sso-web

服务接口实现

检查数据是否可用(RegitsterController)

请求的 url:/user/check/{param}/{type}
参数:从 url 中取参数 1、String param(要校验的数据)2、Integer type(校验的数据类型)
响应的数据:json 数据。e3Result,封装的数据校验的结果 true:成功 false:失败。
业务逻辑:
1、从 tb_user 表中查询数据
2、查询条件根据参数动态生成。
3、判断查询结果,如果查询到数据返回 false。
4、如果没有返回 true。
5、使用 e3Result 包装,并返回。

/**
     * 用户校验 注册参数
     * @param param 1:用户名 2:手机号 3:邮箱
     * @param type 1 ,2 ,3
     * @return
     */
    @RequestMapping("/user/check/{param}/{type}")
    @ResponseBody
    public E3Result checkData(@PathVariable String param, @PathVariable Integer type) {
        E3Result e3Result = registerService.checkData(param, type);
        return e3Result;
    }

用户注册(RegitsterController)

请求的 url:/user/register
参数:表单的数据:username、password、phone、email
返回值:json 数据。e3Result
接收参数:使用 TbUser 对象接收。
请求的方法:post
业务逻辑:
1、使用 TbUser 接收提交的请求。
2、补全 TbUser 其他属性。
3、密码要进行 MD5 加密。
4、把用户信息插入到数据库中。
5、返回 e3Result。

/**
     * 用户注册
     * @param user
     * @return
     */
    @RequestMapping(value="/user/register", method=RequestMethod.POST)
    @ResponseBody
    public E3Result register(TbUser user) {
        E3Result e3Result = registerService.register(user);
        return e3Result;
    }

用户登录

请求的 url:/user/login
请求的方法:POST
参数:username、password,表单提交的数据。可以使用方法的形参接收。
返回值:json 数据,使用 e3Result 包含一个 token。
登录的处理流程:
1、登录页面提交用户名密码。
2、登录成功后生成token。Token相当于原来的jsessionid,字符串,可以使用uuid。
3、把用户信息保存到redis。Key就是token,value就是TbUser对象转换成json。
4、使用String类型保存Session信息。可以使用“前缀:token”为key
5、设置key的过期时间。模拟Session的过期时间。一般半个小时。
6、把token写入cookie中。
7、Cookie需要跨域。例如www.e3.com\sso.e3.com\order.e3.com,可以使用工具类。
8、Cookie的有效期。关闭浏览器失效。
9、登录成功。

/**
 * 用户登录处理
 * <p>Title: LoginController</p>
 * <p>Description: </p>
 * @version 1.0
 */
@Controller
public class LoginController {

    @Autowired
    private LoginService loginService;

    @Value("${TOKEN_KEY}")
    private String TOKEN_KEY;

    /**
     * 用户登录请求
     * @param username
     * @param password
     * @param request
     * @param response
     * @return
     */
    @RequestMapping(value="/user/login", method=RequestMethod.POST)
    @ResponseBody
    public E3Result login(String username, String password,
            HttpServletRequest request, HttpServletResponse response) {
        E3Result e3Result = loginService.userLogin(username, password);
        //判断是否登录成功
        if(e3Result.getStatus() == 200) {// 登录成功,将token写入cookie
            String token = e3Result.getData().toString();
            //如果登录成功需要把token写入cookie
            CookieUtils.setCookie(request, response, TOKEN_KEY, token);
        }
        //返回结果
        return e3Result;
    }
}

表现层

请求的 url:/user/login
请求的方法:POST
参数:username、password,表单提交的数据。可以使用方法的形参接收。
HttpServletRequest、HttpServletResponse
返回值:json 数据,使用 e3Result 包含一个 token。
业务逻辑:
1、接收两个参数。
2、调用 Service 进行登录。
3、从返回结果中取 token,写入 cookie。Cookie 要跨域

/**
     * 跳转到登陆页
     * @param redirect 重定向URI
     * @param model
     * @return
     */
    @RequestMapping("/page/login")
    public String showLogin(String redirect, Model model) {
        model.addAttribute("redirect", redirect);
        return "login";
    }

通过 token 查询用户信息

请求的 url:/user/token/{token}
参数:String token 需要从 url 中取。
返回值:json 数据。使用 e3Result 包装 Tbuser 对象。
业务逻辑:
1、从 url 中取参数。
2、根据 token 查询 redis。
3、如果查询不到数据。返回用户已经过期。
4、如果查询到数据,说明用户已经登录。
5、需要重置 key 的过期时间。
6、把 json 数据转换成 TbUser 对象,然后使用 e3Result 包装并返回。

/**
     * 根据token查询用户信息
     * @param token
     * @param callback
     * @return
     */
    @RequestMapping(value="/user/token/{token}")
    @ResponseBody
    public Object getUserByToken(@PathVariable String token, String callback) {
        E3Result result = tokenService.getUserByToken(token);
        //响应结果之前,判断是否为jsonp请求
        if (StringUtils.isNotBlank(callback)) {
            //把结果封装成一个js语句响应
            MappingJacksonValue mappingJacksonValue = new MappingJacksonValue(result);
            mappingJacksonValue.setJsonpFunction(callback);
            return mappingJacksonValue;
        }
        return result;
    }

猜你喜欢

转载自blog.csdn.net/qq_22027637/article/details/79849283