25@JSP_day07
一、Cookie
a,创建cookie
Cookie cookie = new Cookie(String name,String value);
response.addCookie(cookie);
b,查询cookie
//如果没有cookie,返回null
Cookie[] cookies = request.getCookies();
String name = cookie.getName()
String value = cookie.getValue();
c, cookie的编码问题
cookie的值只能是ascii字符,如果是非ascii字符(比如中文),需要编码。
String URLEncoder.encode(String str,String code);
String URLDecoder.decode(String str,String code);
d, cookie的生存时间
默认情况下,浏览器会将cookie保存在内存里面,只要浏览器关闭,cookie就会被销毁。
cookie.setMaxAge(int seconds);
seconds > 0 : 浏览器会将cookie保存在硬盘上,如果超过指定的时间(seconds),浏览器会删除该cookie。
seconds < 0 : (默认值),浏览器会将cookie保存在内存里面。
seconds = 0 : 删除cookie。
比如,要删除一个名叫"userprofile"的cookie:
Cookie c = new Cookie("userprofile","");
c.setMaxAge(0);
response.addCookie(c);
e, cookie的路径问题
浏览器在向服务器发请求时,会先比较cookie的路径与要访问的服务器的地址,只有匹配条件的cookie,才会发送给服务器。
匹配条件:
只有要访问的服务器的地址是cookie的路径或者其子路径时,才会将cookie发送给服务器。
e1, cookie有一个默认的路径,等于添加该cookie的组件的路径。
比如 addCookie.jsp创建了一个cookie,addCookie.jsp通过 /web06_3/jsp01/addCookie.jsp来访问,则该cookie的路径就是 /web06_3/jsp01
e2, 可以调用 cookie.setPath(String path)来修改cookie的路径。
cookie.setPath("/appname"); 即appname这个应用下的所有组件都可以访问该cookie。
练习:
写一个Find_Add_CookieServlet,该servlet先查询有没有一个名叫"userprofile"的cookie,如果有,则显示该cookie的值,否则(即找不到该cookie),则创建该cookie( new Cookie("userprofile","user123")。
f, cookie的限制
cookie可以被禁止,也就是说,服务器发送set-cookie消息头,浏览器不保存set-cookie消息头中设置的任何数据。
cookie不安全。
cookie保存的数据量大小有限制(大约4k)。
浏览器在本地大约能保存约300个cookie。
cookie只能保存字符串值。
二、session(会话)
1、什么是session?
浏览器访问服务器时,服务器会创建一个对象(该对象称为session对象,有一个唯一的标识,称为sessionId),接下来,服务器会将sessionId以set-cookie消息头的方式发送给浏览器,浏览器会将这个sessionId保存(内存里)下来。
这样,但浏览器再次访问服务器,会将sessionId发送给服务器,服务器通过sessionId就可以找到之前创建的session对象。
2、获得session对象
方式一:HttpSession session = request.getSession();
request.getSession()等价于request.getSession(true);
方式二:HttpSession session = request.getSession(boolean flag);
当flag = true时:
服务器检查请求中是否包含有sessionId,
如果没有,则创建一个session对象。
如果有,服务器会依据sessionId查找之前创建的session对象,如果找到了,则返回;如果找不到,则创建一个新的session对象。
当flag = false时:
服务器检查请求中是否包含有sessionId,
如果没有,返回null。
如果有,服务器会依据sessionId查找之前创建的session对象,如果找到了,则返回;如果找不到,返回null。
3、session的常用方法
//绑订
session.setAttribute(String name,Object obj);
//依据绑订名,返回绑订值。如果name对应的值不存在,返回null。
Object obj = session.getAttribute(String name);
//解除绑订。
session.removeAttribute(String name);
//返回session对象的sessionId。
String session.getId();
4、session的超时
服务器会将空闲时间过长的session对象删除掉(一般的服务器默认的空闲时间是30分钟)。
1) session.setMaxInactiveInterval(int seconds);
单位是秒。
2)或者也可以通过修改服务器的配置文件来设置超时限制:
tomcat_home/conf/web.xml
<session-config>
<session-timeout>30</session-timeout>
</session-config>
改为配置之后,要重新启动服务器。
建议不要修改,因为修改之后,会影响到所以部署在该服务器上的应用。
5、立即删除session
session.invalidate();
session相关的案例
session验证
对于需要保护的资源(比如main.jsp),添加session.getAttribute(),如果能够取到值(该值是登录成功之后绑订的),则允许访问,否则,重定向到登录页面。
编程:
step1 在登录成功,绑订数据到session:
session.setAttribute("user",user);
step2 在需要受保护的资源当中,添加:
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 Object obj = session.getAttribute("user"); 2 if(obj == null){ 3 response.sendRedirect("login.jsp"); 4 }