我在弹簧靴中设计了一个休息点。 Tomcat被用作嵌入式服务器。它带有一个查询参数。
tomcat仅在后跟两个十六进制数字时读取'%'字符,如果u放在'%'字符后,tomcat将参数解析为null
并显示消息
字符解码失败。参数[name]的值为[param1%uFF07] 已被忽略。请注意,此处引用的名称和值可能是 由于解码失败而损坏。使用调试级别日志记录来查看 原始的,未损坏的值。注意:进一步发生 参数错误将记录在DEBUG级别。
这是Spring Boot控制器代码
@RestController
public class GreetingController {
private static final String template = "Hello, %s!";
private final AtomicLong counter = new AtomicLong();
@RequestMapping("/greeting")
public Greeting greeting(@RequestParam(value = "name", required = false) String name) {
return new Greeting(counter.incrementAndGet(), String.format(template, name));
}
}
答案 0 :(得分:0)
您正在传递%
登录网址,但是%
是url中的符号,要按原样传递%
...您将必须传递%25
然后它将按预期工作。
因此,如果您传递%25uFF07
,它将显示%uFF07
作为值。
无需更改application.properties或任何类型的设置。我已经在我的项目中对此进行了测试。
请随时要求任何澄清。希望对您有帮助。
答案 1 :(得分:0)
我找到了使用过滤器的方法。有关过滤器的基础知识可以在here上找到。我们可以在那里截取请求查询字符串,并使用Tomcat UDecoder类解析查询字符串,如果引发任何异常,我们可以显示400的响应。
公共类SimpleFilter实现了过滤器{
private final UDecoder urlDecoder = new UDecoder();
private final Logger logger = LoggerFactory.getLogger(SimpleFilter.class);
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
HttpServletRequest httpServletRequest = (HttpServletRequest) request;
HttpServletResponse httpServletResponse = (HttpServletResponse) response;
String queryString = httpServletRequest.getQueryString();
if (queryString != null) {
ByteChunk byteChunk = new ByteChunk();
byteChunk.setBytes(queryString.getBytes(), 0, queryString.length());
try {
urlDecoder.convert(byteChunk, true);
} catch (IOException ioException) {
logger.error("Hazarduos character found in request parameter.");
httpServletResponse.setStatus(HttpStatus.BAD_REQUEST.value());
return;
}
}
chain.doFilter(request, response);
}
@Override
public void destroy() {
}
}