工作笔记 5 Post请求 密码加密器PasswordEncoder 小程序登录

1.微信小程序登录

1.1小程序登录流程图

1.2使用sa-token完成登录

参考csdn这位老哥的http://t.csdnimg.cn/oRgvI

sa-token是一款轻量级的安全框架

1.2.1首先引入sa-token依赖

        <dependency><groupId>cn.dev33</groupId><artifactId>sa-token-spring-boot-starter</artifactId><version>1.37.0</version></dependency>

1.2.2Controller

    @GetMapping("/wxlogin")@ApiOperation("微信登录")public Result login(String code) {//微信登录UserLoginVo userLoginVo = usersService.wxLogin(code);return new Result(2000,"登录成功",userLoginVo);}

1.2.3Service 

  @Override@Transactional(rollbackFor = Exception.class)public UserLoginVo wxLogin(String code) {//调用微信接口服务,获得当前微信用户的openidHashMap<String, String> map = new HashMap<>();//封装参数map.put("appid",appId);map.put("secret",secret);map.put("js_code",code);map.put("grant_type","authorization_code");//调用微信接口服务,获得当前微信用户的openidString json = HttpClientUtil.doGet(WX_LOGIN, map);//解析json,获得openidJSONObject jsonObject = JSON.parseObject(json);System.out.println("111111111111111111111111111111111111111111111");System.out.println(jsonObject);System.out.println("111111111111111111111111111111111111111111111");String openid = jsonObject.getString("openid");System.out.println(openid);System.out.println("这是大名鼎鼎的openId******************************************");//判断openid是否为空,如果为空表示登录失败,抛出业务异常if(openid == null){throw new RuntimeException("微信登录失败");}//判断当前用户是否为新用户Users user = usersDao.getByOpenid(openid);//如果是新用户,自动完成注册synchronized (this){if(user == null){user = Users.builder().openid(openid).build();usersDao.insert(user);}}// 使用 Sa-Token 进行登录,并返回TokenStpUtil.login(openid);String tokenValue = StpUtil.getTokenValue();System.out.println(tokenValue);System.out.println("以上是解析*******************************************************");UserLoginVo build = UserLoginVo.builder().openId(openid).token(tokenValue).build();//返回这个用户对象return build;}

1.2.4返回类

@Builder是创建者模式

@Data
@Builder
public class UserLoginVo implements Serializable {/*** 主键ID*/private Integer Id;/*** 微信服务器上的唯一id*/private String openId;/*** token*/private String token;}

2.密码加密器

因为PasswordEncoder是springSecurity中的一个模块

2.1引入springSecurity依赖

<!--安全框架 密码加密器--><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-security</artifactId></dependency>

2.2完成springSecurity安全框架配置 

如果不配置的话,它会自动跳入它自定义的用户登录页面

配置密码加密器 再服务层使用

@Configuration
public class MySecurityConfig extends WebSecurityConfigurerAdapter {// 密码加密器@Beanpublic PasswordEncoder passwordEncoder() {return new BCryptPasswordEncoder();}@Overrideprotected void configure(HttpSecurity http) throws Exception {http.authorizeRequests().anyRequest().permitAll() // 允许所有请求.and().csrf().disable(); // 禁用 CSRF,可选操作,根据实际需求决定}
}

2.3controller层

@Api(tags = "后台管理账号密码表控制类(BgManage)")
@RestController
@RequestMapping("bgManage")
public class BgManageController {/*** 服务对象*/@Resourceprivate BgManageService bgManageService;@Resourceprivate RedisTemplate redisTemplate;@Resourceprivate PasswordEncoder passwordEncoder;@PostMapping("send")public Result send(@RequestBody LoginFrom loginFrom){String phone = loginFrom.getPhone();String code = RandomNumUtil.generateVerificationCode();SendCodeUtils.sendCode(phone,code);redisTemplate.opsForValue().set(phone,code,10, TimeUnit.MINUTES);return new Result(2000,"发送验证码成功");}@PostMapping("validate")public ResponseEntity<Result> validate(@RequestBody LoginFrom loginFrom){String phone = loginFrom.getPhone();String password = loginFrom.getPassword();String code = loginFrom.getCode();String o = (String) redisTemplate.opsForValue().get(phone);System.out.println(o);BgManage bgManage = bgManageService.queryByPhone(phone);if (bgManage!=null){boolean matches = passwordEncoder.matches(password, bgManage.getPassword());if (matches){if (code!=null && code.equals(o)){return ResponseEntity.ok(new Result(2000,"管理员后台登录成功"));}else {return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new Result(4000, "账号密码或验证码输入不正确"));}}else {return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(new Result(4010, "账号密码输入不正确"));}}return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new Result(4040, "管理员账号不存在"));}/*** 通过主键查询单条数据** @param phone* @return 单条数据*/@ApiOperation(value = "根据手机号查询 后台管理账号密码表")@GetMapping("{phone}")public Result queryByPhone(@ApiParam(value = "后台登录手机号 phone")  @PathVariable("phone") String phone) {return new Result(2000,"根据手机号查询对象成功",bgManageService.queryByPhone(phone)) ;}

3.post请求为什么会拼接到字符串上 

我后端定义的@PostMapping,使用@requestParam 然后 手机号直接拼接在了 url上

前端发送post请求会报错  发送get就可以 

然后我在后端修改了 注解 封装成一个 使用@RequestBody注解 解决此问题

4.返回浏览器状态

Response.entity 

 public ResponseEntity<Result> validate(@RequestBody LoginFrom loginFrom){String phone = loginFrom.getPhone();String password = loginFrom.getPassword();String code = loginFrom.getCode();String o = (String) redisTemplate.opsForValue().get(phone);System.out.println(o);BgManage bgManage = bgManageService.queryByPhone(phone);if (bgManage!=null){boolean matches = passwordEncoder.matches(password, bgManage.getPassword());if (matches){if (code!=null && code.equals(o)){return ResponseEntity.ok(new Result(2000,"管理员后台登录成功"));}else {return ResponseEntity.status(HttpStatus.BAD_REQUEST).body(new Result(4000, "账号密码或验证码输入不正确"));}}else {return ResponseEntity.status(HttpStatus.UNAUTHORIZED).body(new Result(4010, "账号密码输入不正确"));}}return ResponseEntity.status(HttpStatus.NOT_FOUND).body(new Result(4040, "管理员账号不存在"));}

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

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

相关文章

java日常开发中常用的集合工具类方法归总(java8 stream)

1、创建map集合的方式 方式1&#xff1a; Map<String, Object> map new HashMap<>(); map.put("a", "test"); map.put("b", "since"); 方式2&#xff1a; Map<String, Object> map2 new HashMap<>() {{…

【云原生】Prometheus整合Alertmanager告警规则使用详解

目录 一、前言 二、Altermanager概述 2.1 什么是Altermanager 2.2 Altermanager使用场景 三、Altermanager架构与原理 3.1 Altermanager使用步骤 3.2 Altermanager工作机制 3.3 Altermanager在Prometheus中的位置 四、Altermanager部署与接入Prometheus 4.1 Altermana…

ConfigMap-secrets-静态pod

一.ConfigMap 1.概述 ConfigMap资源&#xff0c;简称CM资源&#xff0c;它生成的键值对数据&#xff0c;存储在ETCD数据库中 应用场景&#xff1a;主要是对应用程序的配置 pod通过env变量引入ConfigMap&#xff0c;或者通过数据卷挂载volume的方式引入ConfigMap资源 官方解释…

UniVue@v1.4.0版本发布:运行时调试器RuntimeDebuger

GitHub仓库 发布版本仓库&#xff1a;https://github.com/Avalon712/UniVue 开发版本仓库&#xff1a;https://github.com/Avalon712/UniVue-Develop UniVue拓展框架UniVue源生成器仓库&#xff1a;https://github.com/Avalon712/UniVue-SourceGenerator 更新说明 在没有调…

【Python】Windows系统 pip 换源方法(永久 / 临时)

pip 换源 首先国内较好的镜像地址有&#xff1a; 清华&#xff1a;https://pypi.tuna.tsinghua.edu.cn/simple 阿里云&#xff1a;http://mirrors.aliyun.com/pypi/simple 豆瓣&#xff1a;http://pypi.douban.com/simple 腾讯&#xff1a;http://mirrors.cloud.tencent.com/…

Mysql数据表的约束(下)

3.默认值约束(default) 与非空约束的命令一致,因为都属于列级约束,因此只需将not null改为default 默认值即可 删除默认值约束: 4.主键约束(primary key) 表示给一张表格设置了一个唯一标识,为了更快的去通过唯一的数据去准确的查找到每一条记录,一半咱们在创建表…

【Linux】基于环形队列RingQueue的生产消费者模型

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 目录 前言 环形队列的概念及定义 POSIX信号量 RingQueue的实现方式 RingQueue.hpp的构建 Thread.hpp Main.cc主函数的编写 Task.hpp function包装器的使用 总结 前言…

关于Kafka Topic分区和Replication分配的策略

文章目录 1. Topic多分区2. 理想的策略3. 实际的策略4. 如何自定义策略 1. Topic多分区 如图&#xff0c;是一个多分区Topic在Kafka集群中可能得分配情况。 P0-RL代表分区0&#xff0c;Leader副本。 这个Topic是3分区2副本的配置。分区尽量均匀分在不同的Broker上&#xff0c…

第3章 创建最小(Minimal APIs)API应用程序

第1章 框架学习的基石与实战策略 第2章 大话ASP.NET Core 入门 第3章 创建最小&#xff08;Minimal APIs&#xff09;API应用程序 1.最小API概述 在ASP.NET Core的广阔天地里&#xff0c;"最小API应用程序"如同一把轻巧而强大的瑞士军刀&#xff0c;专为迅速构建…

idea中打开静态网页端口是63342而不是8080

问题&#xff1a; 安装了tomcat 并且也配置了环境&#xff0c;但是在tomcat下运行&#xff0c;总是在63342下面显示。这也就意味着&#xff0c;并没有运行到tomcat环境下。 找了好几个教程&#xff08;中间还去学习了maven&#xff0c;因为跟的教程里面&#xff0c;没有maven,但…

【 香橙派 AIpro评测】烧系统运行部署LLMS大模型体验Jupyter Lab AI 应用样例(新手入门)

文章目录 一、引言⭐1.1下载镜像烧系统⭐1.2开发板初始化系统配置远程登陆&#x1f496; 远程ssh&#x1f496;查看ubuntu桌面&#x1f496; 远程向日葵 二、部署LLMS大模型2.1 快速启动&#x1f496;拉取代码&#x1f496;下载mode数据&#x1f496;启动模型对话 三、体验 内置…

【算法笔记自学】第 10 章 提高篇(4)——图算法专题

10.1图的定义和相关术语 #include <cstdio>const int MAXN 100; int degree[MAXN] {0};int main() {int n, m, u, v;scanf("%d%d", &n, &m);for (int j 0; j < m; j) {scanf("%d%d", &u, &v);degree[u];degree[v];}for (int i…

自学鸿蒙HarmonyOS的ArkTS语言<九>自定义弹窗组件CustomDialog及二次封装自定义弹窗

一、自定义弹窗 CustomDialog struct CustomDialogBuilder {controller: CustomDialogController new CustomDialogController({ // 注意写法builder: CustomDialogBuilder({})})// controller: CustomDialogController // 这种预览会报错cancel?: () > voidconfirm?: (…

微信小游戏 彩色试管 倒水游戏 逻辑

最近开始研究微信小游戏&#xff0c;有兴趣的 可以关注一下 公众号&#xff0c; 记录一些心路历程和源代码。 定义一个 Cup类&#xff1a; 主要功能 初始化水杯&#xff1a;根据传入的颜色信息初始化水杯中的水层。 倒水&#xff1a;模拟水杯倾斜并倒出水的过程。 加水&…

Prometheus 云原生 - 基于 file_sd、http_sd 实现 Service Discovery

目录 开始 为什么需要服务发现机制 File Service Discovery&#xff08;file_sd&#xff09; 基本概念 配置方式 使用案例 HTTP Service Discovery&#xff08;http_sd&#xff09; 基本概念 配置方式 使用案例 开始 为什么需要服务发现机制 我们知道在 Prometheus …

【链表】算法题(一) ---- 力扣 / 牛客

一、移除链表元素 移除链表中值为val的元素&#xff0c;并返回新的头节点 思路&#xff1a; 题目上这样说&#xff0c;我们就可以创建一个新的链表&#xff0c;将值不为val的节点&#xff0c;尾插到新的链表当中&#xff0c;最后返回新链表的头节点。 typedef struct ListNo…

[安洵杯 2019]easy_web1

知识点&#xff1a; 1.base64加解密 2.md5加解密 3.md5碰撞绕过强类型比较 4.Linux命令绕过 进入页面发现url地址中存在 img参数和一个cmd参数&#xff0c;img参数看上去像是base64编码&#xff0c;可以去尝试一下解码. 进行了两次base64解密得到3535352e706e67看着像16进制那么…

员工聊天记录监控方法大全(五种方法你自己选择)

在现代企业中&#xff0c;为了保障业务安全、防止数据泄露和促进工作效率&#xff0c;很多公司会采用各种方法监控员工的聊天记录。虽然听起来有点“大哥哥在看着你”的感觉&#xff0c;但只要在合法和透明的前提下进行&#xff0c;这其实是为了构建一个更加健康、安全的工作环…

网络流问题-Min-cut

文章目录 1. 网络流问题基础1.1 概述1.2 常规算法1.3 总结 2. Ford-Fulkerson Algorithm2.1 概述2.2 Ford 算法2.3 Ford 算法小结 链接&#xff1a; B站学习视频 1. 网络流问题基础 1.1 概述 最大流问题主要是关于有向图问题。有向图中有m个边&#xff0c; n个节点,其中有一个…

怎么用PPT录制微课?详细步骤解析!

随着信息技术的不断发展&#xff0c;微课作为一种新型的教学形式&#xff0c;因其短小精悍、针对性强等特点&#xff0c;在教育领域得到了广泛的应用。而PPT作为一款常用的演示工具&#xff0c;不仅可以用来制作课件&#xff0c;还可以利用其内置的录屏功能或结合专业的录屏软件…