一、HTTP
1.HTTP请求消息数据格式
* 请求消息数据格式
1. 请求行
请求方式 请求url 请求协议/版本
GET /login.html HTTP/1.1
* 请求方式:
* HTTP协议有7中请求方式,常用的有2种
* GET:
1. 请求参数在请求行中,在url后。
2. 请求的url长度有限制的
3. 不太安全
* POST:
1. 请求参数在请求体中
2. 请求的url长度没有限制的
3. 相对安全
2. 请求头:客户端浏览器告诉服务器一些信息
格式:“请求头名称: 请求头值”
* 常见的请求头:
1. User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息
* 可以在服务器端获取该头的信息,解决浏览器的兼容性问题
2. Referer:http://localhost/login.html
* 告诉服务器,我(当前请求)从哪里来?
* 作用:
1. 防盗链:
2. 统计工作:
3. 请求空行
空行,就是用于分割POST请求的请求头,和请求体的。(Get请求没有请求空行和请求体)
4. 请求体(正文):
* 封装POST请求消息的请求参数的。(Get请求没有请求空行和请求体)
Referer:http://localhost/login.html为什么可以起到防盗链的功能?
优酷花了几百万买了“战狼二”的版权,你自己写了个小视频网站让战狼二播放链接指向优酷的播放链接,你一分钱没花却盗取了优酷的版权。
Referer 告诉服务器,当前请求从哪里来
优酷会利用if referer.equals("优酷首页")
来判断你这个请求是否从优酷首页来的,如果不是那就不允许播放
Referer:http://localhost/login.html为什么可以起到统计的功能?
你投了300万让百度、新浪、搜狐给你打广告,用户在百度/搜狐上发现了这个广告就会点进去。
Referer 告诉服务器当前请求从哪里来,所以你可以统计百度用户的数量、搜狐用户的数量、新浪用户的数量
从而看这钱花的值不值
1.HTTP响应消息数据格式
2. 响应消息:服务器端发送给客户端的数据
* 数据格式:
1. 响应行
1. 组成:协议/版本 响应状态码 状态码描述
什么是响应状态码:服务器告诉客户端浏览器本次请求和响应的一个状态。
状态码都是3位数字 :
1. 1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
2. 2xx:成功。代表:200
3. 3xx:重定向。代表:302(重定向),304(访问缓存)
302:浏览器访问A资源,A资源发了个302(重定向)说我办不了你找C去吧。
304:浏览器访问了一张图片并把它缓存下来,当它再次访问这张图片时该图片就会发出304表示你本地有缓冲,你从缓冲里面找吧
5. 4xx:客户端错误。
* 代表:
* 404(请求路径没有对应的资源)
* 405:请求方式没有对应的doXxx方法(你代码里面删掉了doGet方法,你启动servlet,浏览器访问该页面就会报错为405)
6. 5xx:服务器端错误。代表:500(服务器内部出现异常)
2. 响应头:
1. 格式:头名称: 值
2. 常见的响应头:
1. Content-Type:服务器告诉客户端本次响应体数据格式以及编码格式
2. Content-disposition:服务器告诉客户端以什么格式打开响应体数据
* 值:
* in-line:默认值,在当前页面内打开
* attachment;filename=xxx:以附件形式打开响应体。文件下载
3. 响应空行
4. 响应体:传输的数据
1. HTTP协议之响应状态码
1xx:服务器就收客户端消息,但没有接受完成,等待一段时间后,发送1xx多状态码
2xx:成功。代表:200
3xx:重定向。代表:302(重定向),304(访问缓存)
302:浏览器访问A资源,A资源发了个302(重定向)说我办不了你找C去吧。
304:浏览器访问了一张图片并把它缓存下来,当它再次访问这张图片时该图片就会发出304表示你本地有缓冲,你从缓冲里面找吧
4xx:客户端错误。
* 代表:
* 404(请求路径没有对应的资源)
* 405:请求方式没有对应的doXxx方法(你代码里面删掉了doGet方法,你启动servlet,浏览器访问该页面就会报错为405)
5xx:服务器端错误。代表:500(服务器内部出现异常)
200 OK //客户端请求成功
400 Bad Request // 客户端有语法错误,不能被服务器所理解
402 Forbidden //服务器收到请求,但是拒绝提供服务
404 not find //请求资源不存在
1.关于get和post的区别(面试常问!)
二、Request
2.Request对象的主要方法
1.获取路径相关
request.getContextPath() /day14
request.getRequestURI() /day14/demo1
request.getRequestURL() http://localhost/day14/demo1
2. 获取请求头数据
request.getHeader("user-agent")
request.getHeaderNames():获取所有的请求头名称
3.获取请求参数
request.getParameter("username");
request.getParameterValues("hobby");
request.getParameterNames();
request.getParameterMap();
4.设置编码:
* get方式:tomcat 8 已经将get方式乱码问题解决了
* post方式:会乱码,需要request.setCharacterEncoding("utf-8");
* 设置了编码以后request.getParameter("username");//获取到的username是“张三”也不会乱码了
5.请求转发
你可以看到request的主要功能都是获取get方法(获取请求头、获取参数、获取请求体等等)
一旦要是出现了set方法那就是要走人了(先setAttribute,然后就是拿着属性转发走了)
request.setAttribute("msg","hello");
request.getAttitude("msg");
request.removeAttribute("msg");
request.getRequestDispatcher("/requestDemo9").forward(request,response);
6.其它:
getSession()
getCookies():返回客户端的所有Cookie对象,结果是一个Cookie数组
getCharacterEncoding():返回请求中的字符编码方式
3.获取请求参数
4.乱码问题
@WebServlet("/requestDemo7")
//doGet里面:
request.setCharacterEncoding("utf-8");
String username = request.getParameter("username");//获取到的username是“张三”也不会乱码了
//doPost:
this.doPost(request,response);
5.请求转发示例
@WebServlet("/requestDemo8")
doPost:
System.out.println("demo8888被访问了。。。");
request.setAttribute("msg","hello");
request.getRequestDispatcher("/requestDemo9").forward(request,response);
doGet:
this.doPost(request,response);
@WebServlet("/requestDemo9")
doPost:
Object msg = request.getAttribute("msg");
System.out.println(msg);
System.out.println("demo9999被访问了。。。");
doGet:
this.doPost(request,response);
2.URI和URL的区别是什么?
* URI:统一资源标识符 : /day14/demo1
* URL:统一资源定位符 : http://localhost/day14/demo1
* URI相当于“共和国”,URL相当于“中华人民共和国”,URI的范围要大于URL的范围
URI(Uniform Resource Identifier) 是统一资源标志符,可以唯一标识一个资源。
URL(Uniform Resource Location) 是统一资源定位符,可以提供该资源的路径。它是一种具体的 URI。
URI的作用像身份证号一样,URL的作用更像家庭住址一样。URL是一种具体的URI,它不仅唯一标识资源,而且还提供了定位该资源的信息。
2.转发和重定向的区别
* 重定向的特点