java.lang.IllegalArgumentException: Control character in cookie value or attribute.
问题产生原因
在响应重定向中,在cookie中存入中文,但是服务器其他是servlet解析成乱码,导致了错误Cookie 值在允许的字符中是限制性的。它只允许 URL 安全字符。这包括字母数字字符(a-z、A-Z 和 0-9)和几个词法字符,包括 ,,,和.所有其他字符在Cookie 中无效: .-_.~%
解决
创建cookie的时候用下列的写法防止创建的cookie中存入中文其他servlet读取不出
最好的选择是对这些字符进行 URL 编码。这样,URL 中不允许的每个字符都将在此窗体中进行百分比编码,该格式作为 Cookie 值有效。
因此,创建 Cookie 时执行以下操作:
Cookie cookie = new Cookie("uname", URLEncoder.encode(uname, "UTF-8") );
阅读 Cookie 时,可以执行以下操作:
String value = URLDecoder.decode(cookie.getValue(), "UTF-8");
具体操作代码:
servlet1:创建cookie
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;
public class ServletCookie extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1 设置请求编码格式
req.setCharacterEncoding("utf-8");
//2 设置响应编码格式
resp.setContentType("text/html;charset=utf-8");
//3 获取请求信息
String uname = req.getParameter("uname");
String pwd = req.getParameter("pwd");
//4 处理请求信息
System.out.println(uname+"=="+pwd);
//5 响应处理结果
//5.3 响应重定向
Cookie cookie = new Cookie("uname", URLEncoder.encode(uname, "UTF-8") );
// 发送到客户端存储
// 发送一个响应头, Set-Cookie: computer=dell
resp.addCookie(cookie);
resp.sendRedirect("/cookie2");
}
}
servlet2
public class ServiceCookie2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("utf-8");
resp.setContentType("text/html;charset=utf-8");
System.out.println("这里是Cookie2");
//获取cookie数据
String cook =null;
Cookie[] cookies = req.getCookies();
//输出cookie 数据
for (Cookie cookie : cookies) {
if ("uname".equals(cookie.getName())) {
cook = URLDecoder.decode(cookie.getValue(), "UTF-8");
}
}
System.out.println(cook);
}
}
网站声明:如果转载,请联系本站管理员。否则一切后果自行承担。
添加我为好友,拉您入交流群!
请使用微信扫一扫!