gpt4 book ai didi

java - 有什么方法可以在使用 spring 执行 rest api 之前验证 token

转载 作者:搜寻专家 更新时间:2023-10-31 19:32:24 26 4
gpt4 key购买 nike

我已经为 rest controller 配置了 spring boot。我创建了许多 api,但我需要在请求时验证每个 api 中的 token 信息,用户是否根据提供的 token 获得授权。

在登录期间,我正在生成 token ,该 token 在每个 api 中都需要用于访问信息。如果 token 无效,则我需要返回消息 抱歉,您提供的 token 信息已过期或不存在。

下面是我的 api。

@RequestMapping(value="/delete", method= RequestMethod.DELETE)
public Map<String, Object> delete(@RequestBody String reqData,HttpServletRequest request) {
Map<String, Object> m1 = new HashMap<String,Object>();
JSONObject jsonData = new JSONObject(reqData);
Token token= tokenDao.getByTokenCode(jsonData.getString("token"));
if(token==null){
m1.put("status", "error");
m1.put("message", "Sorry, your provided token information expired or not exists.");
return m1;
}
//here my logic to remove user from database.
}

有没有办法在服务方法或使用注释中检查 token 功能,所以我需要在每个 api 中删除相同的代码并需要使用一个通用功能。

最佳答案

您可以使用HandlerInterceptor 来处理您的 token 。

HandlerInterceptor.preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) 将在任何 RequestMapping 之前执行。

preHandle 中验证您的 token 。如果 token 有效,则继续,否则抛出异常, Controller 建议将处理其余部分。

暴露MappedInterceptor的bean类,spring会自动加载HandlerInterceptor bean包含的。

ControllerAdviceExceptionHandler 可以捕获异常并返回错误信息

完整示例

@RestController
@EnableAutoConfiguration
public class App {

@RequestMapping("/")
public String index() {
return "hello world";
}

public static void main(String[] args) {
SpringApplication.run(App.class, args);
}

public static class MyException extends RuntimeException {

}

@Bean
@Autowired
public MappedInterceptor getMappedInterceptor(MyHandlerInterceptor myHandlerInterceptor) {
return new MappedInterceptor(new String[] { "/" }, myHandlerInterceptor);
}

@Component
public static class TestBean {
public boolean judgeToken(HttpServletRequest request) {
String token = request.getParameter("token");
if (token == null) {
throw new MyException();
}
return true;
}
}

@Component
public static class MyHandlerInterceptor implements HandlerInterceptor {

@Autowired
TestBean testBean;

@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
return testBean.judgeToken(request);
}

@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler,
ModelAndView modelAndView) throws Exception {

}

@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler,
Exception ex) throws Exception {

}
}

@ControllerAdvice
public static class MyExceptionHandler {
@ExceptionHandler(MyException.class)
@ResponseBody
public Map<String, Object> handelr() {
Map<String, Object> m1 = new HashMap<String, Object>();
m1.put("status", "error");
m1.put("message", "Sorry, your provided token information expired or not exists.");
return m1;
}
}

}

关于java - 有什么方法可以在使用 spring 执行 rest api 之前验证 token ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35457187/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com