【问题标题】:Java handle invalid request Mapping urls including decodingsJava 处理无效请求映射 url,包括解码
【发布时间】:2021-04-17 00:00:38
【问题描述】:

在我的 apiController 中,我有

@Controller
@RequestMapping("api/v1/myservice")
@Slf4j
public class APIController {
    @RequestMapping(value = "/validAPI1", method = RequestMethod.GET)
    @ResponseBody
    public String validAPI1() {
        return "success";
    }
}

我想捕获无效的传入API请求,例如/api/v1/myservice/random124,这可以通过在末尾添加一个方法来完成:

@RequestMapping(value = "/**", method = RequestMethod.GET)
@ResponseBody
public String handleInvalidAPIReq() {
    return "watched and handled";
}

这有2个问题,不捕获URL中的%等特殊字符,也不处理输入的URL。我试图对抗的一个例子:/api/v1/myservice/%uff0e%uff0e%u2215%7bFILE%7d/abc12

请问有没有可以用来捕获无效传入 API 请求的库或方法?你能帮忙举个例子吗?欣赏吨。

【问题讨论】:

  • 如果你想在 URL 中传递 % 则正确编码为 %25
  • 什么是invalid incoming API requests

标签: java spring api exception request-mapping


【解决方案1】:

处理错误请求的常见解决方案是在org.springframework.web.servlet.DispatcherServlet 类中设置throwExceptionIfNoHandlerFound。你没有提到你写的是哪种类型的应用程序,简单的带有 spring-mvc 依赖的 war 存档或 spring boot 样式的应用程序。

对于简单的 spring-mvc 应用程序,您可以在 web.xml 文件中设置该属性:

    ...
    <servlet>
        <servlet-name>spring</servlet-name>
        <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        <init-param>
            <param-name>throwExceptionIfNoHandlerFound</param-name>
            <param-value>true</param-value>
        </init-param>
        <load-on-startup>1</load-on-startup>
    </servlet>
    ...

对于spring boot应用,你只需要设置config属性:

spring.mvc.throw-exception-if-no-handler-found=true

在这两种情况下,DispatcherServlet 都会抛出NoHandlerFoundException 异常,为了处理这个异常,你需要添加ExceptionHandler 类如下::

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.servlet.NoHandlerFoundException;

@ControllerAdvice
public class ControllerExceptionHandler {

    @ExceptionHandler(NoHandlerFoundException.class)
    public ResponseEntity<String> handleNoHandlerFoundException(NoHandlerFoundException ex) {
        return ResponseEntity.status(404).body("Error occurred");
    }

}

注意:启用throwExceptionIfNoHandlerFound属性时,请记住静态资源,并为其添加自定义映射,否则将找不到资源。 配置静态资源(Spring Boot):

spring.mvc.static-path-pattern=/static/**
spring.resources.static-locations=classpath:/resources/static/

或者如果没有静态资源:

spring.resources.add-mappings=false

【讨论】:

  • 非常感谢您的回复。我使用包装弹簧配置的服务,我无法将配置设置为看不到 web.xml。 ControllerAdvice 非常有帮助。我尝试设置上面的代码,但即使我使用了最通用的@ExceptionHAndler(Exception.class),它也没有达到断点。我正在尝试探索 ResponseEntity。请帮助分享更多想法。非常感谢。
  • 请澄清短语:“我使用的服务包装弹簧配置”,无论如何你使用DispatcherServlet,否则RequestMapping 注释将不起作用。定义DispatcherServlet 的方法很少,其中一种方法是web.xml,从Servlet 3.0 开始,DispatcherServlet 可以通过实现或扩展类以编程方式配置:WebAppInitializerAbstractDispatcherServletInitializerAbstractAnnotationConfigDispatcherServletInitializer。请检查您的项目中是否配置了女巫方式DispatcherServlet
  • 您实现的ExceptionHandler(如上所述)不起作用,因为DispatcherServlet 不会抛出异常,处理未映射的网址只有一种方法,您应该找到在哪里DispatcherServlet 定义并添加用于抛出异常的属性
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-09-19
  • 1970-01-01
  • 2018-11-12
  • 2020-08-29
  • 1970-01-01
  • 2012-10-10
  • 2021-05-30
相关资源
最近更新 更多