Reponse#
响应信息格式如下:#
HTTP/1.1 200 OK //响应行 --------------------------------------- 响应头 // 服务器的类型 Server: server-name //服务端告诉客户端,自己推送给它的数据的编码格式(浏览器根据指定的类型进行解码) Content-Type: text/html;charset=utf-8 // 响应内容的长度 Content-Length: XXX // 响应日期 Date: XXX //服务器告诉浏览器用什么格式打开响应体数据, 默认是in-line 表示在当前页面中打开, attachment(文件下载) Content-disposition: in-line ---------------------------------------- (响应空行) ---------------------------------------- XXX // 响应体
常用方法#
Response对象就是用来设置响应消息的对象
- 设置响应行
// 格式: HTTP/1.1 200 ok setStatus(int status);
- 设置响应头
setHeader(String name, String value);
- 设置响应体
// 0 在往客户端写中文前先设置编码 response.setContentType("text/html;charset=utf-8"); // 1. 获取到输出流(字节流/字符流) // 2. 往客户端写 response.getWriter().write("XXXXXXX");
- 重定向
// 实现,从 AServlet 重定向到BServlet // 两步实现: 重定向 // 设置状态码 / 响应头 reponse.setStatus(302); response.setHeader("location","/项目路径/serlet-url-pattern"); // 单行代理实现重定向 response.sendRedirect("/项目路径/serlet-url-pattern");
特点:
- 重定向: 浏览器地址栏路径改变了
- 重定向: 可以请求其他服务器
- 重定向: 实际上发起了两次请求 (不能使用request域共享数据)
因为我们让浏览器发送了两次请求, 因此重定向的路径中包含 项目路径
Cookie#
常用api#
客户端会话技术,将数据保存在浏览器本地, 下一次访问时会携带着cookie
- 创建cookie,绑定数据
new Cookie(String name,String value)
- 发送cookie
response.addCookie(Cookie cookie);
- 获取解析cookie
Cookie [] cookies = request.getCookies();
- 一次发送多个cookie
Cookie c1 = new Cookie(String name,String value) Cookie c2 =new Cookie(String name,String value) reponse.addCookie(c1); reponse.addCookie(c2);
- cookie的生命周期
默认cookie存储在浏览器内存中,一旦浏览器关闭,cookie销毁
设置cookie的生命周期
setMaxAge(int seconds); seconds 为存活时间, 正数: 表示以文件的形式进行持久化,默认单位 s 负数: 表示仅仅存在于内存中 零: 表示让浏览器删除cookie
- cookie存储中文
tomcat8之前,cookie不支持中文,Tomcat8之后cookie支持中文
tomcat8之前需要进行转码,一般采用URL编码
- cookie获取的范围
默认情况下:在一个tomcat中的部署的多个web项目之间cookie是不能共享的
但是可以通过下面的方法设置更大路径,实现想要的效果
setPath(String path); // 默认是当前的虚拟目录 // 可以设置成下面这样 setPath("/"); // 默认是当前的虚拟目录
跨域tomcat之间cookie共享使用-- 根据域名划分
setDomain(String path); // 只要一级域名相同,则多个服务器之间共享 cookie
特点:#
- 存储在浏览器,不安全
- 浏览器对单个cookie大小(一般都在4kb),对同一个域名下的cookie总数也有限制(一般20个以内)
小场景:#
服务器,浏览器协作的流程: 比如登录: 用户通过浏览器往服务端发送登录请求,服务端验证用户名密码,通过后往客户端的发送cookie, 其实是设置了响应头set-cookie=XXX, 浏览器碰到这种响应头,就把这个响应体缓存在本地,再次请求这个网站时,会自动携带这个请求头cookie=XXX , 后端通过解析用户发送过来的cookie,可以判断当前请求的用户是否是合法的
Session#
服务端会话技术,在一次会话中多次请求共享数据,将数据保存在服务端的对象--HttpSession
session也是域对象
常用API#
- 获取session
HttpSession session = request.getSession();
- 使用session
setAttribute(String name,Object obj); getAttribute(String name); romoveAttribute(String name);
如何确保多次会话中,多次获取到的session是同一个#
- 用户通过浏览器向服务端发送请求
- 服务端验证用户的信息,通过验证后,如果没有当前的session就为用户创建session(每个session都有唯一的id),创建cookie,给客户端返回相应
set-coolkie:JSESSIONID=shdfiuhduifha
- 用户再次访问服务端,浏览器会自动携带上请求头
cookie:JSESSIONID=shdfiuhduifha
- 服务器解析cookie携带的
JSESSIONID=shdfiuhduifha
便可以找出唯一的session
细节#
- 客户端关闭,服务端不关闭,两次获取到的session一样吗?
- session是依赖cookie的,客户端关闭,cookie被干掉了,也就是说本次会话也就结束了,后端的session将被干掉
- 但是如果我们发送给浏览器一个可以存活很长时间的cookie,再次打开浏览器访问后端,session还是同一个
- 客户端不关闭,服务端关闭,两次获取到的session一样吗?
- 服务器都没了,session肯定被干掉了,session肯定不一样
- 补救:钝化 tomcat在服务器正常关闭前,将session序列化持久化到磁盘上
- 补救:活化 tomcat在服务器启动时,将session重新加载进内存
idea中可以成功完成钝化,但是不能完成活化
- session失效时间
- 服务器关闭
- 使用api,自动关闭
invalidate()
- session默认的失效时间30分钟
过期时间可以在Tomcat中的配置文件目录下的web.xml中配置
<session-config> <session-timeout>30</session-timeout> </session-config>
特点:#
- session用于存储一次会话的多次请求数据,存储在服务端
- session可以存储任意类型的数据没有大小限制