1.http协议
http协议也叫作超文本传输协议,定义了浏览器向怎样向服务器请求资源和服务器怎样将资源传给浏览器。http协议是面向事务的应用层协议,是万维网能够传递资源的可靠保障。
目前http协议有1.0和1.1两个版本。
http协议的组成可以分为两部分,分别为http请求协议和http响应协议,http请求协议定义了浏览器向服务器请求资源的方式和规则,由请求行、请求头、请求体组成,http相应协议定义服务器如何将资源传回浏览器端的规定,包括响应头、响应行、响应体。
http请求行主要包括三个信息,http协议版本、请求资源的方式、请求的资源是什么,其中http协议版本区别是
协议版本:
HTTP/1.0,发送请求,创建一次连接,获得一个web资源,连接断开。
HTTP/1.1,发送请求,创建一次连接,获得多个web资源,保持连接。
请求头代表着客户端发送给浏览器端的一些信息,用键值对表示,比如客户端浏览器使用的语言,是否使用cookie技术,连接状态是什么等等。
常见请求头 | 描述 (红色掌握,其他了解) |
Referer | 浏览器通知服务器,当前请求来自何处。如果是直接访问,则不会有这个头。常用于:防盗链 |
If-Modified-Since | 浏览器通知服务器,本地缓存的最后变更时间。与另一个响应头组合控制浏览器页面的缓存。 |
Cookie | 与会话有关技术,用于存放浏览器缓存的cookie信息。 |
User-Agent | 浏览器通知服务器,客户端浏览器与操作系统相关信息 |
Connection | 保持连接状态。Keep-Alive 连接中,close 已关闭 |
Host | 请求的服务器主机名 |
Content-Length | 请求体的长度 |
Content-Type | 如果是POST请求,会有这个头,默认值为application/x-www-form-urlencoded,表示请求体内容使用url编码 |
Accept: | 浏览器可支持的MIME类型。文件类型的一种描述方式。 MIME格式:大类型/小类型[;参数] 例如: text/html ,html文件 text/css,css文件 text/javascript,js文件 image/*,所有图片文件 |
Accept-Encoding | 浏览器通知服务器,浏览器支持的数据压缩格式。如:GZIP压缩 |
Accept-Language | 浏览器通知服务器,浏览器支持的语言。各国语言(国际化i18n) |
响应信息:
Location | 指定响应的路径,需要与状态码302配合使用,完成跳转。 |
Content-Type | 响应正文的类型(MIME类型) 取值:text/html;charset=UTF-8 |
Content-Disposition | 通过浏览器以下载方式解析正文 取值:attachment;filename=xx.zip |
Set-Cookie | 与会话相关技术。服务器向浏览器写入cookie |
Content-Encoding | 服务器使用的压缩格式 取值:gzip |
Content-length | 响应正文的长度 |
Refresh | 定时刷新,格式:秒数;url=路径。url可省略,默认值为当前页。 取值:3;url=www.itcast.cn //三秒刷新页面到www.itcast.cn |
Server | 指的是服务器名称,默认值:Apache-Coyote/1.1。可以通过conf/server.xml配置进行修改。<Connector port="8080" ... server="itcast"/> |
Last-Modified | 服务器通知浏览器,文件的最后修改时间。与If-Modified-Since一起使用。 |
至于请求体,如果我们请求的方式是get,那么我们请求资源时的参数就会出现在url后面,如果是post,参数就出现在请求体中。
http响应协议的响应行包括协议版本和状态码,不同的状态码代表不同的信息。常见的状态码有404,500,200,304。
响应头将服务器端的信息传递给浏览器,如上所示。
响应体:
响应体是服务器回写给客户端的页面正文,浏览器将正文加载到内存,然后解析渲染 显示页面内容
2.HttpServletResponse和HttpServletRequest对象
HttpServletRequest和HttpServletResponse分别代表资源请求和资源响应对象。HttpServletRequest对象代表客户端的请求,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都会封装在这个对象中,通过这个对象提供的方法,可以获得客户端的所有信息。HttpServletResponse则可以获得服务器端的信息。
Requset常用方法:
1.获取客户端信息 getRequestUrl();
2.获得客户机请求头getHeader();
3.获得客户端的参数getParameter(String name);
Request接收表单中文参数乱码问题,之所以会产生乱码,是因为浏览器的编码方式和服务器编码方式不一样导致的,因此解决方式是在浏览器和服务器中设置一个统一的编码,之后就按照统一的编码进行传输,客户端一般以UTF-8编码将表单数据提交到服务器,因此服务器要设置以UTF-8编码方式进行接收,方法为request.setCharacterEncoding("UTF-8")。
请求转发:请求转发是指一个web资源收到客户端的请求后,通知服务器去掉用另一个web资源进行处理。
转发的方式有两种:
1.通过ServletContext的getRequestDispatcher(String path)方法,该方法返回一个RequestDispatcher对象,这个对象调用forward方法实现请求转发。
RequestDispatcher reqDispatcher=this.getServletContext().getRequestDispatcher("/test.jsp"); reqDispatcher.forward(request,reponse);
2.通过request对象提供的getRequestDispatcher(String path)方法,该方法返回一个RequestDispatcher对象,调用其forward方法。
request对象是一个域对象,可以通过Request对象在实现转发时,把Request对象带给其他web资源处理。但是只能作用一次请求中。
转发和重定向的区别:
转发:一个web资源收到客户端请求后,通知服务器调用另外一个web资源进行处理,称之为请求转发307。
重定向:一个web资源收到客户端请求后,通知浏览器调用另外一个web资源进行处理,称之为请求重定向302。
HttpServletReponse对象reponse也有自己常用的方法,再次不在累赘,常见应用向客户端输出数据,可以实现文件下载功能。
下载思路:
1.获取下载路径
2.获取下载的文件名
3.设置响应头控制浏览器以下载形式打开文件
4.获得下载文件流
5.创建缓冲区
6.通过response获得OutputStream流
7.将输入流写到缓冲区
7.将缓冲区的内容输出到客户端
reponse对象能够完成重定向
reponse.sendRedirect("");
3.cookie和session技术
两者都是会话技术,cookie作用在客户端,session作用在服务器端。从打开一个浏览器访问某个站点,到关闭这个浏览器的整个过程,成为一次会话。会话技术就是记录这次会话中客户端的状态与数据的。会话技术帮助区分客户端。
cookie技术:服务器端向浏览器端发送一个cookie,首先创建一个cookie
Cookie cookie = new Cookie(String cookieName,String cookieValue);
向客户端发送cookie
response.addCookie(Cookie cookie);
这样浏览器端就能有一个cookie信息了。服务器端怎样接受cookie哪
1)通过request获得所有的Cookie:
Cookie[] cookies = request.getCookies();
2)遍历Cookie数组,通过Cookie的名称获得我们想要的Cookie
for(Cookie cookie : cookies){
if(cookie.getName().equal(cookieName)){
String cookieValue = cookie.getValue();
}
}
session会话技术
Session技术是将数据存储在服务器端的技术,会为每个客户端都创建一块内存空间 存储客户的数据,但客户端需要每次都携带一个标识ID去服务器中寻找属于自己的内 存空间。所以说Session的实现是基于Cookie,Session需要借助于Cookie存储客 户的唯一性标识JSESSIONID
怎样获得属于本客户端的session对象(内存区域)?
HttpSession session = request.getSession();
对象会创建一个新的Session返回,如果已经有了属于该会话的Session直接将已有 的Session返回(实质就是根据JSESSIONID判断该客户端是否在服务器上已经存在 session了)
怎样向session中存取数据(session也是一个域对象)?
session.setAttribute(String name,Object obj);
session.getAttribute(String name);
session.removeAttribute(String name);
session对象的生命周期?
创建:第一次执行request.getSession()时创建
销毁:
1)服务器(非正常)关闭时
2)session过期/失效(默认30分钟)
问题:时间的起算点 从何时开始计算30分钟?
从不操作服务器端的资源开始计时
可以在工程的web.xml中进行配置
<session-config>
<session-timeout>30</session-timeout>
</session-config>
3)手动销毁session
session.invalidate();
默认在一次会话中,也就是说在,一次会话中任何资源公用一个session对象