分布式项目15 用户注册,单点登陆,用户退出dubbo来实现

news2024/11/26 2:51:09

用户注册
分析:当用户填写完成注册信息之后,将请求发送给前台服务器.之后前台消费者利用dubbo框架实现RPC调用。之后将用户信息传递给jt-sso服务提供者.之后完成数据的入库操作。
01.页面url分析
在这里插入图片描述
02.查看页面JS
在这里插入图片描述

$.ajax({
type : "POST",
url : "/user/doRegister",
contentType : "application/x-www-form-urlencoded; charset=utf-8",
data : {password:_password,username:_username,phone:_phone},
dataType : 'json',
success : function(result) {
if(result.status == "200"){
// 注册成功,去登录页
showMessage('注册成功,请登录!');
verc();
$("#registsubmit").removeAttr("disabled").removeClass().addClass("btn-img btn-regist");
isSubmit = false;
return;
}else{
showMessage('注册失败,请联系管理员!');
//alert('注册失败,请重新注册! ' + result.data );
}
}

03.编辑消费者
编辑消费者UserController
说明:编辑jt-web项目中的UserController

/**
* 实现用户新增
* url:/user/doRegister
* 参数: {password:_password,username:_username,phone:_phone},
* 返回值:SysResult对象~~~JSON串
*/
@RequestMapping("/doRegister")
@ResponseBody
public SysResult doRegister(User user) {
userService.saveUser(user);
return SysResult.success();
}

04.去修改dubbo的独立接口和相关系统的接口实现类

public interface DubboUserService {

	void saveUser(User user);

}
//这是dubbo的实现类,使用dubbo的注解
@Service
public class DubboUserServiceImpl implements DubboUserService {
@Autowired
private UserMapper userMapper;
/**
* 实现用户注册. 用户注册时间/密码加密
*/
@Override
public void saveUser(User user) {
String md5Pass =
DigestUtils.md5DigestAsHex(user.getPassword().getBytes());
user.setPassword(md5Pass)
.setEmail(user.getPhone())
.setCreated(new Date())
.setUpdated(user.getCreated());
userMapper.insert(user);
}
}

单点登陆
业务需求说明
1.如果用户登陆一次之后,则可以实现7天免密登陆.
2.如果用户在jt-web服务器登陆之后,则可以访问任意的其他系统 例如jt-manage/jt-sso/jt-cart/jt-order.
问题:如何保存用户的登陆信息.
分析说明:

如果按照常规手段,实现用户的登陆操作,将用户信息保存到session中,由于Session不能共享.则必然导致用户重复登陆
单点登录(SingleSignOn,SSO),就是通过用户的一次性鉴别登录。当用户在身份认证服务器上登录一次以后,即可获得访问单点登录系统中其他关联系统和应用软件的权限,同时这种实现是不需要管理员对用户的登录状态或其他信息进行修改的,这意味着在多个应用系统中,用户只需一次登录就可以访问所有相互信任的应用系统。这种方式减少了由登录产生的时间消耗,辅助了用户管理,是目前比较流行的。
在这里插入图片描述

01.SSO调用步骤:
1.用户输入用户名和密码完成用户信息校验时将数据发往JT-WEB服务器.
2.将用户信息通过JT-SSO系统完成数据库查询.
3.如果根据用户名和密码查询数据库时,如果发现用户信息有误.则返回错误信息.
如果后台调用一切正常,则开始单点登陆相关操作.
将用户信息保存到redis中,key设定UUID, value使用 userJSON数据,
4.如果保存redis成功之后,需要返回ticket信息(uuid);
5.用户使用Cookie保存用户ticket信息.

02.页面url分析
在这里插入图片描述
03.页面JS

$.ajax({
type: "POST",
url: "/user/doLogin?r=" + Math.random(),
contentType: "application/x-www-form-urlencoded; charset=utf-8",
data: {username:_username,password:_password},
dataType : "json",
error: function () {
$("#nloginpwd").attr({ "class": "text highlight2" });
$("#loginpwd_error").html("网络超时,请稍后再试").show().attr({
"class": "error" });
$("#loginsubmit").removeAttr("disabled");
$this.removeAttr("disabled");
},
success: function (result) {
if (result) {
var obj = eval(result); //将JSON数据转化为js对象
if (obj.status == 200) {
obj.success = "http://www.jt.com";
var isIE = !-[1,];
if (isIE) {
var link = document.createElement("a");
link.href = obj.success;
link.style.display = 'none';
document.body.appendChild(link);
link.click();
} else {
window.location = obj.success;
}
return;
}else{
$("#loginsubmit").removeAttr("disabled");
verc();
$("#nloginpwd").attr({ "class": "text highlight2" });
$("#loginpwd_error").html("账号或密码错误!").show().attr({
"class": "error" });
}
}

04.编辑UserController
说明:编辑jt-web项目的UserController。

/**
* 业务需求:实现用户登陆操作
* url地址:http://www.jt.com/userc?r=0.12008666779616362
* 参数: username/password
* 返回值类型: SysResult对象
*/
@RequestMapping("/doLogin")
@ResponseBody
public SysResult doLogin(User user,HttpServletResponse response) {
//1.将数据发往jt-sso系统完成校验
String uuid = userService.findUserByUP(user);
//2.需要校验uuid是否正确
if(StringUtils.isEmpty(uuid)) {
//用户名和密码不正确
return SysResult.fail();
}
//3.将用户信息写入cookie中.
Cookie cookie = new Cookie("JT_TICKET", uuid);
cookie.setMaxAge(7*24*3600); //设定cookie最大使用时间
cookie.setDomain("jt.com"); //在指定的域名中设定cookie数据共享
cookie.setPath("/"); //cookie的作用范围,从根目录开始.
response.addCookie(cookie);
return SysResult.success();
}

在这里插入图片描述

05.4编辑UserServiceImpl实现类
说明:编辑jt-sso的dubbo的实现类。

/**
* 核心业务逻辑: 根据用户名和密码查询数据库.
* 如果数据中有记录,则保存redis,之后返回uuid
* 如果数据库中没有记录,则返回null.
*/
@Override
public String findUserByUP(User user) {
//1.需要将密码进行加密
String md5Pass =
DigestUtils.md5DigestAsHex(user.getPassword().getBytes());
user.setPassword(md5Pass);
//2.根据对象中不为null的属性,充当where条件
QueryWrapper<User> queryWrapper = new QueryWrapper<User>(user);
//查询用户的全部记录信息.
User userDB = userMapper.selectOne(queryWrapper);
if(userDB ==null) {
//3.如果userDB对象为null,则表示数据库中没有该记录.用户名密码错误.
return null;
}
//4.说明:用户名和密码正确的
String key = UUID.randomUUID().toString();
//5.为了保护用户隐私信息,手机号 email
userDB.setPassword("你猜猜!!!"); //userId/username
String userJSON = ObjectMapperUtil.toJSON(userDB);
jedisCluster.setex(key,7*24*3600, userJSON);
return key;
}

06.页面效果展现
在这里插入图片描述
07.实现用户信息回显
业务需求: 当用户登陆成功之后,用户信息需要进行回显. 您好:admin123
业务逻辑: 根据ticket信息,动态获取用户信息,之后实现数据的回显.
方法实现: 通过ajax动态查询后台的服务器数据.
方法1:dubbo调用
方法2:跨域访问
08.页面url分析
说明:通过分析当前请求,从jt-web的ajax进行跨域访问调用
在这里插入图片描述
在这里插入图片描述

09.页面JS分析

//当dataType类型为jsonp时,jQuery就会自动在请求链接上增加一个callback的参数
$.ajax({
url : "http://sso.jt.com/user/query/" + _ticket,
dataType : "jsonp", //发起JSONP的请求
type : "GET",
success : function(data){
//返回值SysResult对象
if(data.status == 200){
//把json串转化为js对象
var _data = JSON.parse(data.data);
var html =_data.username+",欢迎来到京淘!<a
href=\"http://www.jt.com/user/logout.html\" class=\"link-logout\">[退出]</a>";
$("#loginbar").html(html);
}
}
});

10.编辑JT-SSO的UserController

@Autowired
private JedisCluster jedisCluster;
/**
* 业务需求:根据ticket信息查询用户信息.
* url:http://sso.jt.com/user/query/58f8000b-bdec-40e6-910e-ac4f0cfb6cd8?
callback=jsonp1585296544219&_=1585296544497
* 参数:ticket信息
* 返回值: SysResult对象,用JSONPObject API包装
*
*/
@RequestMapping("/query/{ticket}")
public JSONPObject findUserByTicket(@PathVariable String ticket,String
callback) {
String userJSON = jedisCluster.get(ticket);
//判断查询是否正确
if(StringUtils.isEmpty(userJSON)) {
//如果为null,则表示数据,没有查询到.
SysResult sysResult = SysResult.fail();
return new JSONPObject(callback, sysResult);
}
//说明:用户信息没有错.
SysResult sysResult = SysResult.success(userJSON);
return new JSONPObject(callback, sysResult);
}

11.页面效果展现
在这里插入图片描述
JS与JSON串转化关系
1.服务返回的数据格式如下:
在这里插入图片描述

2.所以需要将json串手动的转化为JS对象

var _data = JSON.parse(data.data);

3.完成业务调用

var html =_data.username+",欢迎来到京淘!<a
href=\"http://www.jt.com/user/logout.html\" class=\"link-logout\">[退出]</a>";

对比:如果将来回传的数据是对象类型则如图所示:
在这里插入图片描述

用户退出操作
01.页面url分析
需求说明:
当用户点击退出操作时,应该跳转到系统首页.
同时删除 1.删除redis信息 2.删除cookie
url地址说明:
http://www.jt.com/user/logout.html
02.编辑UserController
说明:编辑jt-web项目的UserController

/**
* 业务需求:实现用户登出操作
* url: http://www.jt.com/user/logout.html
* 参数: 没有参数
* 返回值: 重定向到系统首页.
* 删除用户登陆凭证: 删除redis信息, 删除cookie信息.
*/
@RequestMapping("/logout")
public String logout(HttpServletRequest request,HttpServletResponse
response) {
//1.首先获取cookie中的值
Cookie[] cookies = request.getCookies();
//2.从数组中动态获取JT_TICKET数据
String ticket = null;
if(cookies !=null && cookies.length>0) {
for (Cookie cookie : cookies) {
if(cookie.getName().equals("JT_TICKET")) {
//3.动态获取cookie的值,这里的值不是对象,而是一个UUid,在redis集群中,value才是JSON化的java对象
ticket = cookie.getValue();
//4.同时删除cookie,因为没有delete操作,所以直接把cookie的生命周期设置为0秒
cookie.setMaxAge(0);
cookie.setDomain("jt.com");
cookie.setPath("/");
response.addCookie(cookie);
break;
}
}
}
//5.判断redis中是否存在该数据,如果存在直接删除
if(jedisCluster.exists(ticket)) {
jedisCluster.del(ticket)
}
return "redirect:/";
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/629895.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

煤矿安全防范,DTU为采矿过程提供实时数据支持

在当今快节奏的时代&#xff0c;采矿行业为我们提供了丰富的资源。然而&#xff0c;随着采矿作业的不断扩大和复杂化&#xff0c;我们也面临着一系列潜在的挑战。其中&#xff0c;数据传输和安全问题尤为突出。 想象一下&#xff0c;在一个繁忙的矿山中&#xff0c;海量的数据需…

让软件研发可视化可量化,华为云CodeArts持续加速企业研发转型

导读&#xff1a;软件开发工具从未像今天这样重要。 “没有度量&#xff0c;就没有管理。” (If you can’t measure it, you can’t manage it.) 管理学大师彼得德鲁克的话时刻提醒人们&#xff0c;度量是管理的必要条件。 在高科技领域&#xff0c;研发投入是企业核心竞争力的…

Linux常用命令——grep命令

在线Linux命令查询工具 grep 强大的文本搜索工具 补充说明 grep&#xff08;global search regular expression(RE) and print out the line&#xff0c;全面搜索正则表达式并把行打印出来&#xff09;是一种强大的文本搜索工具&#xff0c;它能使用正则表达式搜索文本&…

【MySQL数据库 | 第十二篇】:约束

约束&#xff1a; 在MySQL中&#xff0c;约束是一种限制数据表中列值的规定。保证数据库中的数据正确&#xff0c;有效性和完整性。MySQL中的约束有以下几种&#xff1a; 1. 主键约束&#xff08;Primary Key Constraint&#xff09;&#xff1a;主键是用于唯一标识表中每行记…

国内强大的智能语言模型AI

​ Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 前言 环境列表 视频教程 1.飞书设置 2.克隆feishu-chatgpt项目 3.配置config.yaml文件 4.运行feishu-chatgpt项目 5.安装cpolar内网穿透 6.固定公网地址 7.机器人权…

chatgpt赋能python:Python文件目录切换:简单易用的方法

Python文件目录切换&#xff1a;简单易用的方法 Python语言可以轻松地处理文件和目录。使用Python的os库可以方便地操作文件系统。Python在os库中提供了许多可以轻松完成文件和目录操作的函数&#xff0c;其中之一是os.chdir。os.chdir函数用于更改当前的工作目录。 为什么需…

使用阿里云OSS实现图片文件上传

说明&#xff1a;注册用户时&#xff0c;经常会用到上传头像。文件的上传/接收与一般文本数据不同。 一、创建Demo页面 先准备一个Demo页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>图片上传…

第三章 三段论:所有,有的。

第三章 三段论&#xff1a;所有&#xff0c;有的。 第一节 三段论-推结论 题-三段论-结构-推结论&#xff1a;所有A是B&#xff1b;所有B是C&#xff1b;得&#xff1a;所有A是C。&#xff08;最简单的模型&#xff09; 4.所有高明的管理者都懂得关心雇员福利的重要性&…

Linux目录结构(与window目录结构对比+绝对路径和相对路径)

一、Linux目录结构 Linux目录结构是一个标准化的文件系统层次结构&#xff0c;非常有组织性并且易于管理。而与Windows 操作系统不同&#xff0c;Linux将所有文件和设备都组织在一个单一的根目录下。以下是Linux的标准目录结构&#xff1a; /&#xff1a;根目录&#xff0c;包含…

<DB2>《DB2数据库健康检查》第3部分

《DB2数据库健康检查》第3部分 2 数据库对象检查2.12 检查是否需要对表和索引进行runstats(30天未作统计更新)2.13 检查表和索引是否需要重组2.14 查看表空间所在裸设备权限2.15 查看数据库备份进度 2 数据库对象检查 2.12 检查是否需要对表和索引进行runstats(30天未作统计更…

递归sql查询完整科目名称

已知表 科目编号 科目名称 1001 1001 现金 1002 1002 银行存款 10020100 0100 工商银行存款 100201000001 0001 工行重庆路支行 10020200 0200 建设银行存款 100202000001 0001 建行铁北支行 需要整理成 科目编号 科目称 科目全称 1001 现金 现金 1002 银行存款 银行存款 …

【OI学习笔记】基础算法-前缀和与差分算法

板块&#xff1a;基础算法、线性优化 难度&#xff1a;较易 前置知识&#xff1a;C基础语法 一、前缀和 1、定义 在一维空间中&#xff0c;对于一个数据总量为 n n n 的数组 a a a&#xff0c;有数据 a [ 1 ] , a [ 2 ] , a [ 3 ] , . . . , a [ n − 1 ] , a [ n ] a[1]…

计算数组中各元素的平方根numpy.sqrt()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算数组中各元素的平方根 numpy.sqrt() 选择题 以下程序的运行结果是? import numpy as np a np.array([1, 4, 9, -4]) print("【显示】a ", a) print("【执行】np.sqrt(a)&…

计网常见面试题

参考:小林coding 1.TCP/IP模型 2.说一下TCP的三次握手? 第一次握手:客户端向服务端发起建立连接请求,客户端会随机生成一个起始序列号x,客户端向服务端发送的字段中包含标志位SYN=1,序列号seq=x。第一次握手前客户端的状态为CLOSE,第一次握手后客户端的状态为SYN-SENT。…

Stable Diffusion 从听说到超神日记(从安装开始)

1.安装模型&#xff08;B站搜秋叶&#xff09; 看到下面界面就成功了&#xff01; 下载好模型打开主页&#xff01;点击右下角一键启动&#xff01; 首先弹出下面命令界面。 自动弹出一个网页界面&#xff08;地址是http://127.0.0.1:7860/?__themelight&#xff09;&#xf…

Zabbix(二)

所有实验的zabbix_agent客户端都是web1(192.168.29.142) 模板Template 模板是可以方便地应用于多个主机的一组实体。 实体可以是&#xff1a; 监控项触发器图表仪表盘低级别自动发现规则web场景 模板通常用于为特定服务或应用程序&#xff08;如Apache&#xff0c;MySQL&am…

第二章 模态命题:必然、可能

第二章 模态命题&#xff1a;必然、可能 第一节 模态命题-句式转换-逻辑转换 题-模态命题-句式转换-逻辑转换&#xff1a;①不一定不可能&#xff1b;②不一定可能不未必。 1.唐代韩愈在《师说》中指出&#xff1a;“孔子曰&#xff1a;三人行&#xff0c;则必有我师。是故…

MM32F3273G8P火龙果开发板MindSDK开发教程1 - 点亮LED

MM32F3273G8P火龙果开发版MindSDK开发教程1-点亮LED 1、登录官网下载对应的MindSDK固件 https://mindsdk.mindmotion.com.cn/&#xff0c;然后注册下载mm32F3270的固件即可。 下载完的文件为 plus-f3270_mdk.zip 解压后的文件路径如图&#xff1a; 2、新建LED工程 将下载…

ModNet抠图算法及摄像头实时抠图示例

目录 一、视频抠图采用绿幕的原因 1、摄像机成色原因 2、抠图效果原因 3、经济成本 二、抠图背景知识 1、Trimap 2、什么是抠图 3、抠图算法分类 三、Deep Image Matting算法 1、网络结构图 2、算法解读 &#xff08;1&#xff09;Encoder-Decoder阶段 &#xff0…

vue3 -- lottie-web使用

Lottie简介 官方介绍:Lottie是一个库,可以解析使用AE制作的动画(需要用bodymovie导出为json格式),支持web、ios、android、flutter和react native。在web端,lottie-web库可以解析导出的动画json文件,并将其以svg或者canvas的方式将动画绘制在我们的页面上. Lottie的优点 …