JavaEE:Tomcat服务器常用配置和HTTP简介
Web服务器常用配置
1.Web系统采用B/S结构通信的:Browser --- Server
1)浏览器向服务器发送访问目标资源请求(请求)
2)服务器根据请求的目标资源路径,在服务器端进行查找(请求查找)
3)服务器会将查找结果返回给客户端浏览器(响应)
通信结构图:
2.什么是Web服务器?
包括硬件环境和软件环境,在网络中安装web服务器软件的计算机
3.Tomcat服务器安装和配置
1)在Apache官网上下载tomcat服务器
*一般采用zip格式的(可直接解压使用)
2)解压缩tomcat
*不要使用含有空格和中文目录的文件夹
3)启动tomcat之前,配置JAVA_HOME环境变量 ---- 配置JDK安装路径
*注意JAVA_HOME使用下划线
4)启动tomcat服务器
双击bin/startup.bat(如果使用linux双击bin/startup.sh)
输入http://localhost:8080/ 访问tomcat网站主页
5)因为网站通过HTTP协议访问,HTTP协议默认端口80 ---- 修改tomcat服务器启动端口80
修改conf/server.xml
<Connector port="80" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443" /> 将8080修改为80
访问localhost:80端口 ----- 省略端口写法 http://localhost访问站点
4.tomcat启动问题
1)窗口一闪然后消失 ----- 编辑startup.bat,在文件末尾加入pause指令,再次运行,读取错误原因,根据原因解决
*JAVA_HOME路径必须是JDK不可以是JRE
2)端口占用问题
发现端口被占用后,通过cmd命令行,查看占用端口进程 ---- netstat –ano
在任务管理器关闭该进程
3)CATALINA_HOME环境变量
指定tomcat安装位置(该环境变量可以不配置) ---- 如果配置出错,tomcat将无法启动
5.各种版本对应问题
Tomcat版本 Servlet/JSP版本 JavaEE版本 运行环境
4.1 2.3/1.2 1.3 JDK1.3
5.5 2.4/2.0 1.4 JDK1.4
6.0 2.5/2.1 5.0 JDK5.0
7.0 3.0/2.2 6.0 JDK6.0
Tomcat 支持Servlet和JSP规范,Servlet技术属于JavaEE规范
* 随着javaEE 版本提升 -- Servlet版本提升 --- 运行Servlet环境Tomcat版本提升
* tomcat运行需要JDK 环境版本
如果编写 JavaEE5.0工程 需要哪个版本tomcat可以运行? 6.0 7.0
6.Tomcat目录结构
bin --- 存放tomcat启动关闭程序
conf --- 存放tomcat配置文件
lib --- tomcat运行需要jar包
logs --- tomcat日志文件
webapps --- 网站发布目录(所有网站可以发布到该目录)
work --- 存放工程运行时,产生数据文件(JSP翻译Servlet、Session持久化数据)
7.网站的标准目录结构
站点根目录
------- 静态web资源、jsp
------- WEB-INF目录
------- classes目录 (保存,class文件)
-------- lib 目录 (当前网站需要jar包)
-------- web.xml (网站配置文件)
* WEB-INF目录不是必须的,没有java动态程序代码, 可以没有WEB-INF 目录
* WEB-INF目录下资源不能被浏览器直接访问
8.网站开发好后,如果想让网站被外界访问,需要将网站发布到 web服务器tomcat上 (虚拟目录映射)
Tomcat发布网站三种方式
原理:
配置<Context>元素
1)配置tomcat/conf/server.xml
在<Host name=”localhost”>内部添加<Context>元素
<Context path="/aa" docBase="C:\AA" /> ---- 为网站配置虚拟目录 /aa ------映射到 c:\AA目录
*修改server.xml 重启tomcat
2)$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会根据文件夹名称,自动生成虚拟路径
9.虚拟目录?
当浏览器访问网站采用访问路径 /aa /bb /abc ----- 这些路径不一定是服务器真实存在目录,只是浏览器在访问这些路径时,映射到指定网站跟目录
10.WAR包制作?
先用压缩软件将网站制作xx.zip --- 重命名 xx.wat ---- 复制war到tomcat/webapps
11. Tomcat Manager 使用 (程序员管理已经发布到tomcat网站)
*conf/tomcat-users.xml 加入
<role rolename="manager"/>
<user username="tomcat" password="s3cret" roles="manager"/>
* 重启服务器
* 这个功能默认不要开启 (安全问题)
12.域名解析完整过程图:
在tomcat内部同时 架设多个网站 --- 百度网站、谷歌网站
* 虚拟主机技术 ---- 在tomcat中配置 <Host> 元素
1)搭建tomcat中网站 --- baidu
2)在c盘 新建虚拟主机目录 baidu , 在虚拟主机目录中新建网站根目录 main , 将百度网站复制main 目录中
3)在tomcat中新建
<Host> Host name="www.baidu.com" appBase="C:\baidu" unpackWARs="true" autoDeploy="true" xmlValidation="false" xmlNamespaceAware="false"> </Host>
* 重启tomcat
4)修改本机hosts文件
* win7 系统 ,将hosts文件复制到桌面修改,改后复制回去
192.168.1.145 www.baidu.com
5)将c:\baidu\main 网站根目录 配置为缺省虚拟目录
<Context path="" docBase="main" />
----- 配置缺省虚拟目录 /main 省略
http://www.baidu.com/baidu.htm ---- 访问本机百度
6)将main目录 baidu.htm 配置 网站欢迎页面
新建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>
hosts应用
1、限制用户上网 ,网站禁止访问
2、软件破解
13.缺省虚似主机 DefaultHost
<Engine name="Catalina" defaultHost="localhost"> ----- 一个tomcat中可以配置多台虚拟主机,但是只有一台虚拟主机。客户端可以直接通过ip访问
http://www.baidu.com ---- 客户端通过域名访问
http://192.168.1.145 ---- 通过ip访问
只有缺省虚拟主机可以通过ip访问
14. MyEclipse 整合 tomcat 进行 web 程序开发
1)配置myeclipse 内部tomcat 插件
配置tomcat6 在 window - preferences -- tomcat6
检查JDK 版本是否符合
Launch 默认采用 debug model
2)将tomcat插件设置为enable 浏览tomcat目录后 配置ok
3)在MyEclipse中通过插件 tomcat6 --- start 实际上 运行tomcat/bin/startup.bat
4)在console窗口 查看tomcat日志
* tomcat6 --- stop server 正常关闭tomcat 调用 tomcat/bin/shutdown.bat
* 如果直接点击 myeclipse console 窗口 红色按钮 --- 强行停止tomcat
应用:
在myeclipse中编写一个web工程
1)创建web project
context root url 默认工程名
Javaee 规范版本
* 在使用javaee5 规范版本时,默认支持jstl技术
2)新建html 将html编辑器 设置 html editor
window -- preference ---- general ---- editor --- File Associations
3)发布工程到tomcat
原理:将当前web工程复制tomcat/webapps
* 修改 发布虚拟目录名称 --- 右键工程属性 --- myeclipse ---web ----修改Web Context-root
HTTP协议
1.HTTP协议特征
1)基于TCP传输协议
OSI七层网络体系结构
TCP是传输层协议
HTTP是应用层协议,基于TCP协议
TCP特征:三层握手
例如
A给B说话:能听到我说话吗?
B回应:我能听到,能听到我说话吗?
A回应:我也能听到
确保通信畅通 ---- 数据传输不允许丢包
A给B发数据,如果B没有回应,A选择重新发送 ----- 超时
2)默认端口80
3)基于请求 – 响应模式的协议
先请求,在出现响应 ----- 请求和响应一一对应
2.两个实验
实验一 : 通过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协议数据包 抓取
3.查看网络连接过程中 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"?>
...
4.HTTP和HTML关系?
HTTP通信协议,规定数据传输格式
HTML网页设计语言,静态网页数据
HTTP 传输格式、 HTML传输内容
5.HTTP/1.0、HTTP/1.1区别?
在HTTP1.0协议中,客户端与web服务器建立连接后,只能获得一个web资源
HTTP1.1协议,运行客户端与web服务器建立连接后,在一个连接上获取多个web资源
6.一个web页面中,使用img标签引用了三幅图片,当客户端访问服务器中的这个web页面时,客户端总共会访问几次服务器,即向服务器发送了几次HTTP请求?
*三幅图片地址是否相同
如果三幅图片地址都不相同 --- 4次请求
HTTP请求
请求完整格式包括三个部分:请求行、头信息、请求体
1.请求行:请求中第一行信息 --- 包括三个部分 请求方式、资源路径、HTTP协议版本
例如:GET / HTTP/1.1
HTTP请求方式有七种:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT
常用两种:GET、POST
1)客户端网页哪些是GET方式请求?哪些是POST请求
GET方式:1、用户直接在浏览器上手动输入url地址 2、<a href="url"></a>
3、<form method="get"> *form表单默认提交方式就是get
POST方式:1、<form method="post">
2)GET提交方式和POST提交方式区别?
GET提交方式后携带数据有大小限制1K,提交数据在url上显示
*http://localhost/day04/url?username=zhangsan 格式 url?name=value&name=value&name=value...
以?分隔url和参数,参数采用键值对格式,多个参数使用&符号分隔
POST数据在请求体重,不再url上显示,没有数据大小限制
*uesrname=zhangsang 请求体和信息头直接存在一个空行
2.头信息
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 ---- 请求时间
3.请求体:存放客户端提交post请求数据
key=value&key=value&key=value ....
例如:username=sss
4.Referer防止客户盗链数据
eg:模拟浏览器访问服务器获得refererServlet当中信息
1)URL连接 --- HTTP协议
2)Socket连接 --- TCP协议
eg:
package cn.lsl.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; 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"); if(referer == null || !referer.startsWith("http://localhost")){ //盗链 response.getWriter().println("盗链!"); return; }else{ response.getWriter().println("XX网站欢迎您。。。。"); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
直接输入网址,则会被当做盗链
从该网站的某个页面点进去则能正常访问
<%@ page language="java" import="java.util.*" pageEncoding="ISO-8859-1"%> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> </head> <body> <a href="referer">link</a> </body> </html>
模拟客户端,绕过防盗链逻辑,获得需要信息
package cn.lsl.servlet; import java.io.InputStream; import java.net.URL; import java.net.URLConnection; public class URLTest { public static void main(String[] args) throws Exception { //创建URL对象 URL url = new URL("http://localhost:8080/HTTPTest/referer"); //链接目标资源 URLConnection connection= url.openConnection(); connection.addRequestProperty("referer", "http://localhost/index.jsp"); //获得网站输入流 InputStream in = connection.getInputStream(); byte[] buf = new byte[1024]; in.read(buf); //将流数据读取buf中 for(byte b : buf){ System.out.write(b); } System.out.flush(); } }
HTTP响应
响应数据 分为三个部分:状态行、头信息、响应体
1.状态行分为三个部分: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 服务器内部出错
2.响应头
Location: http://www.it315.org/index.jsp ---- 重定向地址 结合302一起使用
*重定向两次请求,两次响应
Server:apache tomcat ----- 服务器类型
Content-Encoding: gzip ---- 设置响应数据压缩格式
*如果响应数据经过压缩,传输体积更小,性能更好
例如:
在没有压缩情况下,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信息
Refresh: 1;url=http://www.it315.org ----- 网页自动跳转
Content-Disposition: attachment; filename=aaa.zip ----- 文件下载时指定文件附件名称
控制该程序在客户端不缓存(以下三个一起使用)
Expires: -1
Cache-Control: no-cache
Pragma: no-cache
*对于动态程序,经常修改,禁止浏览器缓存内容
Connection: close/Keep-Alive ---- 响应后连接是否关闭
Date: Tue, 11 Jul 2000 18:23:51 GMT --- 响应时间
3.响应体
通常为HTML文件内容 --- 如果设置响应体进行gzip压缩,看到gzip压缩内容
重定向:
eg:
package cn.lsl.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; public class RedirectServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setStatus(302); response.setHeader("Location", "index.jsp"); //重定向index.jsp } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } }
设置浏览器不缓存
eg:
package cn.lsl.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; public class NoCacheServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //需要三句禁止缓存,防止浏览器兼容问题 response.setDateHeader("expires", -1); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.getWriter().println("aabbcc"); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } }
通过HTTP协议Range头信息,实现断点下载功能
在连接服务器目标资源进行下载过程中,传递Range头信息,指定下载目标资源部分内容 --- 实现断点下载功能
断点下载:使用URL类模拟客户端访问WebRoot/info.txt,下载文件中内容
package cn.lsl.servlet; import java.io.FileOutputStream; import java.io.InputStream; import java.io.OutputStream; import java.net.URL; import java.net.URLConnection; public class RangeTest { //通过Range头信息实现断点下载 public static void main(String[] args) throws Exception { URL url = new URL("http://localhost:8080/HTTPTest/info.txt"); URLConnection connection = url.openConnection(); //通过addRequestProperty添加头信息,Range实现断点下载 connection.addRequestProperty("Range", "bytes=100-"); InputStream in = connection.getInputStream(); OutputStream out = new FileOutputStream("download.txt"); byte[] buf = new byte[1024]; int len; while((len = in.read(buf)) != -1){ out.write(buf, 0, len); } in.close(); out.close(); } }