Web服务器常用配置
HTTP协议
web开发 ------ 网站制作
web资源两类:静态、动态
静态资源:固定数据文件(图片、文本、音频、视频、静态网页文件 html) 动态资源:通过程序生成数据文件 客户端访问静态资源时,服务器直接响应 客户端访问动态资源时,服务器需要把动态资源转换成静态资源,再响应访问web资源:
协议名://域名:端口号/路径 URL:http://www.itcast.cn:80/index.html http协议的默认端口是80,也就是说,在你没有给出端口时,等同于给出了80网页设计:
静态网页 : HTML CSS JavaScript 静态网页开发技术动态网页技术: 98前后 ASP PHP JSP
.net(微软技术集合 VB ASP C#) 、python、ruby(快速开发网页 语言 10分钟开发一套博客系统【脚手架】)当今网站开发 主流技术: .net 和 php
学习javaweb ----- CRM 、ERP、OA 定制web界面
JVM支持多种脚本 语言: Jruby、Groovy
这些开发语言都比Java开发web前端展示界面的效率要高,Java语言主要是应用于服务端的后台管理Web系统 采用 B/S结构 :Browser -- Server
1、浏览器向服务器发送访问目标资源请求 (请求) 2、服务器根据请求的目标资源路径,在服务器端进行查找 (请求处理) 3、服务器会将查找结果 返回给客户端浏览器 (响应) * 在B/S系统中必须先产生请求,才会生成响应 ---- 请求和响应是成对出现的 什么是web服务器? 硬件环境、软件环境 在网络中安装web服务软件的计算机 web服务器软件环境搭建 1、weblogic BEA公司产品 ,随着BEA已经被oracle收购 ---- 全面支持JavaEE 所有规范 ,收费的 2、websphere IBM 公司产品,功能比weblogic更加强大和复杂 ----- 全面支持JavaEE 规范,收费 3、Apache Tomcat 免费、开源,Google的很多java开发web应用都是搭建tomcat环境上 ---- 在企业中小型java项目都是搭建tomcat上 * tomcat 不支持所有javaee规范,只支持 Servlet/JSP/JNDI/JavaMail 等JavaEE规范JBOSS --- EJB服务器 JBOSS公司产品
1、去Apache官方网站下载tomcat服务器
tomcat 主流下载版本 5.5 6.0 7.0 ---- 最新版本7.0 * 课程以tomcat6.0 为主 下载6.0 zip格式2、 解压缩tomcat
* 不要使用含有空格和中文目录3、启动tomcat之前 配置 JAVA_HOME 环境变量 ------ 配置JDK安装路径
* 注意 JAVA_HOME 使用 下划线 , 配置JDK安装路径时,一定不要以; 结尾4、启动tomcat服务器
双击bin/startup.bat (如果使用linux 双击bin/startup.sh) 输入 http://localhost:8080/ 访问tomcat网站主页5、因为网站通过HTTP协议访问,HTTP协议默认端口80 ------ 修改tomcat服务器启动端口 80 ------ 端口是0~65535之间的一个整数,0~1023被OS使用
修改 conf/server.xml<Connector port="8080" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" /> 将8080 修改为 80 访问localhost:80 端口 ----- 省略端口写法 http://localhost 访问站点
http://localhost --> localhost表示本机
http://127.0.0.100 --> 127.0.0.1本机默认IP http://192.168.3.100 --> 192.168.3.100是我的真实IP tomcat启动问题 1、窗口一闪然后消失 ----- 编辑startup.bat 在文件末尾加入 pause指令,再次运行,读取错误原因,根据原因解决 * JAVA_HOME路径必须是JDK不可以是JRE 2、端口占用问题 发现端口被占用后,通过cmd命令行,查看占用端口进程 --- netstat -ano (xp win7 通用) 在任务管理器关闭 该进程 * windows系统 WWW服务 --- IIS服务 --- 发现占用端口进程system (证明一个服务占用端口 --- 通过services.msc 找到并关闭www服务) 3、CATALINA_HOME环境变量 指定tomcat安装位置 (该环境变量可以不配置) ---- 如果配置出错,tomcat将无法启动
Tomcat 支持Servlet和JSP规范,Servlet技术属于JavaEE规范
* 随着javaEE 版本提升 -- Servlet版本提升 --- 运行Servlet环境Tomcat版本提升 * tomcat运行需要JDK 环境版本提问:如果编写 JavaEE5.0工程 需要哪个版本tomcat可以运行? 6.0 7.0
web应用程序指供浏览器访问的程序,通常也简称为web应用
一个web应用由多个静态web资源和动态web资源组成,如: |--html css javascript 图片 音频 视频 文本 --- 静态web资源 |--Java程序、Servlet、JSP文件、支持jar包 ---- 动态web资源 |--配置文件等等 组成web应用的这些文件通常我们会使用一个目录组织,这个目录称为web应用所在目录(也叫网站的根目录)网站开发好后,如果想让网站被外界访问,需要将网站发布到 web服务器tomcat上 这个过程称之为虚拟目录映射
开发web应用时,不同类型的文件有严格的存放规则,否则不仅可能会使web应用无法访问,还会导致web服务器启动报错
网站的标准目录结构
站点根目录 ------- 静态web资源、jsp ------- WEB-INF目录 ------- classes目录 (保存.class文件) ------- lib 目录 (当前网站需要jar包) ------- web.xml (网站配置文件) * WEB-INF目录不是必须的,没有java动态程序代码, 可以没有WEB-INF 目录 * WEB-INF目录下资源不能被浏览器直接访问,由web服务器负责调用 配置 |-- <Host>虚拟主机 |-- <Context>虚拟目录
原理:配置<Context>元素
1、配置tomcat/conf/server.xml <Host name="localhost" > 内部 添加 <Context> 元素 <Context path="/aa" docBase="C:\AA" /> ----- > 为网站配置虚拟目录 /aa ---- 映射到 c:\AA 目录 * 修改server.xml 重启tomcat2、$CATALINA_HOME/conf/[enginename]/[hostname]/xxx.xml
tomcat/conf/Catalina/localhost/xxx.xml 在conf下新建 Catalina 在Catalina下新建 localhost 在localhost下 新建 bb.xml <Context docBase="C:\BB" /> ------ 为什么不需要写path ---- 虚拟目录就是文件名bb path值 默认 /bb * 添加 bb.xml 不用重启tomcat * 推荐第二种写法(不需要重启服务器,而且出错不会影响其它工程运行),尽量不要使用第一种3、将网站复制到tomcat/webapps
* 不用重启tomcat * tomcat 会根据文件夹名称,自动生成虚拟路径 CC文件夹 ---- 虚拟路径 /CC虚拟目录? 浏览器访问网站采用访问路径 /aa /bb /abc ---- 这些路径不一定是服务器真实存在目录,只是浏览器在访问这些路径时,映射到指定网站根目录
4、通过WAR方式发布部署web应用
WAR包制作 ? 当网站非常大,数据非常多,将开发平台网站发布到服务器运行环境 (在java中为了发布的便利性 使用war包 ) 什么是war包? zip格式应用数据压缩包 (不能是rar格式)先用压缩软件 将网站制作xx.zip --- 重命名 xx.war --- 复制war到tomcat/webapps --- war包的添加和删除,tomacat会自动解压或删除相应文件夹
域名解析完整过程
(程序员用其管理已经发布到tomcat的网站)
*conf/tomcat-users.xml 加入 <role rolename="manager"/> <user username="tomcat" password="s3cret" roles="manager"/> * 重启服务器 * 这个功能默认不要开启 (安全问题)---> 虚拟主机目录、缺省虚拟根目录、欢迎页面的相应配置 使得本地www.baidu.com以假乱真
所谓配置虚拟主机,就是在tomcat服务器中配置一个网站
在tomcat内部同时 架设多个网站 --- 百度网站、谷歌网站、传智播客 * 虚拟主机技术 ---- 在tomcat中配置 <Host> 元素 1、下载要搭建在tomcat中的网站 --- baidu 2、在c盘 新建虚拟主机目录 baidu , 在虚拟主机目录中新建网站根目录 main , 将百度网站复制main 目录中 注意一下appBase="C:\baidu",这里的baidu文件夹代表的不是一个项目的根目录,而是一个存放了一个或者多个JavaWeb应用的文件夹 3、在tomcat的conf/server.xml中新建<Host> <Host name="www.baidu.com" appBase="C:\baidu" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> </Host> * 重启tomcat 4、修改本机hosts文件 ---> 配置的主机(网站)要想通过域名被外部访问,必须在DNS服务器或windows系统中注册访问网站时使用的域名 * win7 系统 ,将hosts文件复制到桌面修改,改后复制回去 192.168.1.145 www.baidu.com 5、将c:\baidu\main 网站根目录 配置为缺省虚拟目录 <Context path="" docBase="main" /> ----- 配置缺省虚拟目录 ----- /main就可以省略了 http://www.baidu.com/baidu.htm ---- 访问本机百度 * 重启tomcat 6、将main目录 baidu.htm 配置为网站欢迎页面 在C:\baidu\main目录下 新建WEB-INF目录 下新建web.xml <?xml version="1.0" encoding="ISO-8859-1"?> <web-app xmlns="http://java.sun.com/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" version="2.5"> <welcome-file-list> <welcome-file>baidu.htm</welcome-file> </welcome-file-list> </web-app> * 重启tomcathosts的应用
1、限制用户上网 ,网站禁止访问,网站域名配置到hosts里 2、软件破解,验证的网址映射到本机只有缺省虚拟主机可以通过ip访问
1. General --> Workspace --> UTF-8 2. General --> Editors --> Associations --> MyEclipse JSP Editors 3. 搜索jsp --> UTF-8 4. Java --> Installed JREs --> 添加 5. Tomcat 6. 去除MyEclipse自带tomcat 7. General --> Startup and Shutdown --> MyEclipse Derby
* 修改 发布虚拟目录名称 --- 右键工程属性 --- myeclipse ---web ----修改Web Context-root
JavaWeb项目是在Tomcat上运行
我们使用MyEclipse来编写JavaWeb项目,但最终发布到Tomcat的webapps目录下即:MyEclipse是我们开发的环境,Tomcat才是运行环境!
服务端作为申请者,让CA机构对发送数据方的公钥进行认证和加密,认证加密后的公钥即是数字证书,也成为CA证书,证书中包含了很多信息,最重要的就是申请者的公钥
CA机构在给公钥加密时,用的是一个统一的密码对,加密公钥时使用的是其中的私钥。这样,申请者拿到证书后,在发送数据时,用自己的私钥生成签名,将签名、证书和发送内容一起发给对方 浏览器下载证书颁发机构的公钥 --> CA根证书(CA公钥) --> 解密证书 --> 获得发送数据方的公钥 --> 解密发送方发过来的数字签名(摘要) --> 获取摘要 --> 使用与发送方同样的Hash算法计算摘要值 --> 作对比,以验证数据完整性 签名操作是发送方用私钥进行签名,接受方用发送方证书来验证签名;加密操作则是用接受方的证书进行加密,接受方用自己的私钥进行解密。非对称加密算法:RSA,DSA/DSS
对称加密算法:AES,RC4,3DESHASH算法:MD5,SHA1,SHA256
web开发 必须先 熟悉 http协议
客户端和服务器建立通信连接后,进行数据交互,使用协议进行交流
TCP特征 : 三层握手
1)、A给B 说话: 能听到我说话吗? 2)、B回应:我能听到,能听到我说话吗? 3)、A回应:我也能听到 确保通信畅通的 ---- 数据传输不允许丢包 A 给 B 发数据,如果B 没有回应,A 选择重新发送 ----- 超时2、默认端口80 省略端口 http://www.itcast.cn 省略 :80
3、基于请求-响应模式的协议
先请求,再出现响应 ---- 请求和响应 一一对应
实验一 : 通过telnet 连接服务器,进行协议操作
XP 自动安装telnet win7 系统 安装telnet插件 * telnet 采用 传输层连接原理方式 通信内容必须严格按照应用层协议 语法:telnet ip port 1、 cmd> telnet localhost 80 2、手动输入HTTP协议请求 telnet乱码解决:ctrl+] 回车 3、输入协议内容 GET / HTTP/1.0 HOST: localhost回车
实验二 : 安装Httpwatch 完成访问web页面时 http协议数据包 抓取查看网络连接过程中 http协议内容
请求内容:
GET / HTTP/1.1 Accept: image/gif, image/x-xbitmap, image/jpeg, image/pjpeg, application/x-shockwave-flash, application/msword, application/vnd.ms-excel, application/vnd.ms-powerpoint, */* Accept-Language: zh Accept-Encoding: gzip, deflate User-Agent: Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1; .NET CLR 2.0.50727) Host: localhost Connection: Keep-Alive响应内容:
HTTP/1.1 200 OK Server: Apache-Coyote/1.1 ETag: W/"7347-1184876416000" Last-Modified: Thu, 19 Jul 2007 20:20:16 GMT Content-Type: text/html Content-Length: 7347 Date: Sat, 09 Jun 2012 07:02:35 GMT <?xml version="1.0" encoding="ISO-8859-1"?> ... HTTP 和 HTML 关系? HTTP 通信协议 规定数据传输格式 HTML 网页设计语言,静态网页数据HTTP 传输格式 、HTML 传输内容
HTTP/1.0、HTTP/1.1 区别?
1.0 一次与服务器连接 只能获得一个资源 1.1 一次与服务器连接 ,连续获得多个资源思考题:
一个web页面中,使用img标签引用了三幅图片,当客户端访问服务器中的这个web页面时,客户端总共会访问几次服务器,即向服务器发送了几次HTTP请求。 * 三幅图片地址是否相同如果三幅图片地址都不相同 --- 4次请求
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <img src="1.jpg"/> <img src="1.jpg"/> <!-- 第二次访问 1.jpg 不会产生新的请求 --> <img src="1.jpg"/> </body> </html>
请求中第一行信息 ---- 包括三个部分请求方式、资源路径、HTTP协议版本
例如: GET / HTTP/1.1 HTTP请求方式有几种 : POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT 常用两种: GET 、 POST 客户端网页哪些是GET方式请求? 哪些是 POST 请求 GET方式 :1、用户直接在浏览器上手动输入url地址 2、<a href="url"></a> 3、<form method="get" > *form表单默认提交方式就是get POST方式: 1、<form method="post" > GET提交方式和POST提交方式区别 ? Get url地址后携带数据有大小限制 1K ,提交数据在url上显示 * http://localhost/day04/url?username=zhangsan 格式 url?name=value&name=value&name=value... 以?分隔url和参数,参数采用键值对格式,多个参数使用& 符合分隔 POST 数据在请求体中,不在url上显示 ,没有数据大小限制* username=zhangsan 请求体和头信息直接存在一个空行
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> <title>Insert title here</title> </head> <body> <!-- 在页面内编写几种提交方式 --> <h1>通过链接的get提交</h1> <a href="url">link</a> <h1>通过form表单 get</h1> <form action="url"> 用户名 <input type="text" name="username"/> <input type="submit" value="get提交" /> </form> <h1>通过form表单 post</h1> <form action="url" method="post"> 用户名 <input type="text" name="username"/> <input type="submit" value="post提交" /> </form> </body> </html>
很多key -value
Accept: text/html,image/* ----- 客户端可以接收文件类型 text/html HTML文件 image/* 任意格式图片 Accept-Charset: ISO-8859-1 ----- 客户端可以识别编码字符集 Accept-Encoding: gzip ----- 客户端可以识别压缩数据格式 gzip是一种压缩格式 Accept-Language:zh-cn ----- 客户端浏览器语言 Host: www.itcast.com:80 ----- 访问服务器地址 If-Modified-Since: Tue, 11 Jul 2000 18:23:51 GMT ----- 该请求的资源在客户端保存最后访问时间 (缓存有关) Referer: http://www.itcast.com/index.jsp ---- 上一次请求访问页面地址 User-Agent: Mozilla/4.0 (compatible; MSIE 5.5; Windows NT 5.0) ---- 客户端浏览器类型版本 Connection: close/Keep-Alive ---- 该次请求连接后,连接是保持还是关闭 1.0 关闭 1.1 保持 Date: Tue, 11 Jul 2000 18:23:51 GMT ---- 请求时间******* Accept-Encoding 、If-Modified-Since 、Referer
Referer 防止客户盗链数据 :通过google搜索页面直接下载 其它网站数据 (盗链)
package ustc.lichunchun.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //通过 /referer 访问java程序 public class RefererServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String referer = request.getHeader("referer");//获得头信息 response.setContentType("text/html;charset=gbk");//utf-8 if(referer == null || !referer.startsWith("http://192.168.1.104/")){ response.getWriter().println("盗链可耻!"); return; }else{ response.getWriter().println("XX网站促销信息......"); return; } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } } 模拟浏览器访问服务器 获得 RefererServlet 当中信息 1) URL 连接 ---- HTTP协议
2) Socket 连接 ----- TCP协议
package ustc.lichunchun.url; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; public class URLTest { // 模拟客户端,绕过防盗链逻辑,获得需要信息 public static void main(String[] args) throws Exception { // 1、创建URL对象 URL url = new URL("http://localhost/day04/referer"); // 2、链接目标资源 URLConnection connection = url.openConnection(); connection.addRequestProperty("referer", "http://localhost/day04/index.jsp"); // 获得网站输入流 InputStream in = connection.getInputStream(); byte[] buf = new byte[1024]; in.read(buf); for (byte b : buf) { System.out.write(b); } System.out.flush(); } }
存放客户端提交post 请求 数据
key=value&key=value&key=value ....例如 : username=sss
响应数据 分为三个部分 :状态行、头信息、响应体
分为三个部分: HTTP协议版本、状态码、描述信息
例如: HTTP/1.1 200 OK 100~199 Informational 请求信息不足 ,还需要其他信息才能处理 200~299 Success 请求处理成功 300~399 Redirection 服务器已经处理完毕,客户端还需要进一步动作 400~499 Client Error 客户端错误500~599 Server Error 服务器端错误
200 请求处理成功
302 客户端进行重定向
304 客户端访问的资源没有被修改过,客户端访问本地缓存
404访问资源不存在
500 服务器内部出错
借钱 200 A 找 B 借钱 B 将钱 借个A 302 A 找 B 借钱 B 通知 A 找C 借钱 --- A 找C 借钱 304 A 找 B 借钱 , B对A 说 借过了 --- A 使用 之前从B 借的钱 404 没钱505 B 不存在了
* 重定向 两次请求 两次响应
package ustc.lichunchun.servlet; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //访问 /redirect 就可以访问这个java程序 完成重定向 (重定向 两次请求 两次响应) public class RedirectServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setStatus(302);//设置状态码302 response.setHeader("Location", "/day04/hello.html"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { } }
Server:apache tomcat ----- 服务器类型
Content-Encoding: gzip ---- 设置响应数据压缩格式 ---- 与请求的头信息中 Accept-Encoding 字段对应* 如果响应数据经过压缩 传输体积更小,性能更好
没有压缩情况下 13605字节 http://localhost/docs/ 如何设置tomcat压缩 ? * 通过设置 tomcat/conf/server.xml 设置响应数据压缩
<Connector port="80" protocol="HTTP/1.1" connectionTimeout="20000" redirectPort="8443" compressableMimeType="text/html,text/xml,text/plain" compression="on"/>* 清除浏览器缓存,重启tomcat
4244字节 http://localhost/docs/ Content-Length: 80 ----- 响应数据长度 Content-Language: zh-cn ----- 响应数据语言 Content-Type: text/html; charset=GB2312 ----- 响应数据类型 * 数据类型采用Mime协议规定类型 html文件 ---- text/html、 jpg文件---- image/jpeg * 在 tomcat/conf/web.xml 中查看文件mime类型 Last-Modified: Tue, 11 Jul 2000 18:23:51 GMT ----- 和请求头信息 If-Modified-Since一起使用,控制服务器缓存 * ETag: W/"13397-1184876416000" tomcat生成Etag 13397文件大小 1184876416000文件最后修改时间(精确毫秒) * 客户端下次请求时通过If-None-Match 携带刚刚 Etag信息* Etag/If-None-Match 比 Last-Modified/If-Modified-Since 更加准确、强大,可以是任意的字符串内容
Tomcat缓存策略
Refresh: 1;url=http://www.it315.org ----- 网页自动跳转 Content-Disposition: attachment; filename=aaa.zip ----- 文件下载时指定文件附件名称 控制该程序在客户端不缓存,同时使用以下三句: Expires: -1 Cache-Control: no-cache Pragma: no-cache * 使用三句来禁止缓存的原因是,为了防止浏览器的兼容问题 * 对于动态程序,经常修改, 禁止浏览器缓存内容
* 使用Debug模式启动Tomcat服务就可以使MyEclipse自动部署改动过的类
package ustc.lichunchun.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; //客户端 访问/nocache 访问改程序 public class NoCacheServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 需要三句禁止缓存,防止浏览器兼容问题 response.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. response.setHeader("Pragma", "no-cache"); // HTTP 1.0. response.setDateHeader("Expires", 0); // Proxies. response.getWriter().println("Hello No Cache Debug Mode Start Tomcat!"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
Connection: close/Keep-Alive ---- 响应后连接是否关闭
Date: Tue, 11 Jul 2000 18:23:51 GMT --- 响应时间 重点:302结合Location进行重定向 、在tomcat配置gzip压缩 、tomcat缓存策略 、禁止浏览器缓存通常HTML 文件内容 ---- 如果设置响应体进行gzip压缩,看到gzip压缩内容