HTTP
Posted ---------zjh---------
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP相关的知识,希望对你有一定的参考价值。
HTTP
-
概念:
-
http:Hyper Text Transfer Protocol--超文本传输协议。
-
-
历史版本:
-
1.0:每一次请求响应都会建立新的连接
-
-
-
请求方式:
-
HTTP协议有7中请求方式,常用的有2种
-
GET:
-
请求参数在请求行中,在url后。
-
请求的url长度有限制的
-
不太安全
-
-
POST:
-
请求参数在请求体中
-
请求的url长度没有限制的
-
相对安全
-
-
-
请求消息数据格式
请求行
-
请求方式 请求url 请求协议/版本 GET /login.html HTTP/1.1
-
请求方式:
HTTP协议有7中请求方式,常用的有2种
请求头:客户端浏览器告诉服务器一些信息
-
请求头名称: 请求头值
-
常见请求头:
-
Connection: keep-alive
-
连接的方式 长连接
-
-
User-Agent:浏览器告诉服务器,我访问你使用的浏览器版本信息
-
可以在服务器端获取该头的信息,解决浏览器的兼容性问题
-
-
Referer:http://localhost/login.html
-
告诉服务器,我(当前请求)从哪里来?
-
作用:
-
防盗链:
-
统计工作:
-
-
-
-
-
请求空行
-
空行,就是用于分割POST请求的请求头,和请求体的。
请求体(正文)
-
封装POST请求消息的请求参数的
HTTP相应
响应行
-
http协议 状态码
HTTP/1.1 200
-
常用响应状态码
-
常用状态码 意义 202 请求成功 302 重定向 304 读取本地缓存文件 404 请求的页面不存在 500 服务端程序错误
-
-
响应体
-
一般为html文件
Tomcat
基本概念
-
IP:计算机(电子设备)在网络中定位(唯一标识)。
-
端口:找到计算机中的应用程序(唯一标识)
-
服务器概念:
服务器指一个管理资源并为用户提供服务的计算机软件,服务器的本质其实就是普通的电脑中装了相关的服务器软件。
-
当我们的电脑装了mysql,就会成为一个数据库服务器。
-
当我们的电脑装了Tomcat就成为了一个web 应用服务器。
-
-
服务器分类:
-
服务器:安装了服务器软件的计算机
-
服务器软件:接收用户的请求,处理请求,做出响应
-
web服务器软件:接收用户的请求,处理请求,做出响应。
-
在web服务器软件中,可以部署web项目,让用户通过浏览器来访问这些项目。
-
-
文件夹分类
配置:
-
部署项目的方式:
-
直接将项目放到webapps目录下即可。
-
/hello:项目的访问路径-->虚拟目录
-
简化部署:将项目打成一个war包,再将war包放置到webapps目录下。
-
war包会自动解压缩
-
-
-
-
配置conf/server.xml文件 在<Host>标签体中配置 <Context docBase="D:hello" path="/hehe" />
-
docBase:项目存放的路径
-
path:虚拟目录
-
-
(热部署)在confCatalinalocalhost创建任意名称的xml文件。在文件中编写 <Context docBase="D:hello" />
-
虚拟目录:xml文件的名称
-
-
-
静态项目和动态项目:
-
目录结构
-
java动态项目的目录结构: -- 项目的根目录 -- WEB-INF目录: -- web.xml:web项目的核心配置文件 -- classes目录:放置字节码文件的目录 -- lib目录:放置依赖的jar包
-
-
IDEA与tomcat的相关配置
-
IDEA会为每一个tomcat部署的项目单独建立一份配置文件
查看控制台的log:Using CATALINA_BASE: "C:Usersfqy.IntelliJIdea2018.1system omcat_itcast"
注意点
WEB-INF受保护的文件夹不能够通过浏览器客户端直接访问,必须通过服务器访问访问里面的资源。 css, image js其他的插件等静态资源统统都放到web的根目录下。
Servlet
-
Server Applet : 使用java语言编写的运行在服务器端上的小程序。
-
是sun公司提供 一套规范(接口),用来处理客户端请求、响应给浏览器的动态资源。
Servlet内部实现原理
Servlet生命周期
-
init方法:servlet创建的时候执行
-
service方法:每次发送请求的时候执行
-
ServletRequest 代表请求认为ServletRequest 内部封装的是http请求的信息
-
ServletResponse 代表响应认为要封装的是响应的信息
-
-
destory方法:服务器关闭的时候执行
Servlet的配置
-
方式一:在web.xml中配置
<servlet> <servlet-name>名字可以随便起,但要和下面的保持一致</servlet-name> <servlet-class>对应类的全限定类名</servlet-class> </servlet> <servlet-mapping> <servlet-name>和上面保持一致</servlet-name> <url-pattern>路径,可以随便起,是使用时进入的路径</url-pattern> </servlet-mapping>
-
urlpattern的配置方式
-
完全匹配如 /myServlet
-
目录匹配如 /a/b/c/*
-
扩展名匹配 *.do
-
缺省配置如 / 当你访问资源地址所有的servlet都不匹配 时,缺省的servlet负责处理其实,web应用中所有的资源 的响应都是servlet负责,包括静态资源,对于静态资源其 实是由tomcat的默认servlet进行处理的
-
/和/*区别
-
/不会处理后缀名是.jsp的资源
-
/*会处理后缀名是.jsp的资源
-
-
-
启动服务器的时候创建servlet配置 <load-on- startup>1</load-on-startup> 只要不是负数都会随 着服务器的启动而创建,值越小优先级越高
-
HttpServlet
-
HttpServlet,这个是Tomcat提供的一个类,并且实现了 Servlet接口
-
HTTPServlet类不再需要重写多个方法,只需要重写doGet()、doPost()中的其中一个。
ServletContext对象
-
ServletContext代表是一个web应用的环境(上下文) 对象。
-
一个web应用只有一个ServletContext对象 。
-
ServletContext的生命周期一般会随着服务器的启动而创建,web应用被卸载而销毁。
-
ServletContext中的数据是整个web应用所共享的 。
-
获取对象:在方法里使用
this.getServletContext();
-
常用方法:
//向ServletContext域中放入数据 setAtrribute(String name,Object obj); //从ServletContext域中获取数据 getAttribute(String name); //从ServletContext域中删除数据 removeAttribute(String name);
HttpServletResponse
-
HttpServletResponse是ServletResponse的子接口
-
response重定向
-
response.setStatus(302); response.setHeader("Location", "/WebTes t/index.html"); //以上功能能够实现重定向,原理就是当客户端收到响应后,响应头信息中含有 Location 是 /WebTest/index.html ,所以客户端就会自动跳转, 当然我们如果要去实现重定向,可以直接使用封装好的方法,但是其内部实现还是上述内容. //等同于一下方法: response.sendRedirect("/WebTest/index.html");//重定向 response.setHeader("refresh", "2;url=/Day 11/index.html");//定时重定向
-
HttpServletRequest
-
获取uri和url路径
//获取uri,就是请求行中的地址 String uri = request.getRequestURI(); //获取url,获取全路径 StringBuffer url = request.getRequestURL();
-
获取web应用的名称和请求IP地址
//获取当前web应用名称---->虚拟目录 String webName = request.getContextPath(); //获取请求的客户端的ip地址 String ipAddress = request.getRemoteAddr();
-
获取请求的内容
//1.获取请求头的内容 //获取指定header的内容 String header = request.getHeader("User-Agent"); //获取所有header的名字 Enumeration<String> names = request.getHeaderNames(); ? //2.获取get请求的表单内容 String QueryString = request.getQueryString(); ? //3.获取请求体的内容 //对于get请求虽然表单数据在请求行中,也是通过此方法获取提交数据的 String name = request.getParameter("username"); //对于表单中一个name有多个值的可以使用此方法,如che ckbox,返回值是数组 String [] hobbys = request.getParameterValues("hobby"); ? //4.获取提交表单所有数据 Map<String, String[]> map = request.getParameterMap(); for(String key : map.keySet()){ String[] values = map.get(key); System.out.println(key+"="+Arrays.toStr ing(values)); }
-
请求乱码问题
//对于post提交 request.setCharacterEncoding("UTF-8"); //对于get提交,如果出现乱码 String parameter = request.getParameter("us ername"); parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");
内部转发
客户端向服务器发送请求,服务器收到这个请求以后,可以在内部进行一个转发功能,也就是在不告知客户端的情况下进行请求的转发。
//获取内部转发器 RequestDispatcher dispatcher = request.getRequestDispatcher("/index.jsp"); //进行转发 dispatcher.forward(request, response); //通常是连写 //request.getRequestDispatcher("/index.jsp").forward(request, response);
-
-
通过内部转发路径一定要注意,因为操作过程是在服务器 内部进行操作的,所以地址就不能够是客户端地址,而应该 是服务器端地址,路径不能再写web应用的名称,/就web应 用的根目录
-
通过内部转发,两个servlet或者两个界面的接收到的 request内的内容是相同的
-
以上是关于HTTP的主要内容,如果未能解决你的问题,请参考以下文章
Flutter 报错 DioError [DioErrorType.DEFAULT]: Bad state: Insecure HTTP is not allowed by platform(代码片段