【问题标题】:Spring boot rest api not failed in case of invalid Endpoint在端点无效的情况下,Spring boot rest api 不会失败
【发布时间】:2020-04-18 01:34:20
【问题描述】:

我正在使用 Spring Boot 编写一个 RESTful Web 服务。我正在使用 jwt 不记名令牌来验证授权。

下面是我的 RestController

@RestController("api/v1/users")
public class UserController {

    @Autowired
    UserService userService;

    @PostMapping
    public User saveUser(@RequestBody User user) {
        return userService.saveUser(user);
    }

    @GetMapping
    public List<User> getUsers(@RequestParam(required = false) String pageNumber, String pageSize, String role, String status) {
        return userService.findAll(pageNumber, pageSize, role, status);
    }

}

当我使用 request-url 访问 api 时

http://localhost:8080/api/v1/users?pageNumber=0&pageSize=6&role=admin

它的工作完美

但是如果我将 url 端点更改为一些无效的端点,例如

http://localhost:8080/api/v1/hhh?pageNumber=0&pageSize=6&role=admin

它仍然返回与第一个正确端点相同的结果。

以下是 springframework 调试日志中的一些日志语句

检查请求的匹配:'/api/v1/hhh';反对 '/api/test/secureTest'

2019-12-28 19:16:47.601 调试 5591 --- [nio-8080-exec-5] o.s.s.w.u.matcher.AntPathRequestMatcher :检查请求的匹配: '/api/v1/hhh';反对 'api/authenticate'

2019-12-28 19:16:47.601 调试 5591 --- [nio-8080-exec-5] o.s.s.w.u.matcher.AntPathRequestMatcher :检查请求的匹配: '/api/v1/hhh';反对'/api/v1/users/me'

2019-12-28 19:16:47.601 调试 5591 --- [nio-8080-exec-5] o.s.s.w.u.matcher.AntPathRequestMatcher :检查请求的匹配: '/api/v1/hhh';反对'/api/v1/student'

2019-12-28 19:16:47.601 调试 5591 --- [nio-8080-exec-5] o.s.s.w.u.matcher.AntPathRequestMatcher :检查请求的匹配: '/api/v1/hhh';反对'/api/v1/faculty'

2019-12-28 19:16:47.601 调试 5591 --- [nio-8080-exec-5] o.s.s.w.u.matcher.AntPathRequestMatcher :检查请求的匹配: '/api/v1/hhh';反对'/api/v1/admin'

2019-12-28 19:16:47.601 调试 5591 --- [nio-8080-exec-5] o.s.s.w.u.matcher.AntPathRequestMatcher :检查请求的匹配: '/api/v1/hhh';反对'/api/v1/users'

2019-12-28 19:16:47.601 调试 5591 --- [nio-8080-exec-5] o.s.s.w.a.i.FilterSecurityInterceptor : 公共对象 - 未尝试身份验证

2019-12-28 19:16:47.601 调试 5591 --- [nio-8080-exec-5] os.security.web.FilterChainProxy : /api/v1/hhh?pageNumber=0&pageSize=6&role=admin 已到达末尾 额外的过滤器链;继续原链

2019-12-28 19:16:47.602 跟踪 5591 --- [nio-8080-exec-5] os.web.servlet.DispatcherServlet:获取 "/api/v1/hhh?pageNumber=0&pageSize=6&role=admin", 参数={masked}, DispatcherServlet 'dispatcherServlet' 中的 headers={masked}

2019-12-28 19:16:47.602 跟踪 5591 --- [nio-8080-exec-5] o.s.b.f.s.DefaultListableBeanFactory : 返回缓存的实例 单例 bean 'api/v1/users'

2019-12-28 19:16:47.602 跟踪 5591 --- [nio-8080-exec-5] s.w.s.m.m.a.RequestMappingHandlerMapping :映射到公共 java.util.List com.asset.app.user.UserController.getUsers(java.lang.String,java.lang.String,java.lang.String,java.lang.String)

2019-12-28 19:16:47.602 跟踪 5591 --- [nio-8080-exec-5] .w.s.m.m.a.ServletInvocableHandlerMethod :参数:[0, 6, admin, 空]

我觉得 Spring 缓存了端点 url 并在没有找到匹配的情况下使用

知道如何阻止这种情况吗?

【问题讨论】:

  • 浏览器会缓存上一个响应,如果当前响应失败,请尝试在另一个浏览器中打开无效的 url。
  • 我从 Rest 客户端(邮递员)尝试过,它不是客户端缓存,因为在服务器端没有错误
  • 其他浏览器也会出现同样的情况吗?
  • 是的,不同客户端的行为相同。当我在调试模式下运行它时,实际上调用的是控制器方法。
  • 你不能在 RestController 中指定映射,你需要在类级别或方法级别使用 RequestMapping 或其他替代方法

标签: spring rest spring-boot spring-restcontroller


【解决方案1】:

如果您阅读了@RestController 的 api 文档

你看到注解构造函数接受了一个value,它被描述为:

该值可能表示对逻辑组件名称的建议,以 在自动检测到组件的情况下转换为 Spring bean。

所以它用于为要创建的Bean 设置一个名称。

用于像您所做的那样设置 url 映射。

@RestController("api/v1/users")

您需要使用 @RequestMapping 注释您的类,并添加到 @PostMapping@GetMapping 的映射。

@RestController
@RequestMapping("/api/v1") // Add request mapping
public class FooBar {

    @PostMapping("/users") // Add mapping here
    public User bar() {
        ...
    }

    @GetMapping("/users") // Add mapping here
    public List<User> foo() {
        ...
    }
}

【讨论】:

    猜你喜欢
    • 2015-06-07
    • 2016-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-05-26
    • 1970-01-01
    • 2020-05-05
    相关资源
    最近更新 更多