java - Spring Boot URL 路径变量编码
问题描述
我有一个 Spring boot (v2.3.5.RELEASE) REST API,似乎无法解决路径变量的编码问题。我已经尝试了所有在网上找到的解决方案,但没有任何帮助。这是主类:
@SpringBootApplication
public class RestApplication {
public static void main(String[] args) {
SpringApplication.run(RestApplication.class, args);
}
}
RestController(向该 URL 发送请求时永远不会执行该方法):
@RestController
@RequestMapping("/mvn/packages")
public class ModuleApi {
@Autowired
ModuleApiService service;
@GetMapping(value = "/{pkg}/{pkg_ver}/modules/{namespace}/metadata", produces = MediaType.APPLICATION_JSON_VALUE)
ResponseEntity<String> getModuleMetadata(@PathVariable("pkg") String package_name,
@PathVariable("pkg_ver") String package_version,
@PathVariable("namespace") String module_namespace) {
return service.getModuleMetadata(package_name, package_version, module_namespace);
}
}
配置类:
@Configuration
public class CorsConfiguration
{
@Bean
public FilterRegistrationBean filterRegistrationBean() {
FilterRegistrationBean registrationBean = new FilterRegistrationBean();
CharacterEncodingFilter characterEncodingFilter = new CharacterEncodingFilter();
characterEncodingFilter.setForceEncoding(true);
characterEncodingFilter.setEncoding("UTF-8");
registrationBean.setFilter(characterEncodingFilter);
return registrationBean;
}
}
application.properties
: _
logging.level.org.springframework.web=DEBUG
server.port=8080
server.tomcat.uri-encoding=UTF-8
server.servlet.encoding.charset=UTF-8
server.servlet.encoding.enabled=true
server.servlet.encoding.force=true
我什至在以下内容中添加了spring-boot-maven-plugin
编码pom.xml
:
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<version>2.3.6.RELEASE</version>
<configuration>
<mainClass>RestApplication</mainClass>
<jvmArguments>-Dfile.encoding=UTF8</jvmArguments>
</configuration>
</plugin>
但结果还是一样。http://localhost:8080/mvn/packages/junit:junit/4.12/%2Fjunit.framework%2FAssert
当向ie发送请求mvn/packages/{pkg}/{pkg_ver}/modules/{namespace}/metadata
并被namespace
编码时,它返回HTTP 400 - BAD REQUEST
.
但是,当我尝试http://localhost:8080/mvn/packages/junit:junit/4.12/foo
(不需要编码/解码)时,它可以工作。
我也尝试使用ALLOW_ENCODED_SLASH
属性。主类:
@SpringBootApplication
public class RestApplication {
public static void main(String[] args) {
System.setProperty("org.apache.tomcat.util.buf.UDecoder.ALLOW_ENCODED_SLASH", "true");
SpringApplication.run(RestApplication.class, args);
}
}
但在这种情况下,它无法解析对该映射的请求并返回404 - NOT FOUND
:
2020-12-10 17:03:27.044 DEBUG 105120 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : GET "/mvn/packages/junit:junit/4.12/%2Fjunit.framework%2FAssert", parameters={}
2020-12-10 17:03:27.053 DEBUG 105120 --- [nio-8080-exec-1] o.s.w.s.handler.SimpleUrlHandlerMapping : Mapped to ResourceHttpRequestHandler ["classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/", "/"]
2020-12-10 17:03:27.056 DEBUG 105120 --- [nio-8080-exec-1] o.s.w.s.r.ResourceHttpRequestHandler : Resource not found
2020-12-10 17:03:27.056 DEBUG 105120 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Completed 404 NOT_FOUND
2020-12-10 17:03:27.060 DEBUG 105120 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : "ERROR" dispatch for GET "/error", parameters={}
2020-12-10 17:03:27.062 DEBUG 105120 --- [nio-8080-exec-1] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#errorHtml(HttpServletRequest, HttpServletResponse)
2020-12-10 17:03:27.083 DEBUG 105120 --- [nio-8080-exec-1] o.s.w.s.v.ContentNegotiatingViewResolver : Selected 'text/html' given [text/html, text/html;q=0.8]
2020-12-10 17:03:27.087 DEBUG 105120 --- [nio-8080-exec-1] o.s.web.servlet.DispatcherServlet : Exiting from "ERROR" dispatch, status 404
任何人都可以帮助我吗?
解决方案
推荐阅读
- spring - Spring Boot - 自定义验证消息
- oracle - obiee12c 仪表板提示在分析过滤器之前运行
- react-native - React Native 收到此错误“未找到运算符“abs””
- html - 将外部 CSS 样式表与 Shopify 产品页面链接
- python - 如何在python中将输出转换为dict?
- laravel - Laravel webpack.mix:当scss翻译成css时出现字体导入字符串中的换行符
- javascript - LightningChartJs点系列在改变角度路线后消失
- reactjs - Shouldn't useContext() only be used for low frequent updates? (mobx-react-lite)
- laravel - Laravel 验证是否多次选择相同的项目
- html - 当容器溢出-y 为自动且容器未溢出时如何看不到背景