新的项目springboot

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.mfbz.cn/a/597154.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

LLM应用:prompt提示让大模型总结生成Mermaid流程图;充当角色输出

1、prompt提示让大模型总结生成Mermaid流程图 生成内容、总结文章让大模型Mermaid流程图展示&#xff1a; mermaid 美人鱼, 是一个类似 markdown&#xff0c;用文本语法来描述文档图形(流程图、 时序图、甘特图)的工具&#xff0c;您可以在文档中嵌入一段 mermaid 文本来生成 …

项目实战 | 如何恰当的处理 Vue 路由权限

前言 哈喽&#xff0c;小伙伴你好&#xff0c;我是 嘟老板。最近接了一个成本千万级的前端项目运维工作&#xff0c;本着 知己知彼 的态度&#xff0c;我将整个前端的大致设计思路过了一遍。不看不知道&#xff0c;一看…吓一跳。光是 路由权限 这块儿的设计&#xff0c;都让我…

linux上Redis安装使用

环境centOS8 redis是缓存数据库&#xff0c;主要是用于在内存中存储数据&#xff0c;内存的读写很快&#xff0c;加快系统读写数据库的速度 一、Linux 安装 Redis 1. 下载Redis 官网下载Downloads - Redis 历史版本Index of /releases/ 本文中安装的版本为&#xff1a;h…

Celery + redis 异步分布式任务队列安装测试

Celery 异步分布式任务队列 Celery 5.4.0 官方文档 环境&#xff1a;3台 centos7.9 普通用户 redisSchedulerworkerdp951dp96111dp971 文章目录 Celery 异步分布式任务队列1、Celery 介绍2、安装部署2.1 安装消息中间件&#xff08;broker&#xff09;2.2 安装Celery 3、功能…

mac 本地使用docker 运行es,kibana

1.下载 m芯片一些版本不支持.踩过坑.翻看官网才知道只有部分镜像支持m芯片 https://hub.docker.com/添加链接描述 docker pull elasticsearch:7.17.21 docker pull kibana:7.17.21镜像已经下载下来了 2.创建文件映射-挂载 /Users/lin/dev/dockerMsg 其中lin是自己的用户名…

【数据结构/C语言】单链表的实现

目录 一、单链表的基本概念 单链表的简介 单链表的特点 二、预备知识 三、单链表的基本结构 四、单链表的基本操作 1.链表打印 2.申请节点 3.头插 4.尾插 5.头删 6.尾删 7.查找节点 8.指定位置之前插入 9.指定位置之后插入 10.删除给定节点 11.删除给定节点之…

90、动态规划-最长的有效括号

思路&#xff1a; 找出有效括号并且是最长的有效括号 dp[i]表示以i结尾的括号最长是多少 然后从1开始 因为从0位置不管是左括号还是右括号都是无法形成一个完成的括号。所以dp[0]0&#xff1b; 当i1时候&#xff0c;判断括号是否是&#xff09;如果不是那么无法结尾&#x…

cmake进阶:变量的作用域说明一(从函数作用域方面)

一. 简介 如同 C 语言一样&#xff0c;在 cmake 中&#xff0c;变量也有作用域的概念&#xff0c;本文我们就来聊一聊关于 cmake 中变量作用域的问题。 接下来从三个方面进行介绍&#xff1a;函数作用域、目录作用域以及全局作用域。 二. 函数作用域 我把这个作用域叫做函数…

pycharm安装pandas包

import pandas时提示未安装pandas&#xff0c;点击下图红框选项&#xff0c;进行pandas安装 pycharm底部会有安装中的提示 pycharm底部提示红框的内容&#xff0c;说明安装成功 这个时候就可以看到import pandas不再报错了

LeetCode 611. 有效三角形的个数

原题链接&#xff1a;611. 有效三角形的个数 - 力扣&#xff08;LeetCode&#xff09; 题目说&#xff0c;给定一个包含非负整数的数组 num&#xff0c;返回其中可以组成三角形三条边的三元组个数。 示例&#xff1a; nums [4, 2, 3, 4]&#xff1b; 有效组合如下&#xff1a;…

NIO和NIO.2对比

Java NIO (New Input/Output) 是从Java 1.4版本开始引入的一个新的I/O API&#xff0c;用于替代原来的BIO&#xff08;Blocking I/O&#xff09;API。NIO提供了更加灵活和高效的网络通信方式&#xff0c;特别适合于高吞吐量的网络编程。NIO的主要特点是非阻塞模式&#xff0c;它…

数据结构(C):玩转顺序表

&#x1f37a;0.前言 &#x1f3b7;1.线性表 &#x1f3b8;2.顺序表 &#x1f4c0;动态顺序表的实现 &#x1f4bf;初始化 &#x1f4bf;检查容量是否满了&#xff0c;进行扩容 &#x1f4bf;插入&#xff1a;头插和尾插 &#x1f4bf;删除&#xff1a;头删和尾删 &…

Python实现2048游戏

提供学习或者毕业设计使用,功能基本都有,不能和市场上正式游戏相提比论,请理性对待! 在这篇博客中,我们将使用 Python 和 Pygame 库来编写经典的 2048 游戏。2048 是一个益智类游戏,通过在 4x4 网格上滑动方块并合并它们来创建一个新的数字,直到获得数字 2048 或者无法继…

bfs之走迷宫

文章目录 走迷宫广度优先遍历代码Java代码打印路径 走迷宫 给定一个 nm 的二维整数数组&#xff0c;用来表示一个迷宫&#xff0c;数组中只包含 0或 1&#xff0c;其中 0表示可以走的路&#xff0c;1表示不可通过的墙壁。 最初&#xff0c;有一个人位于左上角 (1,1) 处&#…

leetcode-岛屿数量-99

题目要求 思路 1.使用广度优先遍历&#xff0c;将数组中所有为1的元素遍历一遍&#xff0c;遍历过程中使用递归&#xff0c;讲该元素的上下左右四个方向的元素值也置为0 2.统计一共执行过多少次&#xff0c;次数就是岛屿数量 代码实现 class Solution { public:int solve(vec…

mac电脑如何安装python及环境搭建

&#xff08;1&#xff09;进入官网&#xff1a;Download Python | Python.org&#xff0c;根据自己电脑选择python (2)这里我选择的是mac,点击&#xff1a;macos&#xff0c;选择最近版本并点击进入 (3)选择mac版本&#xff1a; (4)点击就可以进入下载&#xff1a; (5)下载好之…

网站防御XSS攻击的有效策略与实施步骤

随着互联网应用的普及与发展&#xff0c;网站安全已成为众多企业关注的焦点&#xff0c;而XSS&#xff08;Cross-Site Scripting&#xff09;攻击作为最常见的Web安全漏洞之一&#xff0c;对用户数据安全构成严重威胁。本文将详细介绍网站如何有效防御XSS攻击&#xff0c;并提供…

Spring JdbcTemplate使用临时表+事务会话管理实现数据新增、查询及自动清除功能

需求描述&#xff1a; 由于某些情况下当查询过滤参数过大时&#xff0c;执行sql由于参数过大而报错&#xff0c;此时 需要使用临时表的方式&#xff0c;即 当参数超过某个阀值&#xff08;如 1000&#xff0c;可调整&#xff09;新增一张临时表&#xff0c;将原表 与 该临时表进…

2024精武杯部分复现

首先是计算机部分&#xff0c;这里是题目 做完才发现其实很多东西在火眼里面已经有更快的捷径了&#xff0c;但是自己当时没发现&#xff0c;还去傻傻的开虚拟机去找&#xff0c;说到底&#xff0c;还是对取证软件的理解不够&#xff0c;也不怎么会用。不废话了&#xff0c;直接…

怎么给word文件名批量替换部分文字?word设置批量替换文字教程

批量替换Word文件名中的几个字&#xff0c;对于经常处理大量文件的人来说&#xff0c;是一项非常实用的技能。以下是一个详细的步骤指南&#xff0c;帮助你快速完成这项任务。 首先&#xff0c;你需要准备一个可以批量重命名文件的工具。市面上有很多这样的工具可供选择&#x…
最新文章