java 在使用Spring执行REST API之前,有没有什么方法可以验证令牌

ffscu2ro  于 2023-09-29  发布在  Java
关注(0)|答案(3)|浏览(98)

我已经为休息控制器配置了 Spring Boot 。我创建了许多API,但我需要验证我的令牌信息在每个API乞讨,是用户授权或不提供令牌的基础。
在登录过程中,我正在生成令牌,该令牌在每个API中都需要用于访问信息。如果令牌无效,则需要返回消息Sorry, your provided token information has been expired or not exists.
以下是“我的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.
}

是否有任何方法可以在服务方法或使用注解中检查令牌功能,因此我需要在每个API中删除相同的代码,并需要使用一个公共功能。

dnph8jn4

dnph8jn41#

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

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

preHandle中验证您的token。如果token有效,则继续,否则抛出异常,控制器建议将处理其余部分。
暴露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;
        }
    }

}
tkqqtvp1

tkqqtvp12#

public class TokenVallidation
 {        
    public static boolean tokenValidation(user id, String token){    
        Token token= tokenDao.getByTokenCode(id,jsonData.getString("token"));
        if(token==null){
            m1.put("status", "error");
            m1.put("message", "Sorry, your provided token information expired or not exists.");
            return false;
        }     
        else{
            return true;
        }
    }
}

对于控制器,传递用户ID和令牌并检查令牌。你需要根据user id参数更新dao方法。

xoshrz7s

xoshrz7s3#

您可以使用cache,而不是从数据库中获取token并与当前token匹配。创建自己的缓存对象,如Map或静态string,它将具有最新的令牌。并且您可以直接将传入令牌与来自缓存的此令牌进行比较。不需要每次都访问数据库。

相关问题