zoukankan      html  css  js  c++  java
  • 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:aidu"
                unpackWARs="true" autoDeploy="true"
                xmlValidation="false" xmlNamespaceAware="false">
    </Host>

    * 重启tomcat
    4)修改本机hosts文件
    * win7 系统 ,将hosts文件复制到桌面修改,改后复制回去
    192.168.1.145   www.baidu.com
    5)将c:aidumain 网站根目录 配置为缺省虚拟目录

    <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();
        }
    }
  • 相关阅读:
    LeetCode 面试题32
    LeetCode 102. 二叉树的层序遍历
    LeetCode 面试题32
    LeetCode 面试题32
    LeetCode 面试题31. 栈的压入、弹出序列
    LeetCode 946. 验证栈序列
    LeetCode 50. Pow(x, n)
    LeetCode 572. 另一个树的子树
    LeetCode 面试题50. 第一个只出现一次的字符
    LeetCode 面试题37. 序列化二叉树
  • 原文地址:https://www.cnblogs.com/EvanLiu/p/3314348.html
Copyright © 2011-2022 走看看