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

   在写一个购物网站的小项目,在完成浏览商品信息记录模块时,出现错误,错误代码及错误截图如下:
//当前窗口可以查询单个商品对应信息,并且可以记录浏览情况,存入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值中存在无效字符[44]的解决办法

    从报错信息可以发现,是获取到的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()去排除无效字符,不过事先统一编码,会更有效地避免这一错误。
上一篇:100道GO笔试_答案&解析&扩展_选择题21-44


下一篇:网络数据修改工具netsed