springmvc controller接收参数

思路很简单

controller接收Base64编码,将其转换成字节数组,再以流的形式生成图片。
我本地测试成功,可以形成图片,放到服务器上之后图片生成有问题。

经测试是因为传过来的参数有问题。
应为:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACsAAAAYCAYAAABjswTDAAANB0lEQVRYRx2WeZDb9XnGPz/d97nSStrV3pf3ss3iE5+LjbGpgWIwaVpCAm0CtCTTa9okbafTyR+ZdKbTNMlMShImx7gYMMYYA6VgjA/w+lzvrb1XXkkrabW67+vXQX+9/3xnvvM+7/N+。。。。

结果为:
data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACsAAAAYCAYAAABjswTDAAANB0lEQVRYRx2WeZDb9XnGPz/d97nSStrV3pf3ss3iE5 LjbGpgWIwaVpCAm0CtCTTa9okbafTyR ZdKbTNMlMShImx7gYMMYYA6VgjA/w lzvrb1XXkkrabW67 vXQX 9/3xnvvM 7/N 。。。。

加号都没了

应该怎样接收参数才能避免这个情况呢?

阅读 5.7k
5 个回答

先解决你的问题,将入参中的“+”用%2B代替

有些符号在URL中是不能直接传递的,如果要在URL中传递这些特殊符号,那么就要使用他们的编码了。
编码的格式为:%加字符的ASCII码,即一个百分号%,后面跟对应字符的ASCII(16进制)码值。

  • + : URL 中+号表示空格,对应编码:%2B

  • 空格 :URL中的空格可以用+号或者编码表示,对应编码:%20

  • / :分隔目录和子目录,对应编码:%2F

  • ?:分隔实际的URL和参数,对应编码:%3F

  • %:指定特殊字符,对应编码:%25

  • #:表示书签,对应编码:%23

  • &:URL 中指定的参数间的分隔符,对应编码:%26

  • =:URL 中指定参数的值,对应编码:%3D

前端发送之前对加号做encode处理,正常如果是jQuery之类的应该会自动处理吧?

Base64编码太长了吧,用JQuery2吧,哈哈

导致这个问题是因为在URL里 参数字符"+"其实表示的是空格,另外还要注意一些其他特殊字符,也会出现类似的情况;
建议将需要传递的参数使用encodeURIComponent方法进行重新编码,让后后台接收到参数之后再进行解码
另外给一个解码的方法

public final static String unescape(String src) {
        if (StringUtil.isNotBlank(src)) {
            StringBuffer tmp = new StringBuffer();
            tmp.ensureCapacity(src.length());
            int lastPos = 0, pos = 0;
            char ch;
            while (lastPos < src.length()) {
                pos = src.indexOf("%", lastPos);
                if (pos == lastPos) {
                    if (src.charAt(pos + 1) == 'u') {
                        ch = (char) Integer.parseInt(src.substring(pos + 2, pos + 6), 16);
                        tmp.append(ch);
                        lastPos = pos + 6;
                    } else {
                        ch = (char) Integer.parseInt(src.substring(pos + 1, pos + 3), 16);
                        tmp.append(ch);
                        lastPos = pos + 3;
                    }
                } else {
                    if (pos == -1) {
                        tmp.append(src.substring(lastPos));
                        lastPos = src.length();
                    } else {
                        tmp.append(src.substring(lastPos, pos));
                        lastPos = pos;
                    }
                }
            }
            return tmp.toString();
        }
        return null;
    }
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题