http:协议
对浏览器和服务器之间数据传输格式的规范!
tcp/ip协议:
专注的是客户端和服务端之间数据是否传输成功
http协议:
就是在tcp/ip协议的基础上封装的一套协议,专注于客户端和服务端数据传输格式是否一致
http请求
GET /day08/first HTTP/1.1 请求行 应俩个空格分开
Host:localhost:8080 请求头以键值对形式出现)
User-Agent:Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/61.0.3163.100 Safari/537.36
Accept:text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,image/apng,*/*;q=0.8
Accept-Encoding:gzip, deflate, br
Accept-Language:zh-CN,zh;q=0.8
Connection:keep-alive
一个空行
name=eric&password=2346 实体内容
2.请求行:
1)http协议版本:
http1.0:当浏览器和服务器连接之后,在一次连接中只能发出一个请求
http1.1当浏览器和服务器连接之后,在一次连接中可以发出多行请求(效率比1.0更高)
常见的问题:
在一个HTML页面,在页面上有三张页面,访问这个HTML页面,问一共发出几次请求
答案:
4次(HTML页面,获取资源需要请求 link src img 导入其他资源文件的)
2)请求的资源: 请求服务器的哪个文件
/day08/first:URI 统一资源描述符,可以描述任何文件,本地,互联网
http://localhost:8080/day08/first URL:统一资源定位符,互联网(基于http协议)是URI的子集
3)GET请求的方式(提交方式)
http请求方式GET POST HEAD PUT CONNECT...
<form action="提交地址" method="get/post";
区别:
GET:提交的参数显示到地址栏
原理:get提交的参数会跟在请求行内容的URL后面:
以?开始,每个参数用=号分开,name=Jack
第二个参数之后使用&符号链接
?name=javd&password=12346
2)不适合存放敏感数据
3)不超过1kb
POST:提交的数据不会显示到地址栏
原理:
post提交的参数会跟在请求的实体内容中
第二个参数用&链接
name=javd&password=12346
2)适合敏感数据
3)提交的大小没有限制
2.1请求头
Accept:text/html,image/* 浏览器接受的数据类型
Accept-Charset:ISO-8859-1 浏览器接受的数据编码格式
Accept-Encoding:gzip,compress 浏览器接受的数据压缩格式
Accept-Language:en-us,zh- 浏览器接受的语言
Host:www.it315.org:80 请求发出的主机和端口号(必须)
If-Modifi-Since:Tue,11 jul 2000 18:23:51 GMT 浏览器缓存的最后修改时间
Referer:http://www,it315.org/index.jsp 当前请求来自于哪里(防止非法链接)
User-Agent:Mozilla/4.0(compatible;MSIE5.5;Windoes NT5.0) 浏览器类型
Cookie:name=eric 浏览器保存的cookie数据
Connection:colse/Keep-Alive 浏览器和服务器的连接状态 close 关闭 keep-alive:保持链接
Date:Tue,11 Jul 2000 18:23:51 GMT 请求发出的时间
使用HttpServletRequset获取请求信息
1)Tomcat服务器接收到浏览器发送的请求数据
2)Tomcat服务器把请求数据封装成HttpServletRequest对象
3)Tomcat服务器调用doGet方法,把request对象传到servlet
HttpServletRequest对象:获取请求数据
请求行
请求方式 request.getMethod()
请求资源 request.getRequestURI()/request.getRequestURL()
http协议版本:request.getProtocol();
请求头
request.getHeader("name");
request.getHeaderNames();
获取内容:
request.getInputStream();
service方法是servlet的核心服务方法,我们的业务逻辑都是在这个方法开始被触发的
结论service方法和doXXX的关系
1)service方法是程序的入口,我们的代码逻辑就在这个方法被调用到
2)在HtppServlet的service方法的源码中,根据不同的请求方式调用了不同的doXXX
所以我们在开发中servlet的时候,就不需要去覆盖service方法,而是去doXXX方法
因为get和post是最常用的俩种请求方式,所以我们只需要一个doGet和doPost即可!
2.3案例user-agent
response.setContentType("text/html;charset=utf-8")
//获取浏览器属性
String header = request.getHeader("user-agent")
System.out.println(header)
if(header.contains("Firefox")){
response.getWriter().write("你正在使用火狐浏览器")
}else if(header.contains("Chrome")){
response.getWriter().write("你正在使用谷歌浏览器")
}else if(header.contains("Trident")){
response.getWriter().write("你正在使用IE浏览器")
}else {
response.getWriter().write("你使用其他的浏览器")
}
2.4案例referer 防止非法链接
第一次:下载资源->下载页面->打开广告页面(下载链接)->开始下载
第二次:直接点击下载链接->跳转广告页面(下载链接)开始链接
非法请求:
1)直接访问下载资源
2)不是从广告页面过来的请求
referer:请求只有从超链接过来的请求才有这个头
/**
* 代表下载资源
* referer:表示当前请求来自于哪里
*/
String referer = request.getHeader("referer");
System.out.println(referer);
/**
* 非法请求
* 1)直接访问(request==null)
* 2)当前访问不是来自于广告页面(!referer.contains("adv.html");
*/
if(referer==null || !referer.contains("adv.html")){
response.getWriter().write("你当前请求不合法,请回到"+"<a href='/JavaWebTestOne/adv.html'>首页</a>");
}
else{
response.getWriter().write("正在下载...........");
2.5获取参数的数据
get:放在请求行的URI后面
post:放在请求的实体内容
问题的:
1)获取打的参数数据,还需要进一步处理,获取参数值
2)俩种提交方式的获取完全不一样,不通用
通用的获取参数的方法(无论get和poet可用)
request.getParameter(”name“);//根据参数名称获取数值(参数名称就是表单里里面的name属性值)
request.getParameterNames();//获取所有参数名称列表
request.getParameterMap();//获取参数对象的列明(Map集合)
request。getParameterValues(“”)根据参数名称获取多个参数值
每个map的对象就是一个参数(包括参数名称和参数值)
key:参数的名称
value:参数值 默认情况下都是多个值的参数
复习Map集合
问题:Map集合如何遍历
1)entrySet()
2)keySet()
3)values()
1)entrySet()方法;获取键值对对象的Set集合
Entry对象中包含一个键对象,和一个值对象
Set<Entry<String,String[]>> entry=map.entrySet();
for(Entrey<String,String[]> entry: entrySet){
获取键对象
String key=entry.getKey();
获取值对象(数组的第一个元素就是参数值)
String[] value=entry.getValue();
}
2)keySet():湖区所有键值对象的Set集合
Set<String> keySet=map.keySet()
for(String key: keySet){
String[] value=map.get(key);
}
3)values():获取所有对象的collection集合(只能获取值对象,不能获取键对象)
Collection<String[]> values=map.values();
for(String[] value:values){
}
在出现解码问题出现乱码时
修改解码是查询的码表
reques.setCharacterEncoding(""utf-8);
注意:必须放在所有获取参数的代码之前
只能解决post的乱码对get提交的是无效的
因为这个方法只能设置对请求实体内容的解码时查询的码表
post提交的参数是放在了实体内容中,所以对post是有效的
但是get提交参数是放在URI后面这个方法无法影响URI后面的内容
如果是post
reque.setCharEncoding("utf-8'")
如果是get
手动对参数内容从新解码
String value=request.getParameter("name"); iso-8859-1
String value=new String(value.getBytes("iso-8859-1"),"utf-8");
if("GET“.0equals.(request.getMethod())){
String value=new String(value.getBytes("iso-8859-1"),"utf-8");
}