SpringBoot嵌入式tomcat服务器读取查询参数中的Unicode字符为null

时间:2018-07-30 15:12:51

标签: java spring-boot tomcat unicode

我在弹簧靴中设计了一个休息点。 Tomcat被用作嵌入式服务器。它带有一个查询参数。

  1. 当我将查询参数传递为param1%uFF07时,tomcat在内部将参数读取为null
  2. 当我将查询参数传递为param1%FF07时,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));
    }
}

2 个答案:

答案 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() {
}

}