spring boot 自定义注解token验证

1.创建自定义注解

import java.lang.annotation.*;

/**
 * @ClassName TokenAop
 * @Description token空验证自定义注解
 * @Author make
 * @Date
 * @Version 1.0
 */
@Inherited
@Documented
@Target({ElementType.METHOD})
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckTokenAnnotation {
}

2.对自定义注解进行aop切入执行方法


import lombok.extern.slf4j.Slf4j;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.Around;
import org.aspectj.lang.annotation.Aspect;
import org.aspectj.lang.annotation.Pointcut;
import org.springframework.http.HttpStatus;
import org.springframework.stereotype.Component;
import org.springframework.util.StringUtils;
import org.springframework.web.context.request.RequestContextHolder;
import org.springframework.web.context.request.ServletRequestAttributes;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;

@Slf4j
@Aspect
@Component
public class TokenAspect {


    /**
     * 对直接进行切面判定, 可以换成指定的类.
     */
    @Pointcut("@annotation(com.fht.common.util.auth.CheckTokenAnnotation)")
    public void toCheckTokenAnnotation() {
    }

    /**
     * 环绕通知
     * 验证token是否为空
     * @param joinPoint
     * @return
     * @throws Throwable
     */
    @Around("toCheckTokenAnnotation()")
    public Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        // 获取request,response
        HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
        HttpServletResponse response = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getResponse();
        // 得到请求头是否有 token ,没有就从参数找
        String token = request.getHeader("token");
        if (StringUtils.isEmpty(token)) {
            token = request.getParameter("token");
        }
        if (StringUtils.isEmpty(token)) {
            response.setStatus(HttpStatus.FORBIDDEN.value());
            response.getWriter().write("{\"code\":" + HttpStatus.FORBIDDEN.value() + ",\"data\":{},\"message\":\"" + HttpStatus.FORBIDDEN.getReasonPhrase() + "\"}");
            //responseResult(response, 500, "没有token");
            return null;
        }
        return joinPoint.proceed();
    }

    /**
     * 自定义响应结果
     *
     * @param response 响应
     * @param code     响应码
     * @param message  响应信息
     */
    private void responseResult(HttpServletResponse response, Integer code, String message) {
        response.resetBuffer();
        response.setHeader("Access-Control-Allow-Origin", "*");
        response.setHeader("Access-Control-Allow-Credentials", "true");
        response.setContentType("application/json");
        response.setCharacterEncoding("UTF-8");
        PrintWriter writer = null;
        try {
            writer = response.getWriter();
            writer.println("{\"code\":" + code + " ,\"message\" :\"" + message + "\"}");
            response.flushBuffer();
        } catch (IOException e) {
            log.error(" 输入响应出错 e = {}", e.getMessage(), e);
        } finally {
            if (writer != null) {
                writer.flush();
                writer.close();
            }
        }
    }
}

3.调用


    /**
     * 
     * @return
     */
    @ResponseBody
    @RequestMapping("/addUser")
    @CheckTokenAnnotation
    public String addUser(){
        User user = userService.addUser();
        return user.toString();
    }

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用Spring Boot HandlerInterceptor校验Token的步骤: 1.创建一个TokenInterceptor类,实现HandlerInterceptor接口,并在preHandle方法中进行Token校验。 ```java public class TokenInterceptor implements HandlerInterceptor { @Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { // 从请求头中获取Token String token = request.getHeader("Token"); if (token == null || token.isEmpty()) { // 如果Token为空,返回401 Unauthorized response.setStatus(HttpServletResponse.SC_UNAUTHORIZED); return false; } else { // 校验Token是否有效,这里只是简单判断Token是否为123456 if (!token.equals("123456")) { // 如果Token无效,返回403 Forbidden response.setStatus(HttpServletResponse.SC_FORBIDDEN); return false; } } return true; } } ``` 2.在Spring Boot的配置类中注册TokenInterceptor。 ```java @Configuration public class WebMvcConfig implements WebMvcConfigurer { @Override public void addInterceptors(InterceptorRegistry registry) { registry.addInterceptor(new TokenInterceptor()).addPathPatterns("/**"); } } ``` 3.在Controller中使用@RequestBody注解获取请求体中的JSON数据,并使用@Valid注解和自定义的校验注解对参数进行校验。 ```java @RestController public class MyController { @PostMapping("/test") public String test(@RequestBody @Valid MyRequest request) { // 处理请求 return "success"; } } ``` 4.定义一个MyRequest类,用于接收请求体中的JSON数据,并在其中定义需要校验的参数和校验注解。 ```java public class MyRequest { @NotNull(message = "参数name不能为空") private String name; @Min(value = 1, message = "参数age必须大于等于1") private int age; // 省略getter和setter方法 } ```

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值