首页 > 其他分享 >在线视频项目笔记总结

在线视频项目笔记总结

时间:2022-12-24 23:55:13浏览次数:50  
标签:总结 浏览器 在线视频 用户 笔记 token session cookie 客户端

一、管理员登录接口

1.业务逻辑见代码:

controller层

@RestController
@Slf4j
public class AdminController {
    @Autowired
    private AdminService adminService;
    @Autowired
    private RedisTemplate redisTemplate;
    /**用户登录*/
    @PostMapping("/tokens")
    public Map<String,String> tokens(@RequestBody Admin admin, HttpSession session) {
       Map<String, String> result = new HashMap<>();
        //转json,fastjson有安全漏洞 推荐用jackson
        //log.info("接受到admin对象为:{}", JSONUtils.writeJSON(admin));
        // 登录
        Admin adminDB = adminService.login(admin);
        // 登录成功,获取token
        String token = session.getId();
        redisTemplate.setKeySerializer(new StringRedisSerializer());
        redisTemplate.opsForValue().set(token,adminDB,30, TimeUnit.MINUTES);
        result.put("token",token);
        return result;
    }
}
@Service("adminService")
@Transactional //控制事务
public class AdminServiceImpl implements AdminService {
    @Resource
    private AdminDao adminDao;

    @Override
    public Admin login(Admin admin) {
        //1.根据用户名查用户
        Admin adminDB = adminDao.findByUserName(admin.getUsername());
        //2.判断用户名是否存在
        if(ObjectUtils.isEmpty(adminDB)){ throw new RuntimeException("用户名错误!");}
        //3.判断密码
        String password = DigestUtils.md5DigestAsHex(admin.getPassword().getBytes(StandardCharsets.UTF_8));
        if(!StringUtils.equals(password,adminDB.getPassword())){throw new RuntimeException("密码输入错误!");}
        return adminDB;
    }
    
}

上边这个是service层,下边这个是mapper文件代码

 <!--根据用户名查用户-->
    <select id="findByUserName"  parameterType="String" resultMap="AdminMap">
        select id,
               username,
               password,
               avatar,
               created_at,
               updated_at,
               deleted_at
        from yingxue.admin
        where username = #{username}
    </select>

不懂的地方的一些解释。

redisTemplate.setKeySerializer(new StringRedisSerializer());

redisTemplate.opsForValue().set(token,adminDB,30, TimeUnit.MINUTES)

上边第一句是设置序列化的方式,默认序列化会造成乱码。

第二句是设置的key-string类型,key为token,value为序列化后的admin对象(不止包括账号、密码,还有头像创建时间之类的)。

现在还有一个重要的问题,本题验证登录时用的sessionId作为token,然后把token给返回给浏览器了,有每次访问都得带着这个token来访问。这种做法是算session呢还是token呢,如果是算token的话,为啥用seessionId当token呢。

这里首先我们来看一下cookie、session和token的区别:

cookie和session是一种 追踪 \**客户端\**\**服务器端\**通信的一种方式。

cookie是通过在客户端记录信息(在服务端没有记录)确定用户身份的,而session则通过在服务器端记录信息确定用户身份。

cookie:在客户端请求服务器时,如果服务器需要记录该用户状态就生成一个cookie返回发给客户端的,有客户端浏览器保存cookie,当浏览器再请求该网站时,
浏览器把请求的网址和请求头里的cookie一同提交给服务器 标明自己用户身份和状态。cookie以一段 存储在浏览器中 的文本存在(但服务器中没有保存,所以不够安全
session : 避免浏览器中可能伪造cookie的不安全,所以 生成并存储 在服务器端的值, 当用户第一次访问服务器时,session在服务器中生成记录并保存,
然后将这个记录通过cookie返回给浏览器,浏览器下次访问时带上cookie,服务器再通过session验证传过来的cookie是否正确。session在用户第一次访
问服务器的时候自动创建。session生成后,只要用户继续访问,服务器就会更新Session的最后访问时间,超时未更新会失效。

注意:cookie是在浏览器端设置过期时间,session是在服务器端设置过期时间。

在session这个设计中,cookie保存的值本质上是什么呢,就是sessionId,每一个session独一无二的。

sessionid: HTTP协议是无状态的,session不能依据HTTP连接来判断是否为同一客户,因此服务器向客户端浏览器发送一个名为SESSIONID的cookie,
它的值为该Session的id。Session依据该cookie来识别是否为同一用户。用户第一次访问会产生一个记录,sessionId保存在session中。

session相比cookie更加安全,但是它还是有缺点,就是每一个用户连接都会在服务器端中产生一个sessionId,当用户很多时会导致服务器压力很大,另外当服务器有多台时还有考虑sessionid在这些服务器之间共享;为了解决这些问题就有了: token 。

当用户第一次登录后,服务器生成一个token并将此token返回给客户端,以后客户端只需带上这个token前来请求数据即可,无需再次带上用户名和密码。

token不保存在session中,服务端在生成token时,加入少量的用户信息,比如用户的id,我们对数据使用算法加密生成签名添加到token中(加密的密钥只有自己知道)传递给客户端,客户端下次访问时带上token,服务器端通过密钥解析token生成签名,比较两次签名是否相同,若不相同则验证失败

简单token的组成;uid(用户唯一的身份标识)、time(当前时间的时间戳)、sign(签名,token的前几位以哈希算法压缩成的一定长度的十六进制字符串。为防止token泄露)。

所以我们每次带的这个东西叫令牌,但是我们还是用token方式来实现登录验证的,验证成功返回请求数据,验证失败让用户重新登录。

 二、用户信息接口

即登录成功以后的主界面需要展示用户信息,比如账号、密码、头像等。

这个就简单了,直接传入token,然后再redis中让token做key得到value即可,value即Admin对象,这个接口就很简单了。

 

标签:总结,浏览器,在线视频,用户,笔记,token,session,cookie,客户端
From: https://www.cnblogs.com/worthmove/p/17003546.html

相关文章

  • 设计模式面试题(总结最全面的面试题!!!)
    Java面试总结汇总,整理了包括Java重点知识,以及常用开源框架,欢迎大家阅读。文章可能有错误的地方,因为个人知识有限,欢迎各位大佬指出!文章持续更新中......ID标题地址......
  • Java集合面试题(总结最全面的面试题)
    Java面试总结汇总,整理了包括Java重点知识,以及常用开源框架,欢迎大家阅读。文章可能有错误的地方,因为个人知识有限,欢迎各位大佬指出!文章持续更新中......ID标题地址......
  • 详解聚类算法Kmeans-重要参数n_clusters【菜菜的sklearn课堂笔记】
    视频作者:菜菜TsaiTsai链接:【技术干货】菜菜的机器学习sklearn【全85集】Python进阶_哔哩哔哩_bilibilin_clusters是KMeans中的k,表示着我们告诉模型我们要分几类。这是KM......
  • Kafka 常用工具脚本总结
    系统启动Kafka​​-daemon​​参数可以让Kafka在后台运行。kafka-server-start.sh-daemon/usr/local/kafka/config/server.properties复制指定JMX端口启动JMX的全......
  • JS面试题总结(第二弹)
    JS面试题总结(第二弹)1什么是原型链?作用是啥?每个对象都有一个原型对象与之关联,这个原型对象也是一个普通对象,这个普通对象也有自己的原型对象,这样层层递进,就形成了一个......
  • SpringBoot最全笔记,企业最核心的技术你确定不来看看?
    这是我参与8月更文挑战的第7天,活动详情查看:8月更文挑战一、SpringBoot入门1.1、SpringBoot介绍    SpringBoot是由Pivotal团队提供的全新框架,其设计目的是用来简化......
  • 2022.12.24周总结
    1、Redis支持哪几种数据类型?String、List、Set、SortedSet、hashes2、Redis主要消耗什么物理资源?Redis是一种基于内存高性能的数据库---主要依赖于内存3、Redis有哪......
  • leetcode笔记——324周赛
    第三题中设置字典:G = defaultdict(set)这样默认每个item是个set,可以直接用G[i].add(),不用G.get()再判断了第三题中有个判断:return any(i != x and i!=y and......
  • nio-总结列表
    javaIO体系图  IO流的操作规律总结:1,明确体系:数据源:InputStream,Reader数据汇:OutputStream,Writer2,明确数据:因为数据分两种:字节,字符。数据源:是否是纯文本数据呢?是:R......
  • U142792移动箱子 学习笔记
    题意有n列箱子,其中有些是宝箱、其他是空箱。每一秒钟你可以选择以下操作执行:将第i列最上面的一个箱子移动到第j列的最上面;如果第i列最上面的一个箱子是宝箱,将其打开取......