码神之路项目总结(二)

news2024/10/2 16:20:56

目录

一、登录功能 &

二、获取用户信息&

三、退出登录

四、登录拦截¥

五、ThreadLocal保存用户信息¥

六、文章详情


一、登录功能 &

 请求接口:

  

 思路:

1、首先接收前端传过来的用户名和密码,判断值是否为空,为空则直接返回错误状态码

2、将密码用md5进行盐值加密,加密后生成新密码

3、用前端传过来的用户名和加密后的新密码去用户表查询用户,查不到则直接返回错误状态码

4、使用jwt工具类以用户的id为参数生成token,返回给前端页面

5、以用户生成的token为key,从用户表中查出的用户信息为value,存入redis中,设置一天的过期时间

二、获取用户信息&

说明:因为你登录成功后,仅仅是返回给前端的一个token,用户的头像信息个人信息前端都不知道,因此登录成功后接下来前端要再发请求获取用户信息

请求接口:

思路:

 1、获取用户信息的请求头中有token,我们先接收拿到token

2、用jwt工具类中的方法检验token格式是否合法,不合法返回错误状态码

3、以token为key去redis中获取token对应的用户信息,获取不到则返回错误状态码

4、将从token中获取到的用户信息封装好返回给前端页面

好处:
将用户信息和token绑定存入redis中,减少了再一次查询数据库,提高了查询效率

三、退出登录

请求接口:

 思路:

1、退出请求的请求头中携带token,我们首先获取到这个token

2、然后将redis中这个token绑定的数据给删除掉即可完成退出

四、登录拦截¥

作用:博客上的有些资源,我们需要用户登录后才能访问,如果资源过多需要为每一个请求都加一个判断登录的方法有些代码重复,因此我们采用拦截器统一处理这些请求是否登录。

思路:

1、写一个继承HandlerInterceptor的拦截器类

2、在拦截器类中重写prehandler方法,如果不是controller方法返回true放行,如果是token为空、token格式不正确、token在redis中失效则返回false拦截,否则返回true放行

3、在WebMvcConfigurer中重写addIntercepters方法注册自定义的拦截器

五、ThreadLocal保存用户信息¥

作用:需要登录才能访问的资源请求,在通过登录拦截后,如果我们要使用登录的用户信息这个时候我们再从请求中去获取就显得有点麻烦,不如在通过登录拦截后,将用户的信息保存进ThreadLocal中,之后用到用户信息了再从ThreadLocal中获取用户信息。

思路:

1、定义ThreadLocal的工具类,实例化一个ThreadLocal,并创建它的的put、get、remove方法

2、在通过拦截器的拦截后将登录用户的信息存入ThreadLocal中

3、在所有方法执行完,线程结束前,将ThreadLocal中用完的信息手动删除

图解:

结构==》每一个Thread维护一个ThreadLocalMap,一个ThreadLocalMap中可以有多个Entry实体,而Entry实体的key是ThreadLocal实例,value是当前线程的存储信息。

泄漏==》因为实体Entry的key指向ThreadLocal实例是弱引用,在ThreadLocal实例没有引用的时候就会被垃圾回收掉,因此key的值就变成了null,实体Entry就只剩一个value,按理来说没人用的value应该也被垃圾回收掉,但是value所在的实体Entry在的ThreadLocalMap受当前线程维护,所以实体的Entry的生命周期跟当前线程一样长,如果不手动回收则此Entry实体会一直存在内存中,如果使用了线程池复用线程则会内存占用量越来越大,最终导致内存泄漏

六、文章详情

请求接口:

思路:

1、请求中携带本篇文章的id,我们可以通过id在文章表中查询出文章的相关信息,返回前端页面

2、查询完成后,以查询出的文章内容为已知条件,使用线程池将文章表中此文章的阅读次数+1

线程池更新阅读次数详情:

@EnableAsync+@Async实现共享线程池

/**
 * @description: 配置线程池相关参数
 * @author: 李传城
 * @date: 2022-11-03 01:20
 */

@Configuration
@EnableAsync
public class ThreadPoolConfig {

    @Bean("taskExecutor")
    public Executor asyncServiceExecutor() {
        ThreadPoolTaskExecutor executor = new ThreadPoolTaskExecutor();
        // 设置核心线程数
        executor.setCorePoolSize(5);
        // 设置最大线程数
        executor.setMaxPoolSize(20);
        //配置队列大小
        executor.setQueueCapacity(Integer.MAX_VALUE);
        // 设置线程活跃时间(秒)
        executor.setKeepAliveSeconds(60);
        // 设置默认线程名称
        executor.setThreadNamePrefix("码神之路博客项目");
        // 等待所有任务结束后再关闭线程池
        executor.setWaitForTasksToCompleteOnShutdown(true);
        //执行初始化
        executor.initialize();
        return executor;
    }
}
/**
 * @description: 线程池更新阅读次数
 * @author: 李传城
 * @date: 2022-11-03 01:21
 */

@Component
public class ThreadService {


    //把服务配置的线程池名称写上,代表开启这个配置名称的线程池处理当前方法
    @Async("taskExecutor")
    public void updateViewCount(ArticleMapper articleMapper,Article article){

        Article articleUpdate = new Article();
        articleUpdate.setViewCounts(article.getViewCounts() + 1);
        LambdaQueryWrapper<Article> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Article::getId,article.getId());
        queryWrapper.eq(Article::getViewCounts,article.getViewCounts());
        articleMapper.update(articleUpdate,queryWrapper);
        try {
            //睡眠5秒 证明不会影响主线程的使用
            Thread.sleep(10);
            System.out.println("文章:"+article.getTitle()+"--阅读次数+1");
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}

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

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

相关文章

知识图谱认知智能理论与实战----------第二章 知识图谱模式设计

文章目录一. 知识图谱模式二. 模式与本体三. 本体概论I. 模式与本体辨析II.本体的构成要素III.实体分类IV.实体分类四. 六韬法I. 场景II. 复用III. 事物IV. 联系V. 约束VI. 评价一. 知识图谱模式 实体&#xff1a;eg&#xff1a;法国&#xff0c;巴黎…关系&#xff1a;eg&…

深度学习入门(三十六)计算性能——异步计算、自动并行

深度学习入门&#xff08;三十六&#xff09;计算性能——异步计算、自动并行前言计算性能——异步计算教材1 异步计算1.1 通过后端异步处理1.2 小结2 自动并行2.1 基于GPU的并行计算2.2 并行计算与通信3.3 小结前言 核心内容来自博客链接1博客连接2希望大家多多支持作者 本文…

一起Talk Android吧(第四百一十三回:使用三角函数绘制正弦波)

文章目录整体思路图形讲解示例程序注意事项各位看官们&#xff0c;大家好&#xff0c;上一回中咱们说的例子是"Math类常用方法介绍",这一回咱们介绍的例子是使用三角函数绘制正弦波。闲话休提&#xff0c;言归正转&#xff0c;让我们一起Talk Android吧&#xff01; …

leetcode-每日一题-1710-卡车上的最大单元数(简单,哈希,暴力)

今天的这道题其实很好读懂&#xff0c;因为很容易可以看出来暴力求解&#xff0c;但其实还是隐藏一个hash求解法很巧妙&#xff0c;因为我在很久之前就用过hash解答过这样类似的题&#xff0c;所以这个题也是可以使用的&#xff0c;可以看看我第二个hash解法 目录 暴力效率(效…

SBF vs. 火柴大王

生活中的一切都建立在自信之上。”Ivar Kreuger1929年10月28日&#xff0c;瑞典商人Ivar Kreuger出现在《时代》杂志的封面上。 他是当时美国最受关注的人物之一&#xff0c;因为他富有、有权势、神秘。Kreuger控制着四分之三的火柴生产和销售&#xff0c;在全球35个不同国家拥…

wy的leetcode刷题记录_Day43

wy的leetcode刷题记录_Day40 声明 本文章的所有题目信息都来源于leetcode 如有侵权请联系我删掉! 时间&#xff1a;2022-11-15 前言 今天时间比较多而且题目比较简单&#xff0c;应该能写三四道题。 目录wy的leetcode刷题记录_Day40声明前言1710. 卡车上的最大单元数题目介…

Spectacle源码编译方法

一、简介 Spectacle 是一个用于抓取桌面截图的简单应用程序。它可以抓取整个桌面、单个显示器、当前活动窗口、鼠标所在的窗口或是屏幕上的一块矩形区域的图像。截取的图像可被打印、发送到其他应用程序进行处理、或是直接保存下来。 Spectacle是archlinux wiki中推荐KDE使用…

刘二大人CNN

10.卷积神经网络&#xff08;基础篇&#xff09;_哔哩哔哩_bilibili 0、前一部分 卷积层 和 subsampling 叫做Feature Extraction特征提取器&#xff0c;后一部分叫做classification 1、每一个卷积核它的通道数量要求和输入通道是一样的。这种卷积核的总数有多少个和你输出通…

SpringBoot+Vue项目医院挂号系统的设计与实现

文末获取源码 开发语言&#xff1a;Java 使用框架&#xff1a;spring boot 前端技术&#xff1a;JavaScript、Vue 、css3 开发工具&#xff1a;IDEA/MyEclipse/Eclipse、Visual Studio Code 数据库&#xff1a;MySQL 5.7/8.0 数据库管理工具&#xff1a;phpstudy/Navicat JDK版…

2.6 自定义srv python

功能介绍 以自定义数据类型为基础&#xff0c;完成一个节点作为服务器&#xff0c;另一个节点接收传送两个数字到服务端&#xff0c;服务端计算后反馈到客户端进行打印输出 1、工作空间 1.1 创建工作空间lee_ws mkdir -p ~/lee_ws/src cd ~/lee_ws/src/ catkin_init_worksp…

leetcode134.加油站 贪心法求解 (c++版本)

题目描述 题目比较长&#xff0c;明确以下这点就可以 gas数组是当前下标i加油站所能加的油cost数组是从当前下标i加油站到下一加油站所消耗的油那么gas [i]与cost [i] 的大小就决定了车辆能否从当前加油站出发到达下一加油站 上面三点非常重要是能正确做出题目的必须要求 其实…

字符流,编码表,字符流写数据,字符流读数据

文章目录前言字符流编码表字符串中的编码解码问题字符流写数据字符流读数据总结前言 因为近期考试原因&#xff0c;还有自身惰性的问题&#xff0c;小编最近停更了一段时间&#xff0c;随之而来的罪恶感让我又开启了自学与创作之路&#xff0c;学习这么久&#xff0c;自己虽然…

来源稳定的l2逐笔接口数据去哪找?

l2逐笔接口的逐笔数据的最初来源均是从交易所获取&#xff0c;其授予了一些信息服务商L2非展示数据接口转发权限&#xff0c;其中包含了逐笔成交、逐笔委托等数据。使用时&#xff0c;通常是从信息商处购买&#xff0c;比如同花顺、万得、国泰安等等。那么小编认为通过交易所授…

mysql中find_in_set()函数的使用及in()用法详解

MySQL手册中find_in_set函数的语法解释&#xff1a; FIND_IN_SET(str,strlist) str 要查询的字符串 strlist 字段名 参数以”,”分隔 如 (1,2,6,8,10,22) 查询字段(strlist)中包含(str)的结果&#xff0c;返回结果为null或记录 假如字符串str在由N个子链组成的字符串列表strli…

Linux:rpm与yum(内含:1.rpm介绍+2.卸载rpm包+3.安装rpm(应用案例)+4.yum(应用案例))

1.rpm介绍使用: 实例&#xff1a;查看当前系统是否安装了 firefox &#xff0c;操作如下&#xff1a; 解释&#xff1a; 名称&#xff1a;firefox 版本号&#xff1a;91.11.0-2 使用操作系统&#xff1a;el7.centos.x86_64 表示centos.x的64位系统。 查询软件包是否安装&#…

跨境电商卖家必知的9个圣诞节营销技巧

关键词&#xff1a;跨境电商卖家、圣诞节营销 圣诞节——对跨境电商卖家来说是非常重要的促销节日。根据以往的经验&#xff0c;您或许已经有了初步的促销想法&#xff0c;想知道您今年的跨境电子商务营销策略是否正确&#xff1f;为您整理了跨境电商卖家必须注意的营销技巧&am…

TiDB数据库架构——TiDB Server

TiDB Server架构 TiDB Server 是SQL层&#xff0c;无状态&#xff0c;启动多个TiDBServer&#xff0c;均匀分摊&#xff0c;解析SQL&#xff0c;获取真实数据。 Protocol Layer、&#xff1a;负责客户端的连接。 Parse、Compile&#xff1a;负责SQL语句的解析和编译&#xff…

信息控制信息卷积

🍿*★,*:.☆欢迎您/$:*.★* 🍿 目录 背景

少儿编程 电子学会图形化 scratch编程等级考试四级真题答案解析(判断题)2022年9月

目录 2022年9月scratch编程等级考试四级真题 判断题(共10题,每题2分,共20分) 推荐资料

java学生作业带选课管理系统ssh

1.管理员具有对学校课程信息&#xff0c;教师信息&#xff0c;学生信息增删改查的权限 &#xff08;1&#xff09;可以录入学校所开课程&#xff0c;学生信息&#xff0c;教师信息&#xff1b; &#xff08;2&#xff09;可以对教师的开课信息进行增加&#xff0c;删除&#xf…