Cookie中包含空格(特殊字符)的解决方案

Cookie中包含空格可能会出现空格之后的数据丢失的情况。
解决办法:使用URLEncoder.encode()对cookie进行编码,再使用URLDecoder.decode()进行解码
Response:

StringBuilder cookie = new StringBuilder();
        for (BasicNameValuePair basicNameValuePair : basicNameValuePairs) {
            cookie.append(URLEncoder.encode(basicNameValuePair.getName(), String.valueOf(Charsets.UTF_8)))
                  .append("=").append(URLEncoder.encode(basicNameValuePair.getValue(), String.valueOf(Charsets.UTF_8)))
                  .append(";");
        }
        response.setHeader("Set-Cookie", String.valueOf(cookie));

Request

URLDecoder.decode(cookie.getValue(), String.valueOf(Charsets.UTF_8))

问题就解决了。

有一个问题:

当服务器为Jetty的时候,通过`Response.addCookie(cookie)会报错:

Cookie cookie = new Cookie("lastVisitTime", DateFormatUtils.format(new Date(), Const.TIME_STAMP_FORMATTER));
cookie.setMaxAge(24 * 60 * 60);
response.addCookie(cookie);
HTTP ERROR 500
Problem accessing /spring-service/rs/Hello. Reason:

    Server Error
Caused by:
java.lang.IllegalArgumentException: RFC6265 Cookie values may not contain character: [ ]
    at org.eclipse.jetty.http.Syntax.requireValidRFC6265CookieValue(Syntax.java:136)
    at org.eclipse.jetty.server.Response.addSetRFC6265Cookie(Response.java:269)
    at org.eclipse.jetty.server.Response.addCookie(Response.java:231)
    at filter.AppFilter.setCookie(AppFilter.java:83)
    at filter.AppFilter.doFilter(AppFilter.java:68)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1629)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:548)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:190)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:188)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1253)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:168)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:166)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1155)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.ContextHandlerCollection.handle(ContextHandlerCollection.java:219)
    at org.eclipse.jetty.server.handler.HandlerCollection.handle(HandlerCollection.java:126)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at org.eclipse.jetty.server.Server.handle(Server.java:530)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:347)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:256)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:102)
    at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:247)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.produce(EatWhatYouKill.java:140)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:131)
    at org.eclipse.jetty.util.thread.ReservedThreadExecutor$ReservedThread.run(ReservedThreadExecutor.java:382)
    at org.eclipse.jetty.util.thread.QueuedThreadPool.runJob(QueuedThreadPool.java:708)
    at org.eclipse.jetty.util.thread.QueuedThreadPool$2.run(QueuedThreadPool.java:626)
    at java.lang.Thread.run(Thread.java:748)
Powered by Jetty:// 9.4.8.v20171121

只能通过setHeader的方式添加cookie
但是同样的代码,使用addCookie的方式放在tomcat服务器上是完全OK的。不知道啥问题。

  • 0
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值