Java自定义注解校验token并直接返回给前端状态

发布于:2024-06-27 ⋅ 阅读:(127) ⋅ 点赞:(0)

自定义注解 CheckToken 

import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;

@Target(ElementType.METHOD)
@Retention(RetentionPolicy.RUNTIME)
public @interface CheckToken {
}

编写验证token的方法TokenInterceptor 

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.method.HandlerMethod;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

public class TokenInterceptor extends HandlerInterceptorAdapter {

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (handler instanceof HandlerMethod) {
            HandlerMethod handlerMethod = (HandlerMethod) handler;
            // 检查方法是否有自定义注解
            if (handlerMethod.getMethodAnnotation(CheckToken.class) != null) {
                // 获取请求中的token
                String token = request.getHeader("token");
                // TODO 这里添加你的逻辑来验证token的合法性
                 boolean validateToken = validateToken(token)
                
                
                if (!validateToken) {
                    // 如果token无效,直接返回错误响应给前端
                    response.setStatus(HttpServletResponse.SC_UNAUTHORIZED);
                    response.getWriter().write("Token is invalid or expired");
                    return false; // 拦截请求,不继续执行后续的处理器
                }
            }
        }
        return true; // 继续执行后续的处理器
    }
 


    private boolean validateToken(String token) {
        // TODO 这里添加你的逻辑来验证token的合法性
        // 这里添加你的token验证逻辑

        // 返回true表示token有效,返回false表示无效或过期
        return "expected-token-value".equals(token);
    }

  
}

方法注册到Spring

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 {

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(new TokenInterceptor());
    }
}

controller直接调用

import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RestController;

@RestController
public class UserController {

    @CheckToken 
    @GetMapping("/user")
    public String user() {
        return "This is a test endpoint";
    }
}