当前位置: 首页 > news >正文

OA项目登录

导入依赖,下面的依赖是在这次OA登录中用到的

 <!--web依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-test</artifactId><scope>test</scope></dependency><!--lombok--><dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId></dependency><!--Swagger2--><!--Swagger-UI--><!--访问路径:http://localhost:8080/swagger-ui.html--><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger2</artifactId><version>2.9.2</version></dependency><dependency><groupId>io.springfox</groupId><artifactId>springfox-swagger-ui</artifactId><version>2.9.2</version></dependency><!--swaggerui  几个自定义界面方便查看接口--><!--访问路径:http://localhost:8080/doc.html--><dependency><groupId>com.github.xiaoymin</groupId><artifactId>swagger-bootstrap-ui</artifactId><version>1.9.6</version></dependency><dependency><groupId>com.google.guava</groupId><artifactId>guava</artifactId><version>25.1-jre</version></dependency><!--mysql--><dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>5.1.47</version></dependency><!--mybatis-plus--><dependency><groupId>com.baomidou</groupId><artifactId>mybatis-plus-boot-starter</artifactId><version>3.3.1</version></dependency><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency><!--JWT依赖--><dependency><groupId>io.jsonwebtoken</groupId><artifactId>jjwt</artifactId><version>0.9.0</version></dependency><!-- 热部署--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-devtools</artifactId></dependency><!--google kaptcha验证码依赖--><dependency><groupId>com.github.axet</groupId><artifactId>kaptcha</artifactId><version>0.0.9</version></dependency><!--spring data redis--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-redis</artifactId></dependency><dependency><groupId>org.apache.commons</groupId><artifactId>commons-pool2</artifactId></dependency>

编写配置文件

server:port: 8081spring:mvc:pathmatch:# \u89E3\u51B3spring2.6\u4EE5\u540E\u6574\u4E2Aswagger2\u7684\u95EE\u9898matching-strategy: ant_path_matcherdatasource:driver-class-name: com.mysql.jdbc.Driverurl: jdbc:mysql://localhost:3306/yeb?useUnicode=true&characterEncoding=UTF-8&serverTimezone=Asia/Shanghaiusername: rootpassword: roothikari:# \u8FDE\u63A5\u6C60\u540Dpool-name: DataHikariCP# \u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5\u6570minimum-idle: 5# \u7A7A\u95F2\u8FDE\u63A5\u5B58\u6D3B\u6700\u5927\u65F6\u95F4\uFF0C\u9ED8\u8BA460000\uFF0810\u5206\u949F\uFF09idle-timeout: 180000# \u6700\u5927\u8FDE\u63A5\u6570\uFF0C\u9ED8\u8BA410maximum-pool-size: 10# \u4ECE\u8FDE\u63A5\u6C60\u8FD4\u56DE\u7684\u8FDE\u63A5\u7684\u81EA\u52A8\u63D0\u4EA4auto-commit: true# \u8FDE\u63A5\u6700\u5927\u5B58\u6D3B\u65F6\u95F4\uFF0C0\u8868\u793A\u6C38\u4E45\u5B58\u6D3B\uFF0C\u9ED8\u8BA41800000\uFF0830\u5206\u949F\uFF09max-lifetime: 1800000# \u8FDE\u63A5\u8D85\u65F6\u65F6\u95F4\uFF0C\u9ED8\u8BA430000\uFF0830\u79D2\uFF09connection-timeout: 30000# \u6D4B\u8BD5\u8FDE\u63A5\u662F\u5426\u53EF\u7528\u7684\u67E5\u8BE2\u8BED\u53E5connection-init-sql: SELECT 1redis:# \u8D85\u65F6\u65F6\u95F4timeout: 10000ms# \u670D\u52A1\u5668\u5730\u5740host: 127.0.0.1# \u670D\u52A1\u5668\u7AEF\u53E3port: 6379database: 0lettuce:pool:# \u8FDE\u63A5\u6C60\u6700\u5927\u8FDE\u63A5\u6570 \u9ED8\u8BA48 \uFF0C\u8D1F\u6570\u8868\u793A\u6CA1\u6709\u9650\u5236max-active: 1024# \u6700\u5927\u8FDE\u63A5\u963B\u585E\u7B49\u5F85\u65F6\u95F4\uFF0C\u9ED8\u8BA4-1max-wait: 10000ms# \u6700\u5927\u7A7A\u95F2\u8FDE\u63A5max-idle: 200# \u6700\u5C0F\u7A7A\u95F2\u8FDE\u63A5min-idle: 5password:mybatis-plus:mapper-locations: classpath*:mapper/**/*Mapper.xmltype-aliases-package: com.atguigu.oaserver.pojoconfiguration:# \u5173\u95ED\u81EA\u52A8\u9A7C\u5CF0\u547D\u540Dmap-underscore-to-camel-case: false# mybatis SQL \u6253\u5370
logging:level:com.atguigu.oaserver.mapper: debugjwt:# JWT存储的请求头tokenHeader: Authorization# JWT加密使用的密钥secret: yeb-secret# JWT的超期限时间(60*60*24) 即24小时失效expiration: 604800000# JWT载荷中拿到开头 不要改tokenHead: Bearer

之后再用代码生成器生成所需要的类,接口

在controller定义登录方法

加载用户信息,判断密码,账号转态

因为要判断加密密码所以要用到passwordEncoder

loadUserByUsername通过实现userDetailsService来的

在TAdminUserDetailsServiceImpl里面判断用户是否存在

getAdminByUserName就是一个单查,根据username去查询用户是否存在

@Override
public TAdmin getAdminByUserName(String username) {QueryWrapper<TAdmin> qw = new QueryWrapper();qw.eq("username", username);TAdmin one = this.getOne(qw);return one;
}

账号状态和密码都没有问题之后生成token

RespBean工具类,用来响应结果封装类,用于统一返回给前端的数据格式

@Data
@AllArgsConstructor
@NoArgsConstructor
public class RespBean {// 响应状态码private long code;// 响应消息private String msg;// 响应数据private Object data;/*** 创建一个成功的响应结果,不包含数据** @param message 响应消息* @return 成功的响应结果*/public static RespBean success(String message) {return new RespBean(200, message, null);}/*** 创建一个成功的响应结果,包含数据** @param message 响应消息* @param obj 响应数据* @return 成功的响应结果*/public static RespBean success(String message, Object obj) {return new RespBean(200, message, obj);}/*** 创建一个失败的响应结果,不包含数据** @param message 响应消息* @return 失败的响应结果*/public static RespBean error(String message) {return new RespBean(500, message, null);}/*** 创建一个失败的响应结果,包含数据** @param message 响应消息* @param obj 响应数据* @return 失败的响应结果*/public static RespBean error(String message, Object obj) {return new RespBean(500, message, obj);}
}

JwtUtils工具类

@Data
@Component
public class JwtUtils {@Value("${jwt.tokenHead}")String tokenHead;@Value("${jwt.secret}")String secret;@Value("${jwt.expiration}")int expiration;@Value("${jwt.tokenHeader}")private String tokenHeader;public String genenerateToken(String username) {Date exDate = new Date(System.currentTimeMillis() + expiration);return Jwts.builder().setSubject(username)// 主题.setIssuedAt(new Date())// 签发时间.setExpiration(exDate)// 过期时间.signWith(SignatureAlgorithm.HS512, secret).compact();}
}

上面的@value来之配置文件yml,tokenHeader的值一定不要更改

jwt:# JWT存储的请求头tokenHeader: Authorization# JWT加密使用的密钥secret: yeb-secret# JWT的超期限时间(60*60*24) 即24小时失效expiration: 604800000# JWT载荷中拿到开头 不要改tokenHead: Bearer

这边既然需要登录那必然要编写security用来登录

@Configuration
public class SecurityConfig extends WebSecurityConfigurerAdapter {@Overrideprotected void configure(HttpSecurity http) throws Exception {// 允许访问/loginhttp.authorizeRequests().mvcMatchers("/login").permitAll().anyRequest().permitAll();// 关闭csrfhttp.csrf().disable().sessionManagement().sessionCreationPolicy(SessionCreationPolicy.STATELESS);// 禁用缓存http.headers().cacheControl();
}

之后根据自己配置的端口号和数据库中的数据进行登录测试

比如我的就是:localhost:8081/login?username=admin&password=123456

如果浏览器装配了JSON插件,然后不出意外的话就可以在浏览器看到这样子的

后面就是获取token里面的数据,你登录之后把登录的用户的数据存入token,那如何获取它呢

先来编写一个这样子方法

  /*** 获取管理员信息** @param token 用户名和密码认证令牌,用于获取当前登录的管理员信息* @return RespBean 包含管理员信息的响应对象*/@RequestMapping("/admin/info")public RespBean getAminInfo(UsernamePasswordAuthenticationToken token) {// 从认证令牌中获取管理员对象TAdmin principal = (TAdmin) token.getPrincipal();// 打印管理员信息,用于调试和日志记录System.out.println(principal);// 返回成功响应,包含管理员信息return RespBean.success("获取用户信息成功", principal);}

你想要获取登录人员的信息,那就要有个JWT认证过滤器


/*** JWT认证过滤器,用于拦截请求并验证JWT令牌*/
public class JwtAuthencationTokenFilter extends OncePerRequestFilter {@Autowiredprivate JwtUtils jwtUtils;@Autowiredprivate TAdminUserDetailsServiceImpl userDetailsService;/*** 执行过滤器的主要方法** @param request   HttpServletRequest对象,用于获取请求信息* @param response  HttpServletResponse对象,用于设置响应信息* @param filterChain 过滤链,用于将请求传递给下一个过滤器或目标资源* @throws ServletException 如果过滤过程中发生Servlet异常* @throws IOException 如果过滤过程中发生IO异常*/@Overrideprotected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain) throws ServletException, IOException {// 从请求头中获取JWT令牌String token = request.getHeader(jwtUtils.getTokenHeader());// 打印令牌信息,用于调试System.out.println("token=======>" + token);if (token != null && token.startsWith(jwtUtils.getTokenHead())) {// 移除令牌前缀,获取纯令牌字符串String[] s = token.split(" ");token = s[1];System.out.println("token=======>" + token);// 从令牌中提取用户名String username = jwtUtils.getUserNameFromTokens(token);System.out.println("username=======>" + username);// 如果用户名不为空且上下文中尚未进行认证if (username != null && SecurityContextHolder.getContext().getAuthentication() == null) {// 根据用户名获取用户详细信息TAdmin tAdmin = (TAdmin) userDetailsService.loadUserByUsername(username);// 设置认证信息UsernamePasswordAuthenticationToken authenticationToken =new UsernamePasswordAuthenticationToken(tAdmin, null, tAdmin.getAuthorities());authenticationToken.setDetails(new WebAuthenticationDetailsSource().buildDetails(request));SecurityContextHolder.getContext().setAuthentication(authenticationToken);}}// 将请求传递给过滤链中的下一个元素filterChain.doFilter(request, response);}
}

然后这个过滤器放到security里面进行添加

之后就可以用ApiFox这个软件来进行测试

先打开apifox,就是下面图中的软件

然后跟着下面的步骤来

这里的信息来着登录成功之后的tokenHead和token,tokenHead后面记得打空格

这样就可以看到登录的用户信息了

相关文章:

OA项目登录

导入依赖,下面的依赖是在这次OA登录中用到的 <!--web依赖--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId></dependency><dependency><groupId>org.sprin…...

verilogHDL仿真详解

前言 Verilog HDL中提供了丰富的系统任务和系统函数&#xff0c;用于对仿真环境、文件操作、时间控制等进行操作。&#xff08;后续会进行补充&#xff09; 正文 一、verilogHDL仿真详解 timescale 1ns/1ps //时间单位为1ns&#xff0c;精度为1ps&#xff0c; //编译…...

基于http协议的天气爬虫

该系统将基于目前比较流行的网络爬虫技术&#xff0c; 对网站上的天气数据进行查询分析&#xff0c; 最终使客户能够通过简单的操作&#xff0c; 快速&#xff0c; 准确的获取目标天气数据。主要包括两部分的功能&#xff0c; 第一部分是天气数据查询&#xff0c; 包括时间段数…...

_STM32关于CPU超频的参考_HAL

MCU: STM32F407VET6 官方最高稳定频率&#xff1a;168MHz 工具&#xff1a;STM32CubeMX 本篇仅仅只是提供超频&#xff08;默认指的是主频&#xff09;的简单方法&#xff0c;并未涉及STM32超频极限等问题。原理很简单&#xff0c;通过设置锁相环的倍频系数达到不同的频率&am…...

C#,图论与图算法,任意一对节点之间最短距离的弗洛伊德·沃肖尔(Floyd Warshall)算法与源程序

一、弗洛伊德沃肖尔算法 Floyd-Warshall算法是图的最短路径算法。与Bellman-Ford算法或Dijkstra算法一样&#xff0c;它计算图中的最短路径。然而&#xff0c;Bellman Ford和Dijkstra都是单源最短路径算法。这意味着他们只计算来自单个源的最短路径。另一方面&#xff0c;Floy…...

AWS云计算概览(自用留存,整理中)

目录 一、云概念概览 &#xff08;1&#xff09;云计算简介 &#xff08;2&#xff09;云计算6大优势 &#xff08;3&#xff09;web服务 &#xff08;4&#xff09;AWS云采用框架&#xff08;AWS CAF&#xff09; 二、云经济学 & 账单 &#xff08;1&#xff09;定…...

1. npm 常用命令详解

npm 常用命令详解 npm&#xff08;Node Package Manager&#xff09;是 Node.js 的包管理工具&#xff0c;用于安装和管理 Node.js 应用中的依赖库。下面是 npm 的一些常用命令及其详细解释和示例代码。 镜像源 # 查询当前使用的镜像源 npm get registry# 设置为淘宝镜像源 …...

js:根据后端返回数据的最大值进行计算然后设置这个最大值为百分之百,其他的值除这个最大值

问&#xff1a; 现在tabData.value 接收到了后端返回的数据&#xff0c; [{text:人力,percentage&#xff1a;‘90’}&#xff0c;{text:物品,percentage&#xff1a;‘20’}&#xff0c;{text:物理,percentage&#xff1a;‘50’}&#xff0c;{text:服务,percentage&#xff…...

【Spring】@Size 无法拦截null的原因

问题复现 在构建 Web 服务时&#xff0c;我们一般都会对一个 HTTP 请求的 Body 内容进行校验&#xff0c;例如我们来看这样一个案例及对应代码。当开发一个学籍管理系统时&#xff0c;我们会提供了一个 API 接口去添加学生的相关信息&#xff0c;其对象定义参考下面的代码&…...

【Block总结】掩码窗口自注意力 (M-WSA)

摘要 论文链接&#xff1a;https://arxiv.org/pdf/2404.07846 论文标题&#xff1a;Transformer-Based Blind-Spot Network for Self-Supervised Image Denoising Masked Window-Based Self-Attention (M-WSA) 是一种新颖的自注意力机制&#xff0c;旨在解决传统自注意力方法在…...

用 HTML5 Canvas 和 JavaScript 实现雪花飘落特效

这篇文章将带您深入解析使用 HTML5 Canvas 和 JavaScript 实现动态雪花特效的代码原理。 1,效果展示 该效果模拟了雪花从天而降的动态场景,具有以下特点: 雪花数量、大小、透明度和下落速度随机。雪花会在屏幕底部重置到顶部,形成循环效果。随窗口大小动态调整,始终覆盖…...

【cocos creator】【ts】事件派发系统

触发使用&#xff1a; EventTool.emit(“onClick”) 需要监听的地方&#xff0c;onload调用&#xff1a; EventTool.on(“onClick”, this.onClickEvent, this) /**事件派发*/class EventTool {protected static _instance: EventTool null;public static get Instance(): Eve…...

《探索鸿蒙Next上开发人工智能游戏应用的技术难点》

在科技飞速发展的当下&#xff0c;鸿蒙Next系统为应用开发带来了新的机遇与挑战&#xff0c;开发一款运行在鸿蒙Next上的人工智能游戏应用更是备受关注。以下是在开发过程中可能会遇到的一些技术难点&#xff1a; 鸿蒙Next系统适配性 多设备协同&#xff1a;鸿蒙Next的一大特色…...

CSS | CSS实现两栏布局(左边定宽 右边自适应,左右成比自适应)

目录 一、左边定宽 右边自适应 1.浮动 2.利用浮动margin 3.定位margin 4.flex布局 5.table 布局 二、左右成比自适应 1:1 1flex布局 table布局 1:2 flex布局 <div class"father"><div class"left">左边自适应</div><div class"r…...

acwing_3195_有趣的数

acwing_3195_有趣的数 // // Created by HUAWEI on 2024/11/17. // #include<iostream> #include<cstring> #include<algorithm>#define int long longusing namespace std;const int N 1000 50; const int MOD 1e9 7; int C[N][N]; //组合数signed mai…...

Liunx-搭建安装VSOMEIP环境教程 执行 运行VSOMEIP示例demo

本文安装环境为Liunx&#xff0c;搭建安装VSOMEIP环境并运行基础例子。 1. 安装基础环境 使用apt-get来安装基础环境&#xff0c;受网络影响可以分开多次安装。环境好的也可以一次性执行。 sudo apt-get install gcc g sudo apt-get install cmake sudo apt-get install lib…...

Git | git revert命令详解

关注&#xff1a;CodingTechWork 引言 Git 是一个强大的版本控制工具&#xff0c;广泛应用于现代软件开发中。它为开发人员提供了多种功能来管理代码、协作开发和版本控制。在 Git 中&#xff0c;有时我们需要撤销或回退某些提交&#xff0c;而git revert 是一个非常有用的命令…...

ASP.NET Core 中,Cookie 认证在集群环境下的应用

在 ASP.NET Core 中&#xff0c;Cookie 认证在集群环境下的应用通常会遇到一些挑战。主要的问题是 Cookie 存储在客户端的浏览器中&#xff0c;而认证信息&#xff08;比如 Session 或身份令牌&#xff09;通常是保存在 Cookie 中&#xff0c;多个应用实例需要共享这些 Cookie …...

Flyte工作流平台调研(五)——扩展集成

系列文章&#xff1a; Flyte工作流平台调研&#xff08;一&#xff09;——整体架构 Flyte工作流平台调研&#xff08;二&#xff09;——核心概念说明 Flyte工作流平台调研&#xff08;三&#xff09;——核心组件原理 Flyte工作流平台调研&#xff08;四&#xff09;——…...

【AUTOSAR 基础软件】软件组件的建立与使用(“代理”SWC)

基础软件往往需要建立一些“代理”SWC来完成一些驱动的抽象工作&#xff08;Complex_Device_Driver_Sw或者Ecu_Abstraction_Sw等&#xff09;&#xff0c;或建立Application Sw Component来补齐基础软件需要提供的功能实现。当面对具体的项目时&#xff0c;基础软件开发人员还可…...

AI-调查研究-01-正念冥想有用吗?对健康的影响及科学指南

点一下关注吧&#xff01;&#xff01;&#xff01;非常感谢&#xff01;&#xff01;持续更新&#xff01;&#xff01;&#xff01; &#x1f680; AI篇持续更新中&#xff01;&#xff08;长期更新&#xff09; 目前2025年06月05日更新到&#xff1a; AI炼丹日志-28 - Aud…...

基于Uniapp开发HarmonyOS 5.0旅游应用技术实践

一、技术选型背景 1.跨平台优势 Uniapp采用Vue.js框架&#xff0c;支持"一次开发&#xff0c;多端部署"&#xff0c;可同步生成HarmonyOS、iOS、Android等多平台应用。 2.鸿蒙特性融合 HarmonyOS 5.0的分布式能力与原子化服务&#xff0c;为旅游应用带来&#xf…...

嵌入式学习笔记DAY33(网络编程——TCP)

一、网络架构 C/S &#xff08;client/server 客户端/服务器&#xff09;&#xff1a;由客户端和服务器端两个部分组成。客户端通常是用户使用的应用程序&#xff0c;负责提供用户界面和交互逻辑 &#xff0c;接收用户输入&#xff0c;向服务器发送请求&#xff0c;并展示服务…...

Mysql8 忘记密码重置,以及问题解决

1.使用免密登录 找到配置MySQL文件&#xff0c;我的文件路径是/etc/mysql/my.cnf&#xff0c;有的人的是/etc/mysql/mysql.cnf 在里最后加入 skip-grant-tables重启MySQL服务 service mysql restartShutting down MySQL… SUCCESS! Starting MySQL… SUCCESS! 重启成功 2.登…...

NPOI Excel用OLE对象的形式插入文件附件以及插入图片

static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...

Python实现简单音频数据压缩与解压算法

Python实现简单音频数据压缩与解压算法 引言 在音频数据处理中&#xff0c;压缩算法是降低存储成本和传输效率的关键技术。Python作为一门灵活且功能强大的编程语言&#xff0c;提供了丰富的库和工具来实现音频数据的压缩与解压。本文将通过一个简单的音频数据压缩与解压算法…...

Python训练营-Day26-函数专题1:函数定义与参数

题目1&#xff1a;计算圆的面积 任务&#xff1a; 编写一个名为 calculate_circle_area 的函数&#xff0c;该函数接收圆的半径 radius 作为参数&#xff0c;并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求&#xff1a;函数接收一个位置参数 radi…...

Java 与 MySQL 性能优化:MySQL 慢 SQL 诊断与分析方法详解

文章目录 一、开启慢查询日志&#xff0c;定位耗时SQL1.1 查看慢查询日志是否开启1.2 临时开启慢查询日志1.3 永久开启慢查询日志1.4 分析慢查询日志 二、使用EXPLAIN分析SQL执行计划2.1 EXPLAIN的基本使用2.2 EXPLAIN分析案例2.3 根据EXPLAIN结果优化SQL 三、使用SHOW PROFILE…...

pgsql:还原数据库后出现重复序列导致“more than one owned sequence found“报错问题的解决

问题&#xff1a; pgsql数据库通过备份数据库文件进行还原时&#xff0c;如果表中有自增序列&#xff0c;还原后可能会出现重复的序列&#xff0c;此时若向表中插入新行时会出现“more than one owned sequence found”的报错提示。 点击菜单“其它”-》“序列”&#xff0c;…...

基于开源AI智能名片链动2 + 1模式S2B2C商城小程序的沉浸式体验营销研究

摘要&#xff1a;在消费市场竞争日益激烈的当下&#xff0c;传统体验营销方式存在诸多局限。本文聚焦开源AI智能名片链动2 1模式S2B2C商城小程序&#xff0c;探讨其在沉浸式体验营销中的应用。通过对比传统品鉴、工厂参观等初级体验方式&#xff0c;分析沉浸式体验的优势与价值…...