微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Java处理无效请求映射url包括解码

如何解决Java处理无效请求映射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";
}

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

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

解决方法

处理错误请求的常见解决方案是在 throwExceptionIfNoHandlerFound 类中设置 org.springframework.web.servlet.DispatcherServlet。您没有提到您编写的是哪种类型的应用程序,具有 spring-mvc 依赖项的简单战争存档或 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 应用程序,你只需要设置配置属性:

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

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。

相关推荐


Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其他元素将获得点击?
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。)
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbcDriver发生异常。为什么?
这是用Java进行XML解析的最佳库。
Java的PriorityQueue的内置迭代器不会以任何特定顺序遍历数据结构。为什么?
如何在Java中聆听按键时移动图像。
Java“Program to an interface”。这是什么意思?