有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

SpringJava处理无效的请求映射URL,包括编码

在我的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";
}

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

请问,我是否可以使用现有的库或方法来捕获无效的传入API请求?你能帮我举个例子吗?估计吨


共 (1) 个答案

  1. # 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