20180805
javaweb学习
servlet+tomcat
servletContext:一个web项目只有一个,可以通过它来传递信息,类似于类变量,不同的实例之间可以通过修改类变量来相互通信
每次有页面调用的时候需要看页面的来源,如果确实是从自己的首页出来的,那么就可以接下来继续操作,如果不可以,那么需要跳转到我的首页,这个叫防盗链
post和get的区别
为什么说post是提交数据
因为 post 会把浏览器的数据打包知道转成request对象,然后解码,要使得文字编码格式一致,那就只需要修改quest对象的编码
而同get提交数据的时候需要修改tomcat 的编码格式,很麻烦
所以说get一般用来获取数据
get的请求参数会直接放在url后面,用?隔开,所以它的参数长度有限制
post的请求参数放在http请求包中
tomcat容器是如何创建servlet类实例的?
当tomcat容器启动时,会读取在webapps目录下所有应用中的web.xml文件,然后对xml文件进行解析,并读取servlet注册信息。然后,将每个应用中注册的servlet类都进行加载,并通过反射的方式实例化。
servlet是单例的,服务器会为每个用户创建一个线程,当多个用户并非访问servlet共享资源的时候就会出现线程安全问题
synchronized
或是直接定义在doPost() doGet();
http和https之间的关系
http 以明文的方式发送内容到服务器,存在很大的危险
https在http的基础上增加了ssl
https协议需要到ca申请证书,一般免费证书比较少,因而需要一定费用
http是超文本传输协议,信息是明文传输,https是具有安全性的ssl加密传输协议
他俩使用不同的连接方式,所用端口也不一样,一个是80 一个是443
客户端在使用HTTPS方式与Web服务器通信时有以下几个步骤,如图所示。
(1)客户使用https的URL访问Web服务器,要求与Web服务器建立SSL连接。
(2)Web服务器收到客户端请求后,会将网站的证书信息(证书中包含公钥)传送一份给客户端。
(3)客户端的浏览器与Web服务器开始协商SSL连接的安全等级,也就是信息加密的等级。
(4)客户端的浏览器根据双方同意的安全等级,建立会话密钥,然后利用网站的公钥将会话密钥加密,并传送给网站。
(5)Web服务器利用自己的私钥解密出会话密钥。
(6)Web服务器利用会话密钥加密与客户端之间的通信。
https费钱速度低也不是绝对安全
tomcat端口缺省值是8080
可以在conf里边的server.xm里修改该端口值
tomcat的部署方式
1.在webapps下,会自动部署
2.修改server.xml中<context></context>,设置相关的属性
3.在Catalina里配置localhost,新建一个跟站点名一样的.xml文件
3.servlet的生命周期
加载servlet,当tomcat第一次启动的时候就会加载servlet
初始化,init()一次
service()多次
destory()一次,tomcat关闭的时候调用
转发和重定向的区别
转发是发生在服务器上的,在浏览器上是透明的,所以浏览器的地址不发生转变,实现的是一个http请求,用于实现业务逻辑的处理
重定向是发生在浏览器山,服务器反馈给浏览器一个新的地址访问,所以浏览器的地址发生变化,实现了两次http请求,用于提交了表单,防止重复提交,所以跳转至不同的页面
request对象作为域对象在不同的servlet 之间通信
一次会话:
从打开浏览器到关闭浏览器,称为一次会话
会话跟踪技术
cookie流程:浏览器访问服务器,如果服务器需要记录该用户的状态,就使用response向浏览器发送一个cookie,浏览器会把cookie保存起来,当浏览器再次访问服务器的时候,浏览器会把请求的网址连同cookie一同交给服务器。
http是无状态的连接,当数据提交完后,浏览器和服务器之间的连接就会关闭,再次交互的时候就需要再次重新建立新的连接。
网页中所有的信息都是可以设备的,只需要知道有什么是需要设置,如何设置就简单了,换句换说就是你需要了解一次流程是怎样的
我如何发送请求给服务器
请求的格式是什么样子的
请求的内容应该如何写
谁处理我的请求
如何处理
处理完之后又接下来交给谁
做怎样的业务逻辑
将我处理后的业务逻辑如何反馈给浏览器
这样一系列的操作,说简单也简单,但是里边设计的细节太多
包括安全、速度、相应时间
cookie\session\domain\
cookie 不同的域之间的cookie 是不能交叉访问的,除非你在response中指明了我需要从那一个域中找cookie
cookie是存储在浏览器中的,存在每一个用户的本地,发送请求后服务器就可以去找是否已经有了这个网站的cookie,如果有就读取,没有就新建
session是存在服务器上的,
区别
cookie只能村字符串
session可以存任何东西,可以把它看成是一个容器
cookie存在浏览器里,所以有一定的危险
session存在服务器里对用户是透明
cookie的有效期长
session的有效期随着浏览器关闭就失效
cookie不会对服务器造成负担
session 会对服务器造成负担
同步异步阻塞非阻塞
同步和异步是目的(异步会有通知)(阻塞会一直等待,非阻塞不会一直等待)
阻塞和非阻塞是实现方式
同步和异步是针对应用程序和内核的交互而言的。
阻塞和非阻塞是针对进程在访问数据的时候,根据io操作的就绪状态来采取的不同方式
阻塞方式下读取或写入函数将一直等待
非阻塞方式下读取或写入函数会立即返回一个状态值(那就需要监控,如何实时监控这个返回值,多路复用器)
一个IO操作就是发起请求和执行请求
同步阻塞(BIO):
在此种方式下,用户进程在发起一个IO操作以后,必须等待IO操作的完成,只有当真正完成了IO操作以后,用户进程才能运行。JAVA传统的IO模型属于此种方式。
就是我必须等你做完,我才可以开始,在此期间需要一直等待你做
同步非阻塞(NIO):
在此种方式下,用户进程发起一个IO操作以后便可返回做其它事情,但是用户进程需要时不时的询问IO操作是否就绪,这就要求用户进程不停的去询问,从而引入不必要的CPU资源浪费。其中目前JAVA的NIO就属于同步非阻塞IO。
发起请求后就去作别的事情,我可以时不时的去看看你到底做完了没有
异步非阻塞(AIO):
此种方式下是指应用发起一个IO操作以后,不等待内核IO操作的完成,等内核完成IO操作以后会通知应用程序。真正的IO操作是由内核完成的,应用程序只需要得到处理完的结果就可以了。
http可以配置多个虚拟主机,当用户去访问的时候还以为是在访问多个站点,其实只有一个
http请求报文:
请求行,包括请求方式,请求资源,使用的http协议
首部字段
一个空行
报文实体
响应报文:
一个状态行
首部字段
一个空行
返回的报文主体
200正常处理
204成功处理,但服务器没有返回新数据,显示页面不更新
206,对服务器进行范围请求,只返回一部分数据
301 请求的资源已分配新的URI,URL改变了,是永久改变
302 请求的资源临时分配了新的URI ,URL没变,临时重定向
303,与302功能相同,但是指明客户端请求的方式是get
307,与302相同,但是不会把POST请求变为GET
400 请求报文语法错误
401 需要认证身份
403 没有访问权限
404 服务器没有这个资源
500内部资源出错了
503 服务器正忙
进程是资源分配的基本单位,是程序的一次执行
线程是资源调度的基本单位,是程序使用CPU的最基本单位。
继承Thread类
实现Runnable接口
run 方法仅仅是封装线程执行的代码,如果直接调用就是普通方法
start方法才是真正启动了线程,由jvm去调用线程的run 方法