Cookie技术: 会话数据保存在浏览器客户端。
Session技术: 会话数据保存在服务器端。(域对象)
Cookie技术
作用:解决了发送的不同请求的数据共享问题
使用:
Cookie的创建和存储
//创建Cookie对象
Cookie c=new Cookie(String name, String value);
//设置cookie(可选)
//设置有效期
c.setMaxAge(int seconds);
//设置有效路径
c.setPath(String uri)
//响应Cookie信息给客户端
resp.addCookie(c);
Cookie的获取
//获取Cookie信息数组
Cookie[] cks=req.getCookies();
//遍历数组获取Cookie信息
使用for循环遍历即可,示例:
if(cks!=null){
for(Cookie c:cks){
String name=c.getName();
String value=c.getValue();
System.out.println(name+":"+value);
}
}
注意:
一个Cookie对象存储一条数据。多条数据,可以多创建几个Cookie对象进行存储。
特点:
浏览器端的数据存储技术。
存储的数据声明在服务器端。
临时存储:存储在浏览器的运行内存中,浏览器关闭即失效。
定时存储:设置了Cookie的有效期,存储在客户端的硬盘中,在有效期内符合路径要求的请求都会附带该信息。
默认cookie信息存储好之后,每次请求都会附带,除非设置有效路径
1 protected void service(HttpServletRequest req, HttpServletResponse resp) 2 throws ServletException, IOException { 3 //设置请求编码格式 4 req.setCharacterEncoding("utf-8"); 5 //设置响应编码格式 6 resp.setContentType("text/html;charset=utf-8"); 7 //获取请求信息 8 9 //处理请求信息 10 //响应处理结果 11 //使用Cookie进行浏览器端的数据存储 12 //创建Cookie对象 13 Cookie c=new Cookie("mouse", "thinkpad"); 14 Cookie c2=new Cookie("key", "bjsxt"); 15 //设置Cookie 16 //设置Cookie的有效期 17 c2.setMaxAge(3*24*3600); 18 //设置有效路径 19 c2.setPath("/cookie/gc"); 20 //响应Cookie信息 21 resp.addCookie(c); 22 resp.addCookie(c2); 23 //直接响应 24 resp.getWriter().write("Cookie学习"); 25 //请求转发 26 //重定向 27 }
Session技术
一个用户的不同请求处理的数据共享怎么办?
解决:
使用session技术
原理:
特点:
存储在服务器端
服务器进行创建
依赖Cookie技术
一次会话
默认存储时间是30分钟
作用:
解决了一个用户不同请求处理的数据共享问题
使用:
创建session对象/获取session对象
HttpSession hs=req.getSession();
如果请求中拥有session的标识符也就是JSESSIONID,则返回其对应的session对象
如果请求中没有session的标识符也就是JSESSIONID,则创建新的session对象,并将其JSESSIONID作为cookie数据存储到浏览器内存中。
如果session对象是失效了,也会重新创建一个session对象,并将其JSESSIONID存储在浏览器内存中。
设置session存储时间
hs.setMaxInactiveInterval(int seconds);以秒为单位
注意:
在指定的时间内session对象没有被使用则销毁,如果使用了则重新计时。
全局设置session的有效时长:
在web.xml文件中,设置
<!-- 配置session的有效时长:以分为单位 -->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
hs.invalidate();
存储和获取数据
存储:hs.setAttribute(String name,Object value);
获取:hs.getAttribute(String name) 返回的数据类型为Object
注意:
存储的动作和取出的动作发生在不同的请求中,但是存储要先于取出执行。
使用时机:
一般用户在登陆web项目时会将用户的个人信息存储到Sesion中,供该用户的其他请求使用。
总结:
session解决了一个用户的不同请求的数据共享问题,只要在JSESSIONID不失效和session对象不失效的情况下。用户的任意请求在处理时都能获取到同一个session对象。
作用域:
一次会话
在JSESSIONID和SESSION对象不失效的情况下为整个项目内。
session失效处理:
将用户请求中的JSESSIONID和后台获取到的SESSION对象的JSESSIONID进行比对,如果一致则session没有失效,如果不一致则证明session失效了。重定向到登录页面,让用户重新登录。
注意:
JSESSIONID存储在了Cookie的临时存储空间中,浏览器关闭即失效。
1 protected void service(HttpServletRequest req, HttpServletResponse resp) 2 throws ServletException, IOException { 3 //设置请求编码格式 4 req.setCharacterEncoding("utf-8"); 5 //设置响应编码格式 6 resp.setContentType("text/html;charset=utf-8"); 7 //获取请求信息 8 String name="张三"; 9 //处理请求信息 10 //创建session对象 11 HttpSession hs=req.getSession(); 12 //设置session的存储时间 13 //hs.setMaxInactiveInterval(5); 14 System.out.println(hs.getId()); 15 //设置session强制失效 16 //hs.invalidate(); 17 //存储数据 18 hs.setAttribute("name",name); 19 //响应处理结果 20 //直接响应 21 resp.getWriter().write("session学习"); 22 //请求转发 23 //重定向 24 }
1 protected void service(HttpServletRequest req, HttpServletResponse resp) 2 throws ServletException, IOException { 3 HttpSession hs=req.getSession(); 4 System.out.println("SessionServlet2.service()"+hs.getAttribute("name")); 5 }
cookie特点:
1)会话数据保存在浏览器端
2)会话数据只能是字符串类型,不能保存中文的
3)会话数据容量有限制,一个cookie不能超过4kb,一个站点20个cookie
4)不适合存在敏感数据,数据存放不安全。
session特点:
1)会话数据保存在服务器端
2)会话数据任意类型
3)会话数据容量无限制
4)相对安全
ServletContext对象(Servlet上下文对象)
问题:
不同的用户使用相同的数据
解决:
ServletContext对象
特点:
服务器创建
用户共享
一个项目只有一个
作用域:
整个项目内
生命周期:
服务器启动到服务器关闭
使用:
获取ServletContext对象
//第一种方式:
ServletContext sc=this.getServletContext();
//第二种方式:
ServletContext sc2=this.getServletConfig().getServletContext();
//第三种方式:
ServletContext sc3=req.getSession().getServletContext();
使用ServletContext对象完成数据共享
//数据存储
sc.setAttribute(String name, Object value);
//数据获取
sc.getAttribute("str") 返回的是Object类型
注意:
不同的用户可以给ServletContext对象进行数据的存取。
获取的数据不存在返回null。
获取项目中web.xml文件中的全局配置数据
sc.getInitParameter(String name); 根据键的名字返回web.xml中配置的全局数据的值,返回String类型。
如果数据不存在返回null。
sc.getInitParameterNames();返回键名的枚举
配置方式:注意一组<context-param>标签只能存储一组键值对数据,多组可以声明多个 <context-param>进行存储。
在<servlet>上,在<web-app>下:
<context-param>
<param-name>name</param-name>
<param-value>zhangsan</param-value>
</context-param>
作用:将静态数据和代码进行解耦。
获取web应用的上下文路径
String path=sc.getContextPath();
获取web应用上下路径。也就是部署到tomcat服务器上运行的web应用名称。
例:重定向:resp.sendRedirect("/login/main"); 写成:resp.sendRedirect(sc.getContextPath()+"/main");
获取项目webroot下的资源的绝对路径。
String path=sc.getRealPath(String path);
获取的路径为项目根目录,path参数为项目根目录中的路径
获取webroot下的资源的流对象
InputStream is = sc.getResourceAsStream(String path);
注意:
此种方式只能获取项目根目录下的资源流对象,class文件的流对象需要使用类加载器获取。
path参数为项目根目录中的路径
获取webroot下的资源的URL
URL url = sc.getResource(String path);
能获取一个URL,不能构造输入流。
1 protected void service(HttpServletRequest req, HttpServletResponse resp) 2 throws ServletException, IOException { 3 //获取ServletContext对象 4 //第一种方式: 5 ServletContext sc=this.getServletContext(); 6 //第二种方式: 7 ServletContext sc2=this.getServletConfig().getServletContext(); 8 //第三种方式: 9 ServletContext sc3=req.getSession().getServletContext(); 10 System.out.println(sc==sc2); 11 System.out.println(sc==sc3); 12 //使用ServletContext对象完成数据共享 13 //数据存储 14 sc.setAttribute("str", "ServletContext对象学习"); 15 //获取项目web.xml的全局配置数据 16 String str = sc.getInitParameter("name2"); 17 System.out.println("全局配置参数:"+str); 18 //获取项目根目录下的资源的绝对路径 19 //String path="D:\\apache-tomcat-7.0.56\\webapps\\sc\\doc\\1.txt"; 20 String path=sc.getRealPath("/doc/1.txt"); 21 System.out.println(path); 22 //获取项目根目录下资源的流对象 23 InputStream is = sc.getResourceAsStream("/doc/1.txt"); 24 25 }
1 protected void service(HttpServletRequest req, HttpServletResponse resp) 2 throws ServletException, IOException { 3 //创建ServletContext对象 4 ServletContext sc=this.getServletContext(); 5 //获取数据 6 System.out.println("ServletContextServlet2.service()"+sc.getAttribute("str")); 7 }
ServletConfig对象
问题:
如何获取在web.xml中给每个servlet单独配置的数据呢?
解决:
使用ServletConfig对象
注意:ServletConfig对象是在创建完servlet对象之后,被创建出来。然后通过有参数的init方法传递到servlet中。 一个网站中存在多个ServletConfig对象,一个ServletConfig对象就封存了一个Servlet的配置信息。
使用:
获取ServletConfig对象
获取web.xml中的配置数据
在<servlet>中添加:
<init-param>
<param-name>config</param-name>
<param-value>utf-8</param-value>
</init-param>
1 protected void service(HttpServletRequest req, HttpServletResponse resp) 2 throws ServletException, IOException { 3 //获取ServletConfig对象 4 ServletConfig sc=this.getServletConfig(); 5 //获取web.xml中的配置数据 6 String code=sc.getInitParameter("config"); 7 System.out.println(code); 8 }
web.xml文件使用
作用:
存储项目相关的配置信息,保护 Servlet。解耦一些数据对程序的依赖。
使用位置:
每个 Web 项目中
Tomcat 服务器中(在服务器目录 conf 目录中)
区别:
Web 项目下的 web.xml 文件为局部配置,针对本项目的位置。
Tomcat 下的 web.xml 文件为全局配置,配置公共信息。
内容(核心组件):
全局上下文配置(全局配置参数)
Servlet 配置
过滤器配置
监听器配置
加载顺序:
Web 容器会按 ServletContext -> context-param -> listener ->filter-> servlet 这个顺序加载组件,这些元素可配置在 web.xml文件中的任意位置。
加载时机:
服务器启动时。
server.xml文件使用
Server.xml 文件核心组件:
<Server> <Service> <Connector/> <Connector/> <Engine> <Host> <Context/> </Host> </Engine> </Service> </Server>
热部署: <Context path="/Pet" reloadable="true" docBase="F:/PetWeb" />
path: 项目访问路径
docBase: 项目路径。/开头的是实际路径,没有/开头的为相对路径,相对于webapps
reloadable: 开启热更新,热部署