在写一个购物网站的小项目,在完成浏览商品信息记录模块时,出现错误,错误代码及错误截图如下:
//当前窗口可以查询单个商品对应信息,并且可以记录浏览情况,存入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()去排除无效字符,不过事先统一编码,会更有效地避免这一错误。