新的项目springboot

server/2024/12/22 18:39:17/

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","张三");
//        生成jwtString 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);//验证tokenMap<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","张三");
//        生成jwtreturn  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 {@Autowiredprivate LoginInterceptor   loginInterceptor;@Overridepublic 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 {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
//       令牌验证String token = request.getHeader("Authorization");
//        解析tokentry {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","张三");
//        生成jwtreturn  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","张三");
//        生成jwtreturn  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.ppmy.cn/server/35647.html

相关文章

简单介绍IIC通信协议

文章目录 一&#xff0c;简单介绍二&#xff0c;IIC物理层三&#xff0c;IIC通信时序1.起始位与停止位2.IIC读写地址位信号3.IIC应答信号4.IIC数据位收发信号 四&#xff0c;总线速率五&#xff0c;主机发送数据流程六&#xff0c;主机接收数据流程七&#xff0c;IIC的时钟延展…

open 函数到底做了什么

使用设备之前我们通常都需要调用 open 函数&#xff0c;这个函数一般用于设备专有数据的初始化&#xff0c;申请相关资源及进行设备的初始化等工作&#xff0c;对于简单的设备而言&#xff0c;open 函数可以不做具体的工作&#xff0c;你在应用层通过系统调用 open 打开设备…

Python深度学习基于Tensorflow(3)Tensorflow 构建模型

文章目录 数据导入和数据可视化数据集制作以及预处理模型结构低阶 API 构建模型中阶 API 构建模型高阶 API 构建模型保存和导入模型 这里以实际项目CIFAR-10为例&#xff0c;分别使用低阶&#xff0c;中阶&#xff0c;高阶 API 搭建模型。 这里以CIFAR-10为数据集&#xff0c;C…

*求问?:为何会超时(TLE)?

D - Grid and Magnet (atcoder.jp) 错误代码&#xff1a; //2024年5月5日14:53:43 #include <bits/stdc.h> #define move mmove //防止与头文件中重复 using namespace std; int h,w; string s[1000]; const int move[4][2]{{1,0},{-1,0},{0,1},{0,-1}}; bool used[100…

【C++】 认识多态 + 多态的构成条件详细讲解

前言 C 目录 1. 多态的概念2 多态的定义及实现2 .1 虚函数&#xff1a;2 .2 虚函数的重写&#xff1a;2 .2.1 虚函数重写的两个例外&#xff1a; 2 .3 多态的两个条件&#xff08;重点&#xff09;2 .4 析构函数为啥写成虚函数 3 新增的两个关键字3.1 final的使用&#xff1a;3…

LSTM实战笔记(部署到C++上)——更新中

前几天由于自己的个人原因停止了学习 接下里继续更新一些自己项目中所用到的神经网络等 ——————————————————————————————————————————— LSTM代码介绍 建立LSTM模型时需要设置一些参数&#xff0c;包括输入数据的形状、LSTM层的…

【Web漏洞指南】XSS漏洞详细指南

【Web漏洞指南】XSS漏洞详细指南 概述XSS的三种类型执行任意 JS 代码的方式在原始HTML中注入绕过手法在 HTML标记内注入绕过手法在JavaScript代码中注入绕过手法其他绕过手法XSS常见有效载荷检索Cookies窃取页面内容键盘记录器查找内部IP地址端口扫描器自动填充密码捕获窃取 Po…

数据结构与算法:二叉树

文章目录 1 概述1.1 树1.2 二叉树 和 树 的区别 2 二叉树2.1 性质2.2 存储结构2.3 遍历2.3.1 先序遍历&#xff1a;DLR2.3.2 中序遍历&#xff1a;LDR2.3.3 后序遍历&#xff1a;LRD 3 扩展3.1 常考题 1 概述 1.1 树 树结构&#xff1a;是一种非常重要的 非线性结构&#xff…