• 简单了解request与response


    本文对 request、 response 简单描述,未涉及到具体的浏览器缓存、重定向、请求转发等代码部分。

    一、Web服务器,浏览器,代理服务器

    在看 response、request 对象之前,先来了解一下 Web服务器,浏览器,代理服务器 三者之间的关系。

    当我们打开浏览器,在地址栏中输入URL,然后我们就看到了网页。 原理是怎样的呢?

    实际上我们输入 URL 后,我们的浏览器给Web服务器发送了一个 Request, Web 服务器接到Request 后进行处理,生成相应的 Response,然后发送给浏览器, 浏览器解析 Response 中的 HTML,这样我们就看到了网页,过程如下图所示:

    我们的 Request 有可能是经过了代理服务器,最后才到达 Web 服务器的。

    过程如下图所示:

    代理服务器就是网络信息的中转站,有什么功能呢?

    • 提高访问速度, 大多数的代理服务器都有缓存功能。

    • 突破限制, 也就是FQ了

    • 隐藏身份。

    二、再回过头看 response、request 对象

    Tomcat(Web应用服务器) 收到客户端的 http 请求,会针对每一次请求,分别创建一个代表请求的 request 对象、和代表响应的 response 对象。

    如上,我们想拿到用户发送过来的数据,只需要找到 request 对象;而响应用户请求,则找 response 对象。

    我们在程序中经常看到如下两个对象,这就是我们要找的 request、response

    2.1 HttpServletResponse

    HttpServletResponse 封装了 response 对象,通过该对象实现向浏览器输出数据,实现交互。

    2.1.1 常见方法:
    addCookie(Cookie cookie)  向客户端写入Cookie

    addHeader(Java.lang.String name, java.lang.String value) 写入给定的响应头

    encodeURL(java.lang.Stringurl) 默认cookie中包含Session ID,如果客户端不支持 Cookie,就在参数 url 中加入 Session ID 信息,可以解决用户禁用cookie的问题。

    setStatus(intsc)  设置响应的状态码。
    2.1.2 实现向浏览器输出

    HttpServletResponse 实现向用户输出数据的方法:getOutputStream 和 getWriter方法

    getOutputStream 和 getWriter 方法分别用于得到输出二进制数据、输出文本数据的ServletOuputStream、Printwriter对象。
    getOutputStream 和 getWriter 这两个方法互相排斥,调用了其中的任何一个方法后,就不能再调用另一方法。

    getOutputStream() 方法例子:

    调用 getOutputStream() 方法获得 ServletOutputStream 流,再使用 print() 或 write() 向浏览器输出数据。试验一下:

    //获取到OutputStream流
    ServletOutputStream servletOutputStream = response.getOutputStream();

    //向浏览器输出数据
    servletOutputStream.print("niceyoo");

    效果如下:

    getWriter() 方法例子:

    //获取到printWriter对象
    PrintWriter printWriter = response.getWriter();
    printWriter.write("niceyoo-getWriter");

    效果如下:

    2.1.3 实现重定向

    重定向指的是一个web资源收到客户端请求后,web服务器通知客户端去访问另外一个web资源,这称之为请求重定向。实现方式是调用response.sendRedirect()方法。实现的原理就是给客户端返回了302状态码和location头。

    2.2 HttpServletRequest

    HttpServletRequest 封装了 request对象,当客户端通过HTTP协议访问服务器时,HTTP请求头中的所有信息都封装在这个对象中。

    2.2.1 常见方法:
    获得客户端的信息:
    getRequestURL 方法返回客户端发出请求时的完整URL。
    getRequestURI 方法返回请求行中的资源名部分,去掉主机名的部分。
    getRemoteAddr 方法返回发出请求的客户机的IP地址
    getRemoteHost 方法返回发出请求的客户机的完整主机名
    getRemotePort 方法返回客户机所使用的端口号
    getLocalAddr 方法返回WEB服务器的IP地址。
    getLocalName 方法返回WEB服务器的主机名
    getMethod 得到客户机请求方式,如GET,POST

    --
    获得请求头的方法:
    getHead(name)方法
    getHeaders(String name)方法
    getHeaderNames方法

    --
    获得请求参数:
    getParameter(name)方法
    getParameterValues(String name)方法
    getParameterNames方法
    getParameterMap方法
    2.2.2 实现转发

    请求转发指一个 web 资源收到客户端请求后,通知服务器去调用另外一个web资源进行处理。request 对象提供了一个 getRequestDispatcher 方法,该方法返回一个RequestDispatcher 对象,调用这个对象的 forward 方法可以实现请求转发。

    2.2.3 request域

    request 对象同时也是一个域对象,我们通过 request 对象在实现转发时,可以把数据通过request 对象带给其它web资源处理。
    下面是常用的一些对域中的属性的操作的方法:

    setAttribute方法
    getAttribute方法
    removeAttribute方法
    getAttributeNames方法
    2.2.4 Request的getParameter和getAttribute方法

    由于 request 也是一个域对象,所以既可以从它获得参数,即 Parameter。也可以获得域中的属性。但是他们的意义是完全不一样的。

    getParameter(String name):获得客户端传送给服务器的参数值,该参数是由 name 指定的,通常是表单中的参数。而且参数只能是字符串形式的键值对。

    getAttribute(String name):返回有name 指定的属性值,如果指定的属性值不存在,则会返回一个null值。这里存放的也是一个键值对,不同的是,这里的值可以是任意的类型。

    三、总结

    Web 服务器收到客户端的 http 请求,会针对每一次请求,分别创建一个用于代表请求的 request 对象、和代表响应的 response 对象。

    也就是一次请求生成一个 request 和 response,如果客户端和服务器握手结束,request 和 response 则是一起随着握手的消失而消失。

    在程序中,与浏览器交互是通过 request、response 这连个对象进行的,request 封装了用户的请求数据,response 则用于向浏览器输出数据。

    如果文章有错的地方欢迎指正,大家互相留言交流。习惯在微信看技术文章,想要获取更多的Java资源的同学,可以关注微信公众号:niceyoo

  • 相关阅读:
    从目标检测到图像分割简要发展史
    用卷积神经网络和自注意力机制实现QANet(问答网络)
    C# 监测每个方法的执行次数和占用时间(测试5)
    C# list常用的几个操作 改变list中某个元素的值 替换某一段数据
    C# 监测每个方法的执行次数和占用时间(测试4)
    生活 对最近工作 和 生活 感悟
    Cesium 加载天地图
    其它 开发常用工具
    PowerDesigner 画流程图
    RookeyFrame bin 目录
  • 原文地址:https://www.cnblogs.com/niceyoo/p/10614349.html
Copyright © 2020-2023  润新知