java - 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 应用程序,您只需要设置 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
推荐阅读
- css - 我如何知道使用哪些目录来编译 SASS?
- string - 如何从表示坐标集合的字符串中提取数据?
- sql-server - SQL Server ExpressMaint 使用帐号 (id/pw)
- sql-server - SqlException:“程序或函数 usp_UserValidation 指定了太多参数。”
- python - Django Rest-framework:无法使用个人资料图片创建用户
- javascript - ActionController::ParameterMissing(参数丢失或值为空:字段)
- gradle - Gradle 6.0 打破了源集依赖
- c - 如何使用 GStreamer 多媒体框架将 GStreamer 命令行转换为 c 代码?
- php - URL 中的十六进制值如何改变文件的路径?
- javascript - 如何为以下代码片段编写单元测试用例