简单了解request与response

简单了解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

posted @ 2019-03-28 13:29 niceyoo 阅读(...) 评论(...) 编辑 收藏

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/414510.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Android 自定义阴影,自定义颜色样式

阴影效果样式&#xff1a; 实现方法&#xff1a; 1、创建自定义属性——attrs.xml文件 <?xml version"1.0" encoding"utf-8"?> <resources><declare-styleable name"ShadowContainer"><attr name"containerShadow…

C高级第一次PTA作业(2)

6-1 在数组中查找指定元素 本题要求实现一个在数组中查找指定元素的简单函数。 1.设计思路 &#xff08;1&#xff09;算法&#xff1a; 第一步&#xff1a;定义一个数组名为a的数组&#xff0c;循环变量i&#xff0c;需要查找的数x&#xff0c;和数组元素的个数n。 第二步&…

什么是servlet?

什么是servlet? 前面一篇在讲解 简单了解request与response &#xff0c;王小提出 Servlet 的疑惑&#xff0c;下面对 Servlet 做简单总结。 1. 什么是servlet? 在 JavaWeb 项目中&#xff0c;处理请求和发送响应的过程是由一种叫做 Servlet 的程序来完成的&#xff0c;并且…

idea搭建可运行Servlet的Web项目[maven]

idea搭建可运行Servlet的Web项目[maven] 1. new Project File > new > Project… 2. 填写 GroupID\ArtifactID GroupID 是项目组织唯一的标识符&#xff0c;实际对应JAVA的包的结构&#xff0c;是main目录里java的目录结构。 ArtifactID 是项目的唯一的标识符&#xff0…

Android 自定义年月日日期选择器、时分时间选择器

实现效果&#xff1a; 日期选择器 时间选择器 实现方法&#xff1a; 1、自定义选择器dialog public class DatePickDialog extends Dialog implements OnChangeLisener {private Tex…

main.js中封装全局登录函数

main.js中封装全局登录函数 1. 在 main.js 中封装全局登录函数 通过 vue 对象的原型扩展&#xff0c;可以扩展一个函数&#xff0c;这样这个函数就可以在每一个界面通过类似指向对象的方式&#xff0c;去访问这个函数。 如下是 main.js 扩展的函数&#xff1a; Vue.prototype.…

Android 人脸照片对比,人脸对比

1、首先在百度云平台&#xff0c;注册账号&#xff0c;并且进行企业验证 https://console.bce.baidu.com/#/index/overview 2、进入人脸识别主页&#xff0c;创建应用 3、创建SDK授权应用 SDK与完整demo链接&#xff1a; demoCSDN链接&#xff1a;https://download.csdn.net…

uni-app第三方登陆-微信

uni-app第三方登陆-微信 结合上文全局登陆校验&#xff0c;实现微信授权登录官方手册地址&#xff1a; https://uniapp.dcloud.io/api/plugins/login?idgetuserinfo 一、书写两个界面 login.vue 用于用户登陆my.vue 我的界面&#xff0c;存放校验登陆的函数1.1 my.vue <sc…

Android获取屏幕尺寸,屏幕适配

获取屏幕尺寸&#xff1a; DisplayMetrics dm new DisplayMetrics(); getWindowManager().getDefaultDisplay().getMetrics(dm); int w dm.widthPixels;//宽 int h dm.heightPixels;//高 Log.i("lgq","ww"w"....h"h); 输出&#xff1a;2019…

点击一百万次

在一个群里看到的题目&#xff0c;就找他要来玩儿了。http://120.24.86.145:9001/test/得点击一百万次图片才行。 可以看出&#xff0c;是通过jqeury发包操作点击量的&#xff0c;所以只需要发一个包控制点击量就ok了 转载于:https://www.cnblogs.com/nul1/p/8611341.html

基于token与基于服务器的身份认证

基于token与基于服务器的身份认证 1、基于服务器的身份认证 我们清楚 http 协议是无状态的&#xff0c;也就是说&#xff0c;如果我们已经认证了一个用户&#xff0c;那么他下一次请求的时候&#xff0c;服务器不知道我是谁&#xff0c;我们就必须要再次认证。 我们与浏览器交…

Android 视频通话

基于腾讯云视频SDK 实现效果 实现步骤&#xff1a; 1、登录腾讯云开发者平台 https://cloud.tencent.com/product/trtc 2、进入 实时音视频 主页。并创建应用 进入实时音视频方法&#xff1a;点击——控制台——>云产品 3、进入开发辅助主页&#xff0c;创建uid 第四…

c++的作业2

本题再次加深了我对于素数与非素数的认识&#xff0c;以及学会了控制每行素数的个数。 本题&#xff0c;让我再一次加深对于是switch的用法&#xff0c;case中只能是常量表达式&#xff0c; break&#xff0c;continue都适用于三种循环结构&#xff0c;即&#xff0c;for&#…