自定义注解 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";
}
}