阿阿阿安 2022-01-13 14:47 采纳率: 50%
浏览 446
已结题

springboot @PathVariable如何获取路径中的中文参数

在SpringBoot项目开发中,某个需求需要将错误中文信息字符串转发给对应的Controller处理,于是我就先将中文字符串使用URLEncoder.encode(message, "UTF-8")进行编码,然后将编码后的字符串拼接到URL之后,使用httpServletResponse.sendRedirect重定向到目标Controller,其代码如下:

    /**
     * 将非法请求转到 /unauthorized/** 处理
     */
    private void responseError(ServletResponse response, String message) {
        try {
            HttpServletResponse httpServletResponse = (HttpServletResponse) response;
            message = URLEncoder.encode(message, "UTF-8");
            httpServletResponse.sendRedirect("/unauthorized/" +  message);
        } catch (IOException e) {
            e.printStackTrace();
        }
    }

在Controller中,使用@RequestMapping(value="/unauthorized/{message}") 来获取路径上的动态参数message,其代码如下:

    @RequestMapping(value="/unauthorized/{message}")
    public ResultMap unauthorized(@PathVariable("message") String message){
        return ResultMap.fail(message);
    }

在测试中发现,编码后的中文字符串类似于 %E7%99%BB%E5%BD%95%E8%BA%AB%E4%BB%BD%E5%A4%B1%E6%95%88 形式,重定向时发生了请求不断循环的情况,Controller无法捕获该请求,最后报错 Error: Exceeded maxRedirects. Probably stuck in a redirect loop.
但是当我把参数字符串中的%去掉以后,Controller方法就可以正常捕获处理该请求了,于是我猜测是@RequestMapping 无法匹配%这个特殊字符,请问有人有解决方法吗?

  • 写回答

2条回答 默认 最新

  • 编号灬9527 2022-01-13 15:02
    关注

    你这个使用全局异常,不更好处理?
    或者使用转发,request.setAttr带数据过去

    评论

报告相同问题?

问题事件

  • 已结题 (查看结题原因) 2月16日
  • 创建了问题 1月13日