您的位置:首页 > 理论基础 > 计算机网络

http协议、Request和Response、Cookie、HttpSession、JSP

2016-03-17 09:58 555 查看

http协议

* 即超文本传输协议。它规定了浏览器与服务器之间的通讯规则。

    * http是基于请求/响应模式的,所以分为请求协议和响应协议

请求

请求内容就是客户端发送给服务器的数据!

1.        请求格式:

1)        请求首行

2)        请求头

3)        空行

4)        请求体(或称之为请求正文)

2.        请求方法

1)        常见请求方法有GET和POST

2)        在浏览器地址栏中发送请求,以及点击超链接都是GET请求

3)        提交表单可以发送GET请求,以及POST请求

4)        GET请求没有请求体,但空行是存在的

5)        POST请求是存在请求体的

3.        常见请求头

1)        Host:请求的服务器主机名

2)        User-Agent:客户端浏览器与操作系统相关信息

3)        Accept-Encoding:客户端支持的数据压缩格式

4)        Connection:客户端支持的连接方式

5)        Cookie:客户端发送给服务器的“小甜点”,它服务器寄存在客户端的。如果当前访问的服务器没有在客户端寄存东西,那么就不会存在它!

6)        Content-Length:请求体的长度

7)        Referer:当前发出请求的地址

Ø  作用1:统计来源

Ø  作用2:防盗链

响应

1.        响应格式:

1)        响应首行

2)        响应头

3)        空行

4)        响应体(或称之为响应正文)

2.        首行:状态码

响应首行的结构:协议及版本 状态码 状态码说明,例如:HTTP/1.1 200OK

1)        200:请求成功

2)        302:请求重定向

3)        304:请求资源没有改变

4)        404:请求资源不存在,属性客户端错误

5)        500:服务器内部错误

3.        响应头

1)        Content-Type:响应正文的MIME类型

2)        Content-Length:响应正文的长度

3)        Set-Cookie:服务器寄存在客户端的“小甜点”,当客户端再次访问服务器时会把这个“小甜点”还给服务器

4)        通知客户端浏览器不要缓存页面的响应头:

a)        Expires:-1

b)        Cache-Control: no-cache

c)        Pragma: no-cache

5)        自动刷新响应头,浏览器会在3秒钟后自动重定向到传智主页

Refresh: 3;url=http://www.itcast.cn

4.        状态码304

1)        相关头信息

a)        在响应头中:Last-Modified,表示当前资源的最后修改时间;

b)        在请求头中If-Modified-Since,表示缓存资源最后修改时间;

2)        含义:表示访问的资源没有改变。

3)        过程

a)        客户端首次访问服务器的静态资源index.html,服务器会把index.html响应给客户端,而且还会添加一个名为Last-Modified的响应头,它说明了当前index.html的最后修改时间

b)        客户端收到响应后,会把index.html缓存在客户端上,而且还会把Last-Modified缓存起来。

c)        客户端第二次请求index.html时,会添加名为If-Modified-Since的请求头,它的值是上次服务器响应头Last-Modified.

d)        服务器将request中获得的时间,以及当前资源的最后修改时间进行比较

e)        如果相同,说明index.html没有改动过,那么服务器不会发送index.html,而是响应状态码304,即通知客户端资源没有改变,你可以使用自己的缓存

Request和Response

响应:Response   (一个头,两个流)

1.        ServletResponse-->与协议无关的类型

HttpServletResponse-->与http协议相关的类型

2.        发送状态码:

1)        endError(int sc) --> 发送错误状态码,例如404、500

2)        sendError(int sc, String msg)--> 也是发送错误状态码,还可以带一个错误信息!

3)        setStatus(int sc) --> 发送成功的状态码,可以用来发送302

3.        设置响应头:

1)        单值头:setHeader(String name,String value)

2)        多值头:addHeader(String name,String value)

4.        返回响应内容:两个流(两个流不能同时使用)

1)        字节流:ServletOutputStream,用来向客户端发送字节数据。ServletOutputStream out = resopnse.getOutputStream();

2)        字符流:PrintWriter,用来向客户端发送字符数据!需要设置编码。PrintWriter writer = response.getWriter();

请求:request(封装了客户端的请求数据)

1.        API:

Ø  获取客户端IP:request.getRemoteAddr()

Ø  请求方式:request.getMethod()

Ø  获取单值头:getHeader(Stringname)

Ø  获取多值头:Enumeration<String>getHeaders(String name)

Ø  获取请求URL:

¨        获取协:String getScheme()

¨        获取服务器名:String getServerName()

¨        获取服务器端口:String getServerPort()

¨        获取项目名:String getContextPath()

¨        获取Servlet路径:String getServletPath()

¨        获取参数部分:String getQueryString()

¨        获取请求URI:String getRequestURI()(等于项目名+Servlet路径)

¨        获取请求URL:String getRequestURL()

Ø  获取请求参数:

¨        String getParameter(Stringname)  (适用于单值请求参数)

¨        String[]getParameterValues(String name) (适用于多值请求参数)

Ø  获取所有请求参数名称

¨        Enumeration<String>getParameterNames()

¨        Map<String,String[]>getParameterMap()

2.        请求转发和请求包含

1)        获取请求调度器,并与一个Servlet绑定:

RequestDispatcher rd =request.getRequestDispatcher("/MyServlet")

2)        请求转发:rd.forward(request,response);

3)        请求包含:rd.include(request,response);

4)        转发与重定向的区别:

a)        请求转发是一个请求一次响应,而重定向是两次请求两次响应

b)        请求转发地址栏不变化,而重定向会显示后一个请求的地址

c)        请求转发只能转发到本项目其他Servlet,而重定向不只能重定向到本项目的其他Servlet,还能定向到其他项目

d)        请求转发是服务器端行为,只需给出转发的Servlet路径,而重定向需要给出requestURI,即包含项目名!

3.        解决乱码问题:

两个方面:请求内容乱码、响应内容乱码

1)        解决请求乱码:

GET:String param = newString(request.getParameter(“name”).getByte(“ios-8859-1”),”utf-8”);

POST:request.setCharacterEncoding(“utf-8”);

2)        解决响应乱码问题:Response.setContextType(“utf-8”)

Cookie (不能跨浏览器,不能有中文)

1.        什么是Cookie:Cookie是HTTP协议制定的,先用服务器将Cookie保存到浏览器中,然后下一次浏览器请求服务器时,把上一次请求得到的Cookie归还给服务器。

2.        Http协议规定:

1)        1个Cookie最大4KB

2)        1个服务器最多向1个浏览器保存20个Cookie

3)        1个浏览器最多可以保存300个Cookie

3.        作用:服务器使用Cookie来跟踪客户端状态。

4.        使用:

1)        在响应中添加Cookie:response.addCookie()

2)        从请求中获取Cookie:request.getCookies()

// 保存

Cookie c = new Cookie("username", URLEncoder.encode("张三","utf-8"));//出错!

response.addCookie(c);

 

// 获取

Cookie[] cs = request.getCookies();

if(cs != null) {

  for(Cookie c : cs){

    if("username".equals(c.getName())) {

      String username =c.getValue();

      username =URLDecoder.decode(username, "utf-8");

    }

  }

}

5.        两个重要的方法:

1)        Cookie的maxAge:设置Cookie的最大生命周期

a)        maxAge>0:浏览器会把Cookie保存到客户机硬盘上,有效时长为maxAge的值决定。

b)        maxAge<0:Cookie只在浏览器内存中存在,当用户关闭浏览器时,浏览器进程结束,同时Cookie也就死亡了。

c)        maxAge=0:浏览器会马上删除这个Cookie

2)        Cookie的path:浏览器访问服务器的路径,如果包含某个Cookie的路径,那么就会归还这个Cookie

HttpSession

1.        作用:

1)        HttpSession是由JavaWeb提供,用来回话跟踪的类。

2)        Session是服务器端对象,保存在服务器端。底层依赖Cookie或是URL重写。

3)        服务器会为每个客户端创建一个session对象,并把这个session对象保存到一个Map中,这个Map被称为Session缓存。

2.        原理:

1)        依赖Cookie:request.getSession()方法

Ø  获取Cookie中的JSESSIONID:

Ø  如果sessionId不存在,创建session,把session保存起来,并把sessionId保存到Cookie中返还给浏览器。

Ø  如果如果sessionId存在,通过sessionId查找session对象,如果session失效,创建一个session并保存起来,并把sessionid保存到Cookie中,返还给浏览器。

Ø  如果没失效,则不用创建。

Ø  获得session

PS:如果创建了新的session,浏览器会得到一个包含了sessionId的Cookie,这个Cookie的生命为-1,即只在浏览器内存中存在,如果不关闭浏览器,那么Cookie就一直存在。

2)        URL重写:实现:将页面中的所有路径,都是用response.encodeURL(“url”)处理。

Ø  让网站的所有超链接、表单中都添加一个特殊的请求参数,即sessionId

Ø  这样服务器可以通过获取请求参数得到sessionId,从而找到session对象。

Ø   response.encodeURL(Stringurl):该方法会对url进行智能的重写:当请求中没有归还sessionid这个cookie,那么该方法会重写url,否则不重写!当然url必须是指向本站的url。

JSP

1.        作用:

1)        作为请求发起页面

2)        作为请求结束页面

2.        组成:jsp=html+java脚本+jsp标签

3.        jsp原理:jsp其实是一种特殊的Servlet

1)        当jsp页面第一次被访问时,服务器会把jsp编译成java文件(这个java其实是一个servlet类)

2)        然后再把java编译成.class

3)        然后创建该类对象

4)        最后调用它的service()方法

5)        第二次请求同一jsp时,直接调用service()方法。

4.        静态包含和动态包含的区别:

1)        <%@include%> 它是在jsp编译成java文件时完成的!他们共同生成一个java(就是一个servlet)文件,然后再生成一个class!

2)        RequestDispatcher的include()是一个方法,包含和被包含的是两个servlet,即两个.class,他们只是把响应的内容在运行时合并了

5.        九个内置对象:

1)        out --> jsp的输出流,用来向客户端响应

2)        page --> 当前jsp对象。它的引用类型是Object,即真身中有如下代码:Objectpage = this;

3)        config --> 它对应真身中的ServletConfig对象!

4)        pageContext --> 一个顶9个!

5)        request -->HttpServletEequest

6)        response -->HttpServletResponse

7)        exception --> Throwable

8)        session --> HttpSession

9)        application --> ServletContext

6.        pageContext

1)        Servlet中有三大域,而JSP中有四大域,它就是最后一个域对象!

Ø  ServletContext:整个应用程序

Ø  session:整个会话(一个会话中只有一个用户)

Ø  request:一个请求链!

Ø  pageContext:一个jsp页面,这个域是在当前jsp页面和当前jsp页面中使用的标签之间共享数据!

2)        作用:域对象

     > 代理其他域:pageContext.setAttribute("xxx", "XXX",PageContext.SESSION_SCOPE);

     > 全域查找:pageContext.findAttribute("xxx");从小到大,依赖查找!

     > 获取其他8个内置对象:
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: