产生的问题:
在系统用户管理中,录入了一个用户名为中文汉字的用户(“测试”),在用此用户登录系统时,登录失败。
在后台中报错信息如下:
问题根源:cookie存取中文字符需要进行转码和解码
现在来看代码:在用户登录之前进行信息校验并保存用户登录的信息:
Cookie cookie = new Cookie("JEECG_LOGIN_USER_DEPART" + user.getUserName() + "_" + req.getContextPath(), currentDepart.getId()); //设置cookie有效期为一个月 cookie.setMaxAge(3600*24*30); response.addCookie(cookie);
代码中的user.getUserName()值为汉字,在此处就会报错。
正确的写法如下:
try { Cookie cookie = new Cookie("JEECG_LOGIN_USER_DEPART" + java.net.URLEncoder.encode(user.getUserName(),"utf-8") + "_" + req.getContextPath(), currentDepart.getId()); //设置cookie有效期为一个月 cookie.setMaxAge(3600*24*30); response.addCookie(cookie); } catch (UnsupportedEncodingException e) { // TODO Auto-generated catch block e.printStackTrace(); }
需要对中文进行编码(java.net.URLEncoder.encode(user.getUserName(),"utf-8"))
这是在cookie里面存汉字,那如何取出使用呢?
代码如下:
1 try { 2 Cookie[] cookies = req.getCookies(); 3 for (Cookie cookie : cookies) { 4 if (cookie == null || StringUtils.isEmpty(cookie.getName())) { 5 continue; 6 } 7 //cookie解码 8 if (URLDecoder.decode(cookie.getName(),"utf-8").equalsIgnoreCase("JEECG_LOGIN_USER_DEPART" + user.getUserName() + "_" + req.getContextPath())) { 9 cookieDepartId = cookie.getValue(); 10 break; 11 } 12 } 13 } catch (Exception e) { 14 }
在第8行代码展示的就是对cookie里面的值取用时应该先进行解码。
最终中文用户名登录成功!
备注:在cookie里面含有空格时也会报错,可以试着编码转码来解决一下,或者.trim()进行处理一下。
参考文档:https://blog.csdn.net/lskyo1122/article/details/60963052
----文中如有错误,欢迎提出,以便及时更正,共同进步!------