文章目录
前言
javaweb有四个域对象,都可以传入值当作存储数据,分别为:
- PageContext : pageConext 存放的数据在当前页面有效。开发时使用较少。
- ServletRequest: request 存放的数据在一次请求(转发)内有效。使用非常多。
- HttpSession: session 存放的数据在一次会话中有效。使用的比较多。如:存放用户的登录信息,购物车功能。
- ServletContext: application 存放的数据在整个应用范围内都有效。因为范围太大,应尽量少用
不支持中文,像Map一样,存储于客户端页面的内容
Cookie的创建
创建cookie对象
Cookie cookie = new Cookie(“key1”,“value1”);
通知客户端保存
resp.addCookie(cookie);
可以一次创建多个,都要加入response才能返回给客户端
Cookie的获取
Cookie[] cookies = req.getCookies();
Cookie的工具类
public class CookieUtils {
//cookie的工具类,寻找指定的cookie
public static Cookie findCookie(String name,Cookie[] cookies){
if(name==null || cookies == null || cookies.length==0) {
return null;
}
for (Cookie cookie : cookies) {
if(name.equals(cookie.getName())){
return cookie;
}
}
return null;
}
}
修改Cookie值
方案一:
1先创建一个要修改的同名的cookie对象
2在构造器中,同时赋予新的Cookie值
3调用rep.addCookie();
Cookie cookie2 = new Cookie("key2","value21");
//通知客户端保存
resp.addCookie(cookie2);
resp.setCharacterEncoding("UTF-8");
resp.getWriter().write("Cookie修改成功");
方案二:
1先查找到需要修改的Cookie对象
2调用setValue()方法赋予新的Cookie值
3调用rep.addCookie();
Cookie cookie3 = CookieUtils.findCookie("key2",req.getCookies());
if (cookie3!=null){
cookie3.setValue("newValue2");
resp.addCookie(cookie3);
}
浏览器查看Cookie
Cookie的生命控制
Cookie的声明控制是指如何管理Cookie什么时候被销毁
setMaxAge()
设置cookie的最大生存时间 秒数单位
- 正数 表示在指定秒数后销毁
- 负数 表示退出浏览器,则销毁(默认是负数)
- 零 表示马上删除cookie
Cookie cookie = new Cookie(“life3600”,“life3600”);
cookie.setMaxAge(3600); //设置存活时间
resp.addCookie(cookie);
Cookie有效路径Path的设置
过滤哪些cookie可以发送给服务器,哪些不发
Path属性是通过请求的地址来进行有效的过滤
满足路径的的浏览器页面才能找到的cookie
Cookie cookie = new Cookie(“path1”,“path1”);
cookie.setPath(req.getContextPath()+"/abc"); //设置路径
resp.addCookie(cookie);
练习:Cookie免用户名登录
贴出servlet内的操作
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String username = req.getParameter("username");
String password = req.getParameter("password");
if("yuan".equals(username)&&("123").equals(password)){
//登录成功
Cookie cookie = new Cookie("username",username);
cookie.setMaxAge(60*60*24*7); //当前cookie一星期内有效
resp.addCookie(cookie);
System.out.println("登陆成功");
}else{
System.out.println("登陆失败");
}
}
Session会话
Cookie是保存在客户端中,而session是保存在服务端
Session创建和获取
Request.getSession()
第一次调用是创建session会话
之后都是获取前面创建好的session对象
IsNew() 判断到底是不是刚创建出来的(新的)
每个会话都有一个身份号码,也就是ID值,而且是唯一的
getId() 得到session的会话id值
protected void createSession(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
HttpSession session = req.getSession(); //创建和获取session会话
boolean isNew = session.isNew(); //判断是否是新创建出来的
String id = session.getId();
resp.setCharacterEncoding("UTF-8");
resp.getWriter().write("得到的session的id值是:"+id+"<br/>");
resp.getWriter().write("得到的session是否是新创建的:"+isNew+"<br/>");
}
数据的存取
protected void set(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
req.getSession().setAttribute("key1","value1");
resp.setCharacterEncoding("UTF-8");
resp.getWriter().write("已经保存了数据");
}
protected void get(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
Object key = req.getSession().getAttribute("key1");
resp.setCharacterEncoding("UTF-8");
resp.getWriter().write("获取的数据是:"+key);
}
生命周期的控制
SetMaxInactiveInteval(int interval)
设置session的超时时间,超过指定的时长,session就会被销毁
- 值为正数时,设定session的超时时长
- 如果值为负数,表示永不超时(极少使用)
GetMaxInactiveInteval(int interval)
获取时长
Invalidate()
让session会话马上销毁
以秒为单位
Session的默认超时时长是:1800秒 = 30分钟
Tomcat的xml文件中设置的,可以修改,最好不要
统一修改session方法如下;
<!--表示当前web工程创建出来的session默认是20分钟超时时长-->
<session-config>
<session-timeout>20</session-timeout>
</session-config>
超时概念*
浏览器与session之间的内幕
问题:
上面说session内的域对象可以设置超时时长来设置什么时候销毁对象,可是session域的说明是关闭服务器的连接则销毁域对象,这两句话有点冲突,到底session内的对象是如何销毁的。
Session技术,底层是基于Cookie技术实现的
Session之所以只有一个对象,是因为第一次客户端请求session对象的时候,服务器会把session的id保存在cookie的value值中,key永远是JSESSIONID。
然后返回给客户端,这样客户端以后每次请求,都会把cookie的内容发送给服务器,服务器就不用再创建新的session对象,而且id是一样的,所以是同一个对象
如果删掉cookie,则会建立新的session对象,不论session对象超时与否
问题回答:
如果session设置24小时,可是我们关闭浏览器,session也会销毁的原因是session的cookie在浏览器关闭的时候被销毁了,说明记录的session对象id值不存在了,就找不到在内存中之前的session域内的东西,需要重新创建一个session对象。