Cookie值中存在无效字符[44]的解决办法

这篇博客讲述了在开发购物网站时遇到的浏览记录模块错误,问题出在Cookie值中的特殊字符导致解析失败。作者通过使用URLEncoder.encode()和URLDecoder.decode()对Cookie值进行编码和解码,成功解决了这个问题,确保了浏览记录的正常存储和更新。同时,博客还提醒了开发者注意其他可能的无效字符,并建议预先统一编码来避免类似错误。
摘要由CSDN通过智能技术生成

在写一个购物网站的小项目,在完成浏览商品信息记录模块时,出现错误,错误代码及错误截图如下:

//当前窗口可以查询单个商品对应信息,并且可以记录浏览情况,存入cookie中
                String idstr = req.getParameter("id");
                String ToplistAll = "";
                //获取浏览记录列表,防止因再次访问而丢失信息
                Cookie[] cookies = req.getCookies();
                for (Cookie cookie:cookies){
                    if(cookie.getName().equals("listViewCookie")){
                        ToplistAll = cookie.getValue() ;
                      
                    }
                }
                //在更新信息之前先查看当前列表的信息数量,如果超过1000则清零
                String[] arr = ToplistAll.split(",");
                if(arr.length>=1000){
                    ToplistAll = "";
                }
                //更新浏览记录
               
                ToplistAll += req.getParameter("id")+",";
                Cookie cookie = new Cookie("listViewCookie", ToplistAll);

                //重新保存
                resp.addCookie(cookie);
                //将前五条记录保存到浏览器中,以便用户查看
                req.setAttribute("Toplist",myshoppingRepsitory.SelectTop5(ToplistAll));
                //以下是根据ID查找对应商品信息
                Integer id = Integer.parseInt(idstr);
                req.setAttribute("item",myshoppingRepsitory.FindById(id));
//                System.out.println(myshoppingRepsitory.FindById(id).toString());

                req.getRequestDispatcher("details.jsp").forward(req,resp);

在这里插入图片描述

从报错信息可以发现,是获取到的cookie值中存在不能识别的字符,即不能识别 “,”。可以使用URLEncoder.encode() 进行编码,统一编码格式,再用URLDecoder.decode()解码,就可以解决问题。
修改后的代码如下:

 //当前窗口可以查询单个商品对应信息,并且可以记录浏览情况,存入cookie中
                String idstr = req.getParameter("id");
                String ToplistAll = "";
                //获取浏览记录列表,防止因再次访问而丢失信息
                Cookie[] cookies = req.getCookies();
                for (Cookie cookie:cookies){
                    if(cookie.getName().equals("listViewCookie")){
       // 修改部分
                        ToplistAll = URLDecoder.decode(cookie.getValue()) ;
                    }
                }
                //在更新信息之前先查看当前列表的信息数量,如果超过1000则清零
                String[] arr = ToplistAll.split(",");
                if(arr.length>=1000){
                    ToplistAll = "";
                }
                //更新浏览记录
                /**
                 * 需特别注意的是: "," 该分隔符在cookie中属于特殊字符,编码时可能出现 Cookie值中存在无效字符[44] 提示
                 * 为解决此问题,可以使用 URLEncoder.encode 进行编码,要记得使用时用 URLDecoder.decode 解码
                 */
                ToplistAll += req.getParameter("id")+",";
       //  修改部分
                Cookie cookie = new Cookie("listViewCookie", URLEncoder.encode(ToplistAll));
                //重新保存
                resp.addCookie(cookie);
                //将前五条记录保存到浏览器中,以便用户查看
                req.setAttribute("Toplist",myshoppingRepsitory.SelectTop5(ToplistAll));
                //以下是根据ID查找对应商品信息
                Integer id = Integer.parseInt(idstr);
                req.setAttribute("item",myshoppingRepsitory.FindById(id));
//                System.out.println(myshoppingRepsitory.FindById(id).toString());

                req.getRequestDispatcher("details.jsp").forward(req,resp);

当然还可能遇到其他无效字符,可以通过查看ASCII表,用cookie.setValue()去排除无效字符,不过事先统一编码,会更有效地避免这一错误。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值