Cookie
可以用来记录多个请求之间的联系,保存服务器的状态
实现一个记住用户名的功能
1 创建Cookie
//1.获取表单参数
// 表单默认是get方式,如果是get方式可以不用设置编码格式,中英文都可以,但如果是post方式,就要设置编码格式,
//否则会出现乱码
req.setCharacterEncoding("utf-8");
//获取表单提交的name值
String na = req.getParameter("name");
//在控制台打印出来,方便观察,无其他效果
System.out.println(na);
/*2.进行编码,cookie存入中文,需要编码成URLEncoder.encode,有些版本不需编码,考虑到通用性 ,编码成cookie认可的格式 */
String encode = URLEncoder.encode(na, "utf-8");
//打印出编码后的效果,如果是英文则原样不变,如果是中文将变成一串编码
System.out.println(encode);
//3.根据编码后的结果创建cookie
Cookie name = new Cookie("name", encode);
//没有指定时间时间的cookie,称为会话cookies,浏览器关闭就会删除,以秒为单位,3600即一小时
name.setMaxAge(3600);
//传给浏览器的cookie
resp.addCookie(name);
//浏览器页面提示,编码是为了浏览器能识别接受的中文信息
resp.setContentType("text/html;charset=utf-8" );
resp.getWriter().println("<html><body>浏览器接收到cookie</body></html>");
//解码,变为浏览器可以识别的编码格式
//如果要将获取的值通过jsp展示给页面,需要解码,因为上面编码了,如果英文没有经过编码
//或者某些版本对中文没有要求可以存入,不需要写编码这一步,当然这里也就自然不需要解码
String decode = URLDecoder.decode(String.valueOf(name.getValue()), "utf-8");
//将解码的值放入作用域
req.setAttribute("name",decode);
//请求转发,到Cookie1.jsp
req.getRequestDispatcher("Cookie1.jsp").forward(req,resp);
}
}
Cookie1.jsp中如下
<%--如果是值是英文或者中文可以不用编码的版本,也就不需要解码,就可以直接在jsp中获取,无需请求转发,因为cookie存储在浏览器中--%>
${cookie.name.value}
<%--通过el表达式获取作用域的值展示给浏览器--%>
${name}
2 获取cookie
Cookie[] cookies = request.getCookies(); // 获取请求中所有的cookie
@WebServlet(urlPatterns = "/s2")
public class Cookie2 extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Cookie[] cookies = req.getCookies();
for (Cookie cookie : cookies) {
System.out.println(cookie.getName() + " " + URLDecoder.decode(cookie.getValue(),"UTF-8" ));
}
}
}
3 中文问题
URLEncoder.encode(中文, “utf-8”); // 将编码后的中文存入cookie的值
URLDecoder.decode(“编码后的内容”, “utf-8”); // 把编码后的内容进行解码
4 el表达式获取cookie值
el的语法:
${cookie.cookie的名称.value}
也可以通过表达式 :<%=“需要传的值”%>来展示给浏览器,如果需要解码,提前完成将最终的值传入
Cookie1.jsp中如下
<%--如果是值是英文或者中文可以不用编码的版本,也就不需要解码,就可以直接在jsp中获取,无需请求转发,因为cookie存储在浏览器中--%>
${cookie.name.value}
<%--通过el表达式获取作用域的值展示给浏览器--%>
${name}
5 cookie的限制
浏览器每个域名下能够包含30~50个cookie
每个cookie的长度大约是4k左右
6.cookie心得:
cookie安全性差,可以通过浏览器查询到存入的cookie值,cookie值只在当前浏览器有效。并且关闭浏览器后存入cookie值自动清除 ,除非setMaxAge(时间),如本节第一个例子中设置为3600秒,即一个小时后才会清除cookie值,这样关闭浏览器后重新打开依然有效。后面我们还会接触session,存储在服务器端,安全性更高。