javaWeb第三天---http协议和会话技术
一、http协议
超文本传输协议,目的是发布和接收html文件
Ⅰ、HTTP协议的作用以及特点
①http是一个客服端和服务端请求和应答的标准(TCP)。客服端向服务器的指定端口发起http请求,应答的服务器上存在一些资源,比如HTML页面和图像。
②请求过程:客户端发送一个请求,建立一个到服务器的TCP连接。HTTP服务器则在那个端口监听客服端发送的请求,一旦接收到请求,返回状态行和相应消息。
③HTTP使用TCP不使用UDP的原因:因为HTTP携带的信息有多条,tcp按顺序组织数据,和错误纠正。
④通过http或者https协议请求的资源由统一资源标识符来标识。
特点:
①基于请求和相应模型的协议
②默认访问端口 80
③灵活
④简单便捷
⑤无连接:http访问每次只处理一个请求
⑥无状态:对于事务处理没有记忆能力。如果以后请求不需要前边的数据,则应答较快。如果需要以前的数据,则需要次次重新传输数据,导致每次传输的数据量变大
二、会话技术
一次会话有多次请求和应答。
①、什么是一次会话?
浏览器第一次发送请求到服务器 ---》浏览器和服务器任何一方断开连接
②、功能
实现在一次会话的多次请求中实现数据共享
Ⅰ、Cookie
概念:这是一项客户端的会话技术,将数据保存在客服端
1、快速入门:
①创建Cookie对象
new Cookie(String name,String value)
②将Cookie传输至客户端(响应cookie对象到浏览器)
resp.addCookie(Cookie cookie);
③获取cookie对象
Cookie[] cookies=req.getCookies();
2、原理
利用http协议的响应头的set-cookie和请求头的cookie完成
3、cookie的注意事项
①、cookie一次可以发送多个
②、浏览器的保存时间
默认:一次会话
持久化:通过setMaxAge(int seconds)
值为正数,就是按指定时间。值为负数,则是默认设置
③cookie在tomcat8之前不能存储中文
④cookie的共享问题:
默认:在当前项目目录下
例如:/javaWeb01
设置可以在多个项目中共享,通过setPath()方法设置虚拟目录。
例如:setPath("/"),就是在使用“/”开头访问的所有路径都可以共享到
4、特点
①存储在浏览器
②每个cookie的大小不超过4k,每个域名下的cookie不能超过20个
5、代码举例
@WebServlet("/cookie1") public class Cookie1 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset=utf-8"); String str="sdfsf"; /*// 将str这个字符转化为以utf-8的格式编码,是java.net包下的,一般在字符串中有特殊字符时使用 String encode = URLEncoder.encode(str, "utf-8");*/ /*// 将目标数据从utf-8编码状态转成字符串 URLDecoder.decode()*/ Cookie userID = new Cookie("userID", "123456"); // 设置cookie的保存时间 userID.setMaxAge(180); // 设置虚拟路径 userID.setPath("/"); // 将cookie相应到浏览器 resp.addCookie(userID); } }
@WebServlet("/cookie2") public class Cookie2 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { req.setCharacterEncoding("utf-8"); resp.setContentType("text/html;charset=utf-8"); // 获取cookie的值 Cookie[] cookies = req.getCookies(); for (Cookie cookie : cookies) { System.out.println(cookie.getName()+":"+cookie.getValue()); } } }
Ⅱ、Session
1、概念
用于让一次会话的多次请求的数据实现共享,数据存储在服务器端的session对象中。
2、获得对象
request.getSession()---->getSession() 中的默认参数是true,当没有session对象时,会创建一个session对象
-----> 如果默认参数为false,当没有已经存在的session对象时,会返回 空
3、操作session对象
session.setAttribute(String name,Object value):给session对象赋值
session.getAttribute(String name):获取session对象的值
session.removeAttribute(String name):移除session对象的数据
4、session的原理
session的实现依赖于cookie。
实现过程:当客户端发送请求到服务器,通过request.getSession()创建session对象,在服务器端会开辟一块内存来存放这个session对象,这个session对象有一个sessionID,相当于地址值。然后服务器端会将这个sessionID响应到客户端,存放在cookie中。当进行下次请求时,会带着这个sessionID到服务器寻找属于这个访问的session,处理完后,服务器给出响应。
5、session的注意事项
当客户端关闭后再打开,前后两次的session不是同一个,因为客户端关闭后,服务器内容中和这个客服端对应的session也会被销毁。
如果要保证前后访问是同一个:
Cookie cookie=new Cookie("JSESSIONID",session.getId());
cookie.setMaxAge(60*50);//这个时间根据个人需要设置
6、session的失效时间
①服务器关闭
②通过invalidate(),手动销毁
③默认存活时间30分钟 (tomcat-->conf--->web.xml--->session-config)
7、session特点
①session中可以存储任何类型的数据,任何大小
②session是实现一个会话不同请求中的数据共享,再服务器端。
8、示例代码
@WebServlet("/session1") public class SessionDemo1 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 获取session对象 HttpSession session = req.getSession(); // 给session对象赋值 session.setAttribute("msg","d"); // 获取session的id String id = session.getId(); System.out.println(id); } }
@WebServlet("/session2") public class SessionDemo2 extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(); Object msg = session.getAttribute("msg"); System.out.println(msg); } }