Http请求结构
请求消息数据格式:对应request 4部分
-
请求行
请求方式 请求URL 请求协议/版本 GET /login.html HTTP/1.1
- 请求方式: HTTP有7中,常用两种:POST GET
- GET:
- 请求参数在请求行中(url后)
- 请求的url长度有限制
- get请求不太安全(参数太显眼)
- POST:
- 请求参数在请求体中(表单中)
- url长度没有限制的
- 相对安全
- GET:
- 请求方式: HTTP有7中,常用两种:POST GET
-
请求头(键值对的形式)请求头名称:请求头值
-
请求空行
就是单纯的一个空行,用于分割POST请求头和请求体
-
请求体. get是没有请求体的,post有请求体
- 作用:封装post请求消息的请求参数的
Request
接收响应请求的五步:
-
request对象和response对象的原理
- request和response由服务器创建的,我们只是使用
- request对象是来获取请求消息,response对象是来设置响应消息
-
request对象继承的体系结构:
- ServletRequest对象:
- HttpServletRequest对象:(继承ServletRequest)
- tomcat对httpServletRequest的实现类:RequestFacade
-
request:,获取Http请求格式里面的四个部分信息
-
获取请求消息
-
获取请求行数据
- 请求行的格式: GET /java2022/demo1?username=marx HTTP/1.1
- 方法:
- 获取请求方式: String getMethod() ——> GET
- 内部已经用于判断方法并进行分发,我们基本用不上
- *获取虚拟目录: String getContextPath() ——> /java2022
1. - 获取Servlet路径 : String getServletPath() ——> /demo1
- 获取get方式的请求参数: String getQueryString() ——> username=marx
- *获取请求URI :
- String getRequestURI() ——> /java2022/demo1
- String getRequestURL() ——> http://localhost/java2022/demo1
- URL:统一资源定位符
- URI:统一资源标识符
- 获取协议及版本: String getProtocol() ——> HTTP/1.1
- 获取客户机的IP地址 :String getRemoteAddr() ——>
- 获取请求方式: String getMethod() ——> GET
-
获取请求头数据
-
方法:
- (*)String getHeader(String name) : 通过请求头的名称获取请求头的值
- Enumeration<String> getHeaderNames( ) :获取所有请求头名称
//1.获取所有请求头名称 Enumeration<String> headerNames = request.getHeaderNames(); while (headerNames.hasMoreElements()){ String name = headerNames.nextElement(); //2.通过请求头的名称获取请求头的值 String value = request.getHeader(name); System.out.println(name+" : "+value); }
一般常用第一个方法:因为常用的请求头我们是知道的。
// 演示获取请求头数据:user-agent String agent = request.getHeader("user-agent"); System.out.println(agent); // 判断agent浏览器版本 if(agent.contains("Chrome")){ System.out.println("谷歌浏览器"); }else if(agent.contains("Firefox")){ System.out.println("火狐浏览器"); }else if(agent.contains("Safari")){ System.out.println("safari浏览器"); } }
获取referer,可以实现防盗链
String referer = request.getHeader("referer"); System.out.println(referer);
防盗链操作里面:新建了一个项目,并且创建了新的tomcat服务器实现同时启动,修改两个端口,然后右上角分别将两个启动起来
-
-
获取请求体数据
- 只有post才有请求体,在请求体中封装了POST请求参数
- 步骤:
- 获取流对象
- 字符数据:字符流
- BufferedReader getReader() :获取自负输入流,只能操作字符数据
- 文件图片等字节流数据:字节流
- ServletInputStream getInputStream() : 获取字节输入流,可以操作所有类型的数据,操作字符数据也可以,但是不方便
- 字符数据:字符流
- 再从流对象中拿数据
- 获取流对象
-
-