建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
请选择 进入手机版 | 继续访问电脑版
设置昵称

在此一键设置昵称,即可参与社区互动!

确定
我再想想
选择版块

一万个为什...

发帖: 1粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-3-15 09:45:50 89 6 楼主 显示全部楼层
[技术交流] fundation-vertx-1.1.0B022.jar获取cookie时针对cookie中带有version报错

    今天升级变更使用了fundation-vertx-1.1.0B022.jar获取cookie,由于cookie中携带有version=1,导致报错,但是version改成其他名称就能通过,请教下是不是包中serviceCombo里有对这个字段做处理或者有什么配置,反编译看不到.

有报错:.|java.lang.IllegalArgumentException: Cookie name "version" is a reserved token\n at javax.servlet.http.Cookie.<init>(Cookie.java:192)\n at org.apache.servicecomb.foundation.vertx.http.VertxServerRequestToHttpServletRequest.getCookies(VertxServerRequestToHttpServletRequest.java:99)\n at com.huawei.ttmusic.common.filter.InitFilter.handelToken(InitFilter.java:260)\n at


回复 举报
分享

分享文章到朋友圈

分享文章到微博

liubao68

发帖: 96粉丝: 7

级别 : 版主

Rank: 7Rank: 7Rank: 7

发消息 + 关注

发表于2019-3-15 10:07:13 沙发 显示全部楼层

CSE没有实现Servlet协议,所以这里的HttpServletRequest对象和大家开发servlet时候看到的不一样,不能像使用servlet那样使用。 


HttpServletRequest能取到的信息,只包括在REST接口定义中显示声明的参数(query, header等),声明方式可以通过@ApiImpliciteParam, 或者@RequestMapping等标签。 


那么对于没有声明的header怎么获取了? 需要通过HttpServerFilter拦截http请求,获取对应的header,然后调用Invocation setContext加入到context里面, 然后业务代码可以从context获取。 


这里有个例子: https://github.com/huaweicse/cse-java-chassis-samples/tree/master/porter

点赞 回复 举报

一万个为什...

发帖: 1粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-3-15 10:18:22 板凳 显示全部楼层
liubao68 发表于 2019-3-15 10:07 CSE没有实现Servlet协议,所以这里的HttpServletRequest对象和大家开发servlet时候看到的不一样,不能像使 ...

代码是走到getcookie()这个方法报错,而且这个方法调用的cse的jar:

org.apache.servicecomb.foundation.vertx.http.VertxServerRequestToHttpServletRequest.getCookies(VertxServerRequestToHttpServletRequest.java:99)\n at

点赞 回复 举报

wujimin

发帖: 3粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-3-15 10:25:33 地板 显示全部楼层
public Cookie(String name, String value) {
    if (name == null || name.length() == 0) {
        throw new IllegalArgumentException(
                lStrings.getString("err.cookie_name_blank"));
    }
    if (!isToken(name) ||
            name.equalsIgnoreCase("Comment") || // rfc2019
            name.equalsIgnoreCase("Discard") || // 2019++
            name.equalsIgnoreCase("Domain") ||
            name.equalsIgnoreCase("Expires") || // (old cookies)
            name.equalsIgnoreCase("Max-Age") || // rfc2019
            name.equalsIgnoreCase("Path") ||
            name.equalsIgnoreCase("Secure") ||
            name.equalsIgnoreCase("Version") ||
            name.startsWith("$")) {
        String errMsg = lStrings.getString("err.cookie_name_is_token");
        Object[] errArgs = new Object[1];
        errArgs[0] = name;
        errMsg = MessageFormat.format(errMsg, errArgs);
        throw new IllegalArgumentException(errMsg);
    }

    this.name = name;
    this.value = value;
}

javax.servlet.http.Cookie#Cookie

servlet的cookie构造时,有这些限制

有些奇怪,我们需要识别一下,是否不应该使用这个类

点赞 回复 举报

一万个为什...

发帖: 1粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-3-15 10:31:34 5# 显示全部楼层
wujimin 发表于 2019-3-15 10:25 public Cookie(String name, String value) {     if  ...

您这是fundation-vertx里面的对cookie获取的代码吗?我这边报的错是:

.|java.lang.IllegalArgumentException: Cookie name "version" is a reserved token\n at javax.servlet.http.Cookie.<init>(Cookie.java:192)\n at org.apache.servicecomb.foundation.vertx.http.VertxServerRequestToHttpServletRequest.getCookies(VertxServerRequestToHttpServletRequest.java:99)\n at com.huawei.ttmusic.common.filter.InitFilter.handelToken(InitFilter.java:260)\n at

点赞 回复 举报

wujimin

发帖: 3粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-3-15 10:55:30 6# 显示全部楼层
https://docs.microsoft.com/en-us/windows/desktop/wininet/http-cookies

服务端接受,是cookie,只有name=value,没有附加信息
服务端应答,是set-cookie,此时才有附加信息

而servlet规范中,cookie name不允许出现内置token,所以,没有bug
点赞 回复 举报

wujimin

发帖: 3粉丝: 0

级别 : 新手上路

Rank: 1

发消息 + 关注

发表于2019-3-15 11:04:15 7# 显示全部楼层

补充一下,version等等这些token是不能作为cookie name的,它们只是某个name的附加信息

点赞 回复 举报

游客

您需要登录后才可以回帖 登录 | 立即注册