新的项目springboot

news2024/11/23 6:18:42

bu'ybuyshenglombok

 <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>

添加依赖 lombok

package com.example.demo.pojo;

import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
//注解了解
@NoArgsConstructor
@AllArgsConstructor
public class Result<T> {
    private Integer code;//业务状态码  0 成功 1失败
    private String message;//提示信息
    private T dataa;//响应数据

    public static <E> Result<E> success(E data){
        return new Result<>(0,"操作成功",data);
    }

    public static Result success(Integer code, String message) {
        return new Result(0,"操作成功",null);
    }


    public static Result error(Integer code, String message) {
        return new Result(1,message,null);
    }
}
  @Insert("insert into users(password,username) values(#{possword},#{username})")
    void add(@Param("possword")String possword, @Param("username")String username);

如果找不到要用Param参数

  <!--validation 依赖-->
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-validation</artifactId>
            </dependency>

校验依赖


import com.example.demo.pojo.Result;
import org.springframework.util.StringUtils;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

//处理全局的异常
@RestControllerAdvice
public class GlobbalExceptionHandler {
    @ExceptionHandler(value = Exception.class)
    public Result handleException(Exception e) {
        e.printStackTrace();
        return Result.error(StringUtils.hasLength(e.getMessage())?e.getMessage():"参数不正确");
    }
}

处理全局异常

登录认证

JWT令牌

{}

数字签名  token

第一部分  头部  第二部分 payload有效荷载  第三部分 签名  确保安全

login生成令牌   

验证令牌

<dependency>

    <groupId>com.auth0</groupId>

    <artifactId>java-jwt</artifactId>

    <version>4.2.1</version>

</dependency>

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-test</artifactId>
   
</dependency>
 public  void test() {
        Map<String,Object> map = new HashMap<>();
        map.put("id",1);
        map.put("username","张三");
//        生成jwt
       String token = JWT.create()
                .withClaim("user",map)
                .withExpiresAt(new Date(System.currentTimeMillis()+1000*60))//过期时间 60分钟
                .sign(Algorithm.HMAC256("123456"));//指定算法,密钥
        System.out.println(token);

    }

生成密钥token

    public void test2() {
        String token = "eyJhbGciOiJIUzI1NiIsInR5cCI6IkpXVCJ9.eyJ1c2VyIjp7ImlkIjoxLCJ1c2VybmFtZSI6IuW8oOS4iSJ9LCJleHAiOjE3MTQ5MTY0ODN9.eGbO7aZ5MFlr_mt0h5-Nn0Nl7nXdgIMCQroDngmOB50";
        JWTVerifier jwtVerifier = JWT.require(Algorithm.HMAC256("123456")).build();
        DecodedJWT jwt = jwtVerifier.verify(token);//验证token
        Map<String, Claim> map = jwt.getClaims();
        System.out.println(map.get("user"));
    }

获取解析密钥

package com.example.demo.utils;

import com.auth0.jwt.JWT;
import com.auth0.jwt.algorithms.Algorithm;
import com.auth0.jwt.interfaces.Claim;

import java.util.Date;
import java.util.Map;

public class JwtUtil {
    private static final  String Key = "123456";
    public static String genToken(Map<String,Object> map){
//        Map<String,Object> map = new HashMap<>();
//        map.put("id",1);
//        map.put("username","张三");
//        生成jwt
      return  JWT.create()
                .withClaim("user",map)
                .withExpiresAt(new Date(System.currentTimeMillis()+1000*60*60))//过期时间 60分钟
                .sign(Algorithm.HMAC256(Key));//指定算法,密钥
//        System.out.println(token);
    }

    public static Map<String, Claim> parseToken(String token){
      return JWT.require(Algorithm.HMAC256(Key)).build().verify(token).getClaims();
    }
}
  Map<String,Object> map = new HashMap<>();
        map.put("username",username);
        map.put("password",password);
        String token = JwtUtil.genToken(map);

生成token

  @PostMapping("/login")
    public Result login(@RequestParam("username") String username,@RequestParam("password") String password) {
        System.out.println(username+"登录,"+password);
        Map<String,Object> map = new HashMap<>();
        map.put("username",username);
        map.put("password",password);
        String token = JwtUtil.genToken(map);
        System.out.println("生成的:::"+token);
        Users u = usersService.findByUserNameAndPwd(username,password);
        if (u != null) {
            return  Result.success(u);
        }else{
            return Result.error("不存在");
        }
    }

    @GetMapping("/gettoken")
    public Result gettoken(@RequestHeader(name = "Authorization")String token, HttpServletResponse response) {
        System.out.println("jinrule ma ????"+token);
//        return Result.success("所有的数据----------");
        try {
            Map<String, Claim> claim = JwtUtil.parseToken(token);
            response.setStatus(200);
            System.out.println("jinrule ma ????"+claim);
            return Result.success("所有的数据----------");
        } catch (Exception e) {
            response.setStatus(401);
//            throw new RuntimeException(e);
            return Result.success("未登录");
        }
    }
}

拦截器进行拦截

统一的

编写拦截器,统一拦截

package com.example.demo.config;


import com.example.demo.interceptors.LoginInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;

@Configuration
public class WebConfig implements WebMvcConfigurer {
    @Autowired
    private LoginInterceptor   loginInterceptor;
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
//        WebMvcConfigurer.super.addInterceptors(registry);
//        登录接口和注册接口不拦截
        registry.addInterceptor(loginInterceptor).excludePathPatterns("/user/login","/user/logout","/user/register");

    }
}

//实现拦截器  注册拦截器
@Component //注入Ioc容器中
public class LoginInterceptor implements HandlerInterceptor {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//       令牌验证
        String token = request.getHeader("Authorization");
//        解析token
        try {
            Map<String, Claim> claim = JwtUtil.parseToken(token);
            response.setStatus(200);
            System.out.println("拦截器????"+claim);
            return true;
        } catch (Exception e) {
            response.setStatus(401);
//            throw new RuntimeException(e);
            return false;
        }
    }
}

拦截和注册

public class JwtUtil {
    private static final  String Key = "123456";
    public static String genToken(Map<String,Object> map){
//        Map<String,Object> map = new HashMap<>();
//        map.put("id",1);
//        map.put("username","张三");
//        生成jwt
      return  JWT.create()
                .withClaim("user",map)
                .withExpiresAt(new Date(System.currentTimeMillis()+1000*60*60))//过期时间 60分钟
                .sign(Algorithm.HMAC256(Key));//指定算法,密钥
//        System.out.println(token);
    }

    public static Map<String, Object> parseToken(String token){
      return JWT.require(Algorithm.HMAC256(Key)).build().verify(token).getClaim("cliams").asMap();
    }
}
public class JwtUtil {
    private static final  String Key = "123456";
    public static String genToken(Map<String,Object> map){
//        Map<String,Object> map = new HashMap<>();
//        map.put("id",1);
//        map.put("username","张三");
//        生成jwt
      return  JWT.create()
                .withClaim("user",map)
                .withExpiresAt(new Date(System.currentTimeMillis()+1000*60*60))//过期时间 60分钟
                .sign(Algorithm.HMAC256(Key));//指定算法,密钥
//        System.out.println(token);
    }

    public static Map<String, Object> parseToken(String token){
      return JWT.require(Algorithm.HMAC256(Key)).build().verify(token).getClaim("user").asMap();
    }
}

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

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

相关文章

【机器学习与实现】线性回归分析

目录 一、相关和回归的概念&#xff08;一&#xff09;变量间的关系&#xff08;二&#xff09;Pearson&#xff08;皮尔逊&#xff09;相关系数 二、线性回归的概念和方程&#xff08;一&#xff09;回归分析概述&#xff08;二&#xff09;线性回归方程 三、线性回归模型的损…

BigDecimal:踩坑

问题描述 两个BigDecimal相除, 抛了异常 原因分析&#xff1a; Java 中使用 BigDecimal 做除法运算的时候&#xff0c;值有可能是无限循环的小数&#xff0c;结果是无限循环的小数&#xff0c;就会抛出上面这个异常。 来看看源码&#xff1a; public BigDecimal divide(BigD…

马常旭新歌《如愿》:音乐界的“旭日”再现

在这个春暖花开的季节&#xff0c;音乐界又迎来了一股清新的“旭日”气息。是的&#xff0c;就在2024年4月17日&#xff0c;马常旭的新歌《如愿》&#xff08;旭日版&#xff09;在网易云音乐上线了&#xff01;一年的等待&#xff0c;终于迎来了他的音乐回归&#xff0c;给我们…

【3D基础】坐标转换——地理坐标投影到平面

汤国安GIS原理第二章重点 1.常见投影方式 https://download.csdn.net/blog/column/9283203/83387473 Web Mercator投影&#xff08;Web Mercator Projection&#xff09;&#xff1a; 优点&#xff1a; 在 Web 地图中广泛使用&#xff0c;易于显示并与在线地图服务集成。在较…

在echarts中使用geojson地图

以中国地图为例 先看效果 代码实现&#xff1a; <div id"refChinaMap" :style"{ width: 75%, height: 100% }"></div>import * as echarts from "echarts"; import ChinaJSON from "./chinaMap.json";const initChinaMa…

场景文本检测识别学习 day09(Swin Transformer论文精读)

Patch & Window 在Swin Transformer中&#xff0c;不同层级的窗口内部的补丁数量是固定的&#xff0c;补丁内部的像素数量也是固定的&#xff0c;如上图的红色框就是不同的窗口&#xff08;Window&#xff09;&#xff0c;窗口内部的灰色框就是补丁&#xff08;Patch&#…

【Linux网络编程】自定义协议+HTTP协议

【Linux网络编程】自定义协议HTTP协议 目录 【Linux网络编程】自定义协议HTTP协议协议定制&#xff0c;序列化和反序列化应用层中的HTTP认识URL&#xff08;网址&#xff09;urlencode和urldecodeHTTP协议格式使用telnet获取百度的根目录资源HTTP的方法表单 HTTP的状态码HTTP常…

一般实现分布式锁都有哪些方式?使用 Redis 如何设计分布式锁?使用 zk 来设计分布式锁可以吗?这两种分布式锁的实现方式哪种效率比较高?

目录 1.Redis 分布式锁 &#xff08;1&#xff09;Redis 最普通的分布式锁 &#xff08;2&#xff09;RedLock 算法 2.zk 分布式锁 3.redis 分布式锁和zk分布式锁的对比 1.Redis 分布式锁 官方叫做 RedLock 算法&#xff0c;是 Redis 官方支持的分布式锁算法。 这个分布式…

[qnx] 通过zcu104 SD卡更新qnx镜像的步骤

0. 概述 本文演示如果给Xlinx zcu104开发板刷入自定义的qnx镜像 1.将拨码开关设置为SD卡启动 如下图所示&#xff0c;将1拨到On,2,3,4拨到Off&#xff0c;即为通过SD启动。 2.准备SD卡中的内容 首先需要将SD格式化为FAT32的&#xff08;如果已经是FAT32格式&#xff0c;则…

力扣每日一题114:二叉树展开为链表

题目 中等 提示 给你二叉树的根结点 root &#xff0c;请你将它展开为一个单链表&#xff1a; 展开后的单链表应该同样使用 TreeNode &#xff0c;其中 right 子指针指向链表中下一个结点&#xff0c;而左子指针始终为 null 。展开后的单链表应该与二叉树 先序遍历 顺序相同…

sass-loader和node-sass与node版本的依赖问题

sass-loader和node-sass与node版本的依赖问题 没有人会陪你走到最后&#xff0c;碰到了便是有缘&#xff0c;即使到了要下车的时候&#xff0c;也要心存感激地告别&#xff0c;在心里留下空白的一隅之地&#xff0c;多年后想起时依然心存甘味。——林清玄 报错截图 报错信息 np…

linux/windows安装Tomcat

安装tomcat 注意版本一致问题 Tomcat 10.1.0-M15(alpha)Tomcat 10.0.x-10.0.21Tomcat 9.0.x-9.0.63Tomcat 8.5.x-8.0.53规范版本 Servlet 6.0,JSP 3.1, EL 5.0 WebSocket 2.1&#xff0c;JASPIC 3.0 Servlet 5.0,JSP 3.0, EL 4.0 WebSocket 2.0&#xff0c;JASPIC 2.0 Serv…

20240507最新 ubuntu20.04安装ros noetic

ubuntu20.04安装ros 主要参考博客 【ROS】在 Ubuntu 20.04 安装 ROS 的详细教程_ubuntu20.04安装ros-CSDN博客 出现问题 1.ubuntu20.04 更换清华源报错 ubuntu20.04 更换清华源报错_gvfs metadata is not supported. fallback to teplme-CSDN博客 &#xff1f;&#xff1f…

CNN-BiLSTM-Attention(12种算法优化CNN-BiLSTM-Attention多输入单输出)

12种算法优化CNN-BiLSTM-Attention模型预测的代码。其中Attention模型可以改为单头或者多头&#xff0c;在代码中就是改个数字而已。代码注释已写好如何更改。 12种算法优化CNN-BiLSTM-Attention多特征输入单步预测代码获取戳此处代码获取戳此处代码获取戳此处 主要功能为:采用…

数据库SQL语言实战(七)

前言 这次的有一点点难~~~~~我也写了好久 练习题 题目一 在学生表pub.student中统计名字&#xff08;姓名的第一位是姓氏&#xff0c;其余为名字&#xff0c;不考虑复姓&#xff09;的使用的频率&#xff0c;将统计结果放入表test5_01中 create table test5_01(First_name…

【一步一步了解Java系列】:探索Java基本类型转换的秘密

看到这句话的时候证明&#xff1a;此刻你我都在努力~ 加油陌生人~ 个人主页&#xff1a; Gu Gu Study ​​ 专栏&#xff1a;一步一步了解Java 喜欢的一句话&#xff1a; 常常会回顾努力的自己&#xff0c;所以要为自己的努力留下足迹。 如果喜欢能否点个赞支持一下&#…

ComfyUI 基础教程(十四):ComfyUI中4种实现局部重绘方法

在ComfyUI中有多种方式可以实现局部重绘,简单的方式是使用VAE内补编码器进行局部重绘,也可以用Fooocus inpaint进行局部重绘,还可以用controlNet的inpaint模型进行局部重绘,以及使用Clip seg蒙版插件! 本篇介绍使用VAE內补编码器进行局部重绘的方法。 1、VAE内补编码器 局…

【docker】docker compose 搭建私服

安装 Docker Registry 创建目录 mkdir -pv /usr/local/docker/registrymkdir -pv /usr/local/docker/data 创建 docker-compose.yml文件 进入目录创建docker-compose.yml cd /usr/local/docker/registrytouch docker-compose.yml 编辑docker-compose.yml vim docker-compo…

ASRPRO

https://gitee.com/gitee-128/ASR-PRO-U8G2/tree/main 不下载模型 语音就是天问51唤醒我 u8g2的移植过程 第一步 下载u8g2的源代码 第二步 修改 delay and 函数 第三步 添加头文件 显示 显示 动画 SPI I2C(SOFT SPI ;SOFT I2C U8G2 移植过程&#xff08;移植过程参考…

JUC基础概念

文章目录 JUC的基础概念什么是JUC进程与线程并行与并发线程的五种状态JUC的架构 JUC的基础概念 什么是JUC JUC 是 Java.utils.concurrent 包内的类&#xff0c;是为了开发者可以在多线程的情况下减少竞争条件和防止死锁而出现的。 进程与线程 进程&#xff1a;一个进程包含…