当前位置: 首页 > 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;基础软件开发人员还可…...

ES6从入门到精通:前言

ES6简介 ES6&#xff08;ECMAScript 2015&#xff09;是JavaScript语言的重大更新&#xff0c;引入了许多新特性&#xff0c;包括语法糖、新数据类型、模块化支持等&#xff0c;显著提升了开发效率和代码可维护性。 核心知识点概览 变量声明 let 和 const 取代 var&#xf…...

使用van-uploader 的UI组件,结合vue2如何实现图片上传组件的封装

以下是基于 vant-ui&#xff08;适配 Vue2 版本 &#xff09;实现截图中照片上传预览、删除功能&#xff0c;并封装成可复用组件的完整代码&#xff0c;包含样式和逻辑实现&#xff0c;可直接在 Vue2 项目中使用&#xff1a; 1. 封装的图片上传组件 ImageUploader.vue <te…...

Mac下Android Studio扫描根目录卡死问题记录

环境信息 操作系统: macOS 15.5 (Apple M2芯片)Android Studio版本: Meerkat Feature Drop | 2024.3.2 Patch 1 (Build #AI-243.26053.27.2432.13536105, 2025年5月22日构建) 问题现象 在项目开发过程中&#xff0c;提示一个依赖外部头文件的cpp源文件需要同步&#xff0c;点…...

Reasoning over Uncertain Text by Generative Large Language Models

https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829https://ojs.aaai.org/index.php/AAAI/article/view/34674/36829 1. 概述 文本中的不确定性在许多语境中传达,从日常对话到特定领域的文档(例如医学文档)(Heritage 2013;Landmark、Gulbrandsen 和 Svenevei…...

return this;返回的是谁

一个审批系统的示例来演示责任链模式的实现。假设公司需要处理不同金额的采购申请&#xff0c;不同级别的经理有不同的审批权限&#xff1a; // 抽象处理者&#xff1a;审批者 abstract class Approver {protected Approver successor; // 下一个处理者// 设置下一个处理者pub…...

基于Java+VUE+MariaDB实现(Web)仿小米商城

仿小米商城 环境安装 nodejs maven JDK11 运行 mvn clean install -DskipTestscd adminmvn spring-boot:runcd ../webmvn spring-boot:runcd ../xiaomi-store-admin-vuenpm installnpm run servecd ../xiaomi-store-vuenpm installnpm run serve 注意&#xff1a;运行前…...

PHP 8.5 即将发布:管道操作符、强力调试

前不久&#xff0c;PHP宣布了即将在 2025 年 11 月 20 日 正式发布的 PHP 8.5&#xff01;作为 PHP 语言的又一次重要迭代&#xff0c;PHP 8.5 承诺带来一系列旨在提升代码可读性、健壮性以及开发者效率的改进。而更令人兴奋的是&#xff0c;借助强大的本地开发环境 ServBay&am…...

系统掌握PyTorch:图解张量、Autograd、DataLoader、nn.Module与实战模型

本文较长&#xff0c;建议点赞收藏&#xff0c;以免遗失。更多AI大模型应用开发学习视频及资料&#xff0c;尽在聚客AI学院。 本文通过代码驱动的方式&#xff0c;系统讲解PyTorch核心概念和实战技巧&#xff0c;涵盖张量操作、自动微分、数据加载、模型构建和训练全流程&#…...

如何在Windows本机安装Python并确保与Python.NET兼容

✅作者简介&#xff1a;2022年博客新星 第八。热爱国学的Java后端开发者&#xff0c;修心和技术同步精进。 &#x1f34e;个人主页&#xff1a;Java Fans的博客 &#x1f34a;个人信条&#xff1a;不迁怒&#xff0c;不贰过。小知识&#xff0c;大智慧。 &#x1f49e;当前专栏…...

LangChain 中的文档加载器(Loader)与文本切分器(Splitter)详解《二》

&#x1f9e0; LangChain 中 TextSplitter 的使用详解&#xff1a;从基础到进阶&#xff08;附代码&#xff09; 一、前言 在处理大规模文本数据时&#xff0c;特别是在构建知识库或进行大模型训练与推理时&#xff0c;文本切分&#xff08;Text Splitting&#xff09; 是一个…...