Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/349.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java SpringBoot嵌入式tomcat服务器将查询参数中的unicode字符读取为null_Java_Spring Boot_Tomcat_Unicode - Fatal编程技术网

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

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] 已经被忽略了。请注意,此处引用的名称和值可能是

我在spring boot中设计了一个休息端点。Tomcat被用作嵌入式服务器。它接受一个查询参数

  • 当我将查询参数作为param1传递时%uFF07 tomcat在内部将参数读取为null
  • 当我将查询参数作为param1%FF07传递时,tomcat读取为某个字符
  • 如果在tomcat解析参数“%”字符后加上u,则tomcat仅在后跟两个十六进制数字时读取“%”字符,即
    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