Java SpringBoot嵌入式tomcat服务器将查询参数中的unicode字符读取为null
我在spring boot中设计了一个休息端点。Tomcat被用作嵌入式服务器。它接受一个查询参数Java SpringBoot嵌入式tomcat服务器将查询参数中的unicode字符读取为null,java,spring-boot,tomcat,unicode,Java,Spring Boot,Tomcat,Unicode,我在spring boot中设计了一个休息端点。Tomcat被用作嵌入式服务器。它接受一个查询参数 当我将查询参数作为param1传递时%uFF07 tomcat在内部将参数读取为null 当我将查询参数作为param1%FF07传递时,tomcat读取为某个字符 如果在tomcat解析参数“%”字符后加上u,则tomcat仅在后跟两个十六进制数字时读取“%”字符,即null带消息 字符解码失败。参数[name]的值为[param1%uFF07] 已经被忽略了。请注意,此处引用的名称和值可能是
null
带消息
字符解码失败。参数[name]的值为[param1%uFF07]
已经被忽略了。请注意,此处引用的名称和值可能是
由于解码失败而损坏。使用调试级日志记录查看
原始的、未损坏的值。注:进一步出现以下情况:
参数错误将在调试级别记录
这是spring引导控制器代码
@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));
}
}
您正在传递
%
登录您的url,但%
是url中的符号,按原样传递%
。。。您必须通过%25
,然后它才能正常工作
因此,如果您传递%25uFF07
,它将显示%uFF07
作为值
无需更改application.properties或任何类型的设置中的任何内容。我已经在我的项目中对此进行了测试
请随时要求澄清。希望能有所帮助。我找到了一种使用过滤器的方法。有关过滤器的基本知识,请参阅。我们可以在那里截取请求查询字符串,并使用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() {
}
}在第二种情况下,它是哪个字符?uFF07表示“单双引号字符。这里的问题是你的角色tomcat讨厌看到它!!!这不起作用,因为它将tomcat的默认编码从ISO_8859_1更改为UTF-8。基本上,我关心的是tomcat解码unicode字符的方式,它只是讨厌%字符后面的任何东西,而不是两个十六进制数字%字符应该有invoke 400响应。这里的参数被解析为null,这将导致所有未过滤数据的200响应。您想说什么??为什么您认为
%
字符应该调用400
(这是一个错误的请求)??我想你一定读过关于url编码的书。它清楚地表明,URL编码将不安全的ASCII字符替换为“%”,后跟两个十六进制数字。
当您手动传递%uFF07
时,它会查找%XX
,这里,XX
表示两个十六进制字符串(即0-9&a-F),但正如我们所知u
不是有效的十六进制字符,它将该值作为脏值忽略。因此在变量中显示null
。是的,无法解码的无效字符应得到400Nope的响应,如果该字符未被识别,这并不意味着服务器将发送400
代码400
用于如果服务器不理解您的请求(完整HTTP请求),则服务器发送400
说“哦,我没有得到您想要做的。”。。但在您的情况下,请求参数的值无法识别。。但是您的请求是可以很好地识别的,如果您在方法中放入print,您将看到输出print,因为z服务器知道要执行哪个方法,但获取的参数值为null
。