springboot使用拦截器拦截验证签名sign

本文介绍了在SpringBoot中如何使用拦截器进行签名验证。首先讲解了签名的生成过程,然后详细阐述了如何重写Request以读取二进制流,接着配置过滤器替换默认Request,接着编写拦截器并进行配置,最后提到了ApiController和请求方式的相关内容。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1生成签名

2使用拦截器验证签名

2.1重写request,以读取存储二级制流

2.2配置过滤器,将默认的request替换为重写的

2.3配置过滤器

2.4写拦截器

2.5配置拦截器

1生成签名

import com.fasterxml.jackson.core.JsonProcessingException;
import com.fasterxml.jackson.databind.ObjectMapper;
import io.renren.common.utils.SM3Util;
import cn.hutool.core.util.HexUtil;

import java.util.HashMap;
import java.util.Map;

public class SignUtils {
   
    public static void main(String[] args) {
   
    //appid对应一个accessKey,存储在数据库中
        String accessKey = "71a8e08ca1122c61faff1abffcbc8226b9a2e940";
        Long timestamp = System.currentTimeMillis();
        Map<String, Object> map = new HashMap<String, Object>();
        map.put("id","333");
        map.put("id2","陈大壮");
        map.put("passwd","XFCY8R7dhRRnyXDMAlzTNvDKnf9zT2RO1bVc8LXe0K6Qj6vifnWawy5JJw6vhl8xuokTQPqTtoK8gpKfslS08emERiejbZrhrYfmyeof7EPpv+VCwLQ/vbbi4hwwUtK+9s8M6MuOXVAisd06WXq5BdT4RDMDvd48pptB+tXJsd8=");

        ObjectMapper objectMapper = new ObjectMapper();
        String hexStr = "";
        try {
   
            String valueAsString = objectMapper.writeValueAsString(map);
            System.out.println(valueAsString);
            String verifySing = accessKey + "&" + timestamp + "&" + valueAsString;
            System.out.println(verifySing);
            byte[] hmac = SM3Util.hash(verifySing.getBytes());
            hexStr = HexUtil.encodeHexStr(hmac);
            System.out.println(hexStr);
        } catch (JsonProcessingException e) {
   
            e.printStackTrace();
        }
    }
}

生成json串类似下图。

{
   
   "timeStamp":"1650606559147",
   "sign":"3cb7c8b5715e510de106b76c40e1397a5d5c73c70d53994f3eca3b72c84a8264",
   "appId":"fxIzd7xG",
   "data":{
   
       "id2":"陈大壮",
       "id":"333",
       "passwd":"XFCY8R7dhRRnyXDMAlzTNvDKnf9zT2RO1bVc8LXe0K6Qj6vifnWawy5JJw6vhl8xuokTQPqTtoK8gpKfslS08emERiejbZrhrYfmyeof7EPpv+VCwLQ/vbbi4hwwUtK+9s8M6MuOXVAisd06WXq5BdT4RDMDvd48pptB+tXJsd8="
   }
}

2 使用拦截器验证签名

2.1重写request,以读取存储二级制流


import lombok.extern.slf4j.Slf4j;
import org.apache.commons.io.IOUtils;
import org.apache.commons.lang.StringUtils;
import org.springframework.http.HttpHeaders;
import org.springframework.http.MediaType;


import javax.servlet.ReadListener;
import javax.servlet.ServletInputStream;
import javax.servlet.ServletRequest;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;
import java.io.*;
import java.nio.charset.Charset;

/**
 * 解决request流只读取一次的问题
 */
@Slf4j
public class RequestWrapper extends HttpServletRequestWrapper {
   

    /**
     * 存储body数据的容器
     */
    private final byte[] body;

    public RequestWrapper(HttpServletRequest request) throws IOException {
   
        super(request);

        // 将body数据存储起来
        body = getBodyString(request).getBytes(Charset.defaultCharset());
    }

    /**
     * 获取请求Body
     *
     * @param request request
     * @return String
     */
    public String getBodyString(final ServletRequest request) {
   
        try {
   
            return inputStream2String(request
Spring Boot中的JWT拦截器是一种用于处理JSON Web Token(JWT)的机制。它主要用于在Spring Boot应用中实现认证和授权功能。JWT是一种用于在网络应用环境间安全地传递声明的一种紧凑的、自包含的方式。 以下是JWT拦截器在Spring Boot中的主要功能和实现步骤: 1. **生成JWT**: 当用户成功登录后,服务器会生成一个JWT,并将其返回给客户端。JWT通常包含用户信息和过期时间等信息。 2. **验证JWT**: 在每次请求时,客户端需要在请求头中包含JWT。服务器端的JWT拦截器验证这个JWT的有效性,包括签名验证、过期时间检查等。 3. **授权**: 验证通过后,拦截器会解析JWT中的用户信息,并根据这些信息进行授权控制,确保用户有权限访问相应的资源。 ### 实现步骤 1. **添加依赖**: 在`pom.xml`中添加JWT相关的依赖,例如`jjwt`库。 ```xml <dependency> <groupId>io.jsonwebtoken</groupId> <artifactId>jjwt</artifactId> <version>0.9.1</version> </dependency> ``` 2. **创建JWT工具类**: 这个类用于生成和验证JWT。 ```java public class JwtUtil { private String secret = "your-256-bit-secret"; public String generateToken(String username) { return Jwts.builder() .setSubject(username) .setExpiration(new Date(System.currentTimeMillis() + 1000 * 60 * 60 * 10)) .signWith(SignatureAlgorithm.HS256, secret) .compact(); } public String validateToken(String token) { try { Claims claims = Jwts.parser() .setSigningKey(secret) .parseClaimsJws(token) .getBody(); return claims.getSubject(); } catch (Exception e) { throw new RuntimeException("Invalid Token"); } } } ``` 3. **创建JWT拦截器**: 这个拦截器拦截所有请求,验证JWT的有效性。 ```java public class JwtInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { String token = request.getHeader("Authorization"); if (token == null || !token.startsWith("Bearer ")) { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return false; } token = token.substring(7); try { String username = new JwtUtil().validateToken(token); request.setAttribute("username", username); return true; } catch (Exception e) { response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return false; } } } ``` 4. **注册拦截器**: 在Spring Boot的配置类中注册JWT拦截器。 ```java @Configuration public class WebConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new JwtInterceptor()) .addPathPatterns("/**") .excludePathPatterns("/login"); } } ``` 通过以上步骤,你就可以在Spring Boot应用中实现JWT拦截器,从而实现认证和授权功能。
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值