Servlet--状态管理、cookie、session、servletContext
一、Servlet状态管理
1.为什么要进行状态管理?
·HTTP协议本身是无状态的,不能保存客户端与服务器端交互的数据
·当用户发送新的请求时,无法判定是否与上一次请求有联系
·对于用户的相同请求,必须重复多次提交,用户体验差(例如:每次登录都要输入账密等信息)
2.什么是状态管理
为了解决以上存在的问题,将浏览器与服务器之间的多次交互所涉及的数据(即状态)保存下来,并对其进行管理。
3.状态管理分类
客户端状态管理:代表cookie,将浏览器与服务器交互数据保存在客户端
服务器状态管理:代表session和application,将状态保存在服务器端
二、Cookie
1.什么是cookie?
cookie是浏览器在访问web服务器的某个资源时,由web服务器在HTTP响应头中附带传送给浏览器的一小段数据
浏览器保存了cookie后,在以后每次访问该web服务器时,都会在HTTP请求头中将这个cookie回传给web服务器
2.cookie执行流程
1)浏览器第一次访问web服务器
2)web服务器中创建cookie,并在响应头中携带cookie给浏览器
3)浏览器收到web服务器响应的cooike后存储
4)第二次访问web服务器时,携带cookie
5)web服务器收到请求后,从请求中查找cookie,存在就获取,并执行操作
3.cookie的创建与使用
1)创建cookie对象
Cookie cookie = new Cookie(String name,String value);
2)设置cookie路径(只有设置路径下的资源共享,访问;默认是当前项目下所有资源都可以访问)
cookie.setPath()
3)设置cookie生命周期
cookie.setMaxAge(int n) (n的取值(单位秒):0代表不存储;小于0代表临时存储,浏览器关闭时无效;大于0代表设置的有效期
4)将cookie添加到响应中
response.addCookie(cookie);
5)获取cookie
Cookie[] cookies=request.getCookies();
5)修改cookie(确保cookie名称和路径与之前一致,新的cookie的值才会覆盖之前的)
Cookie cookie1 = new Cookie(String name,String value);
cookie1.setPath()
cookie1.setMaxAge(int n) //有效期也会覆盖之前的
response.addCookie(cookie1);
4.cookie编码与解码
1)cookie默认不支持中文,只能包含ASCII字符,所以使用cookie存储中文,需要对Unicode字符进行编码,否则会出现乱码
·编码可以使用java.net.URLEncoder类的encode(String str,String encoding)方法
·解码可以使用java.net.URLDecoder类的decode(String str,String encoding)方法
2)创建带中文的cookie
Cookie cookie = new Cookie(
URLEncoder.encode("姓名",“utf-8”),
URLEncoder.encode("张三"),“utf-8”)
);
response.addCookie(cookie)
Cookie[] cookies =request.getCookies();
if(cookies != null){
for(Cookie cookie: cookies){
System.out.println(
URLDecoder.decode(cookie.getName(),"utf-8")+":"+
URLDecoder.decode(cookie.getValue(),"utf-8")
);
}
}
5.cookie优点与缺点
优点
1)可以配置到期规则
2)简单性:cookie是一种基于文本的轻量结构,包含简单的键值对
3)数据持久型:cookie默认在过期之前是可以一直保存在浏览器上的
缺点
1)大小受到限制:大多数浏览器对cookie的大小有4k,8k字节的限制
2)用户配置为禁用:有些用户禁用了浏览器或者客户端接收cookie
3)潜在风险:cookie可能会被篡改,对安全性造成潜在风险或者导致依赖与Cookie的应用程序失败
三、Session
1.什么是Session
session用于记录一段时间内(一个会话中),单个客户端与web服务器多次交互过程中的数据
原理解析:
服务器会为每一次会话分配一个session对象
同一个浏览器发起的多次请求,同属于一次会话(session)
首次使用到session时,服务器会自动创建session,并创建cookie存储sessionID发送给客户端
应用场景:
1.用于管理员权限验证
管理员首次登录:
·获取请求数据
·调用业务方法
·判断查询结果,如果不为空,则将管理员信息保存到session域中;如果为空,则跳转登录页面
管理员业务操作:
·从session中获取管理员登录信息
·判断,如果管理员登录信息为空,则跳转登录页面;如管理员信息不为空,表示已登录,则调用业务方法,转发跳转jsp显示结果
2.用于验证码的验证
2.Session作为域对象
session作用域:拥有存储数据的空间,作用范围是一次会话有效
·一次会话是:使用同一个浏览器发送的多次请求,一旦浏览器关闭,则结束会话
·可以将数据存入session中,在同一次会话中的任意位置获取数据
·可以传递任意类型数据(基本类型数据,对象,集合,数组等)
3.Session的使用
HttpSession session = request.getSession(); 获取session对象
session.getId() 获取session的唯一标记
session.setAttribuet(String name,Object value) 将数据存储到session域中
Object value = session.getAttribute(String name); 获取session中存储的数据
session.removeAttribute(String name); 将name对应的值从session中移除
4.Session的生命周期
开始:浏览器第一次请求服务器端时,由服务器端创建session对象
结束:浏览器关闭、session超时、手动销毁
session.setMaxInactiveInterval(seconds) 设置最大有效时间(单位:秒)
session.invalidate() 手工销毁,应用场景:登录退出、注销
四、浏览器禁用cookie的解决方案
1.浏览器禁用cookie导致的后果
服务器在默认情况下,会使用Cookie的方式将sessionID发送给浏览器,如果用户禁用cookie,则sessionID无法发送给浏览器保存
2.解决方案:重写URL
浏览器在访问服务器上某个地址时,在原来的地址上增加sessionID
String newUrl = response.encodeRedirectURL(String url) 重写url
String newUrl = response.encodeRedirectURL(String url);
System.out.println(newUrl);
response.sendRedirect(newUrl);
五、ServletContext
1.什么是ServletContext
·全局对象,有自己的作用域,对应一个tomcat中的web应用(即在整个web应用中可以共享数据)
·当web服务器启动时,会为每一个web应用程序创建一个servletContext域对象,当服务器关闭时销毁
应用场景:统计当前项目的访问次数
2.ServletContext使用
1)获取ServletContext对象
GenericServlet提供了getServletContext()方法 (推荐)this.getServletContext()
HttpServletRequest提供了getServletContext()方法
HttpSession提供了getServletContext()方法
2)获取项目真实路径
servletContext.getRealPath("/");
3)获取项目上下文路径
servletContext.getContextPath();
request.getContextPath();
4)存储数据
servletContext.setAttribute(String name,Object value);
5)获取数据
servletContext.getAttribute(String name);
6)移除数据
servletContext.removeAttribute(String name);
六、request、session、servletContext比较
request是一次请求有效,请求改变,则request改变(用于存储临时数据)
session是一次会话有效,浏览器改变,则session改变(用户保存登录状态,权限验证等)
servletContext是服务器启动开始,到服务器关闭之前有效,作用范围是整个web容器(全局访问次数统计等)
与poppy一起学习