IIS6反向代理Apache隐藏端口

因为服务器用的IIS6,一个开发需要ffmpeg-php扩展,任何方法都试用后安装不上,只好装了个Apache,80端口被IIS用去,给Apache设置了81端口,但是如何不输入端口即可访问网站呢?折腾许久也是有了方法。

比如:

Apache的站点链接为www.oneblog.me:81

首先安装ISAPI_Rewrite3,网上有破解版自行搜索,破解方法很简单,替换dll文件,小提醒一下,如果没有权限替换可以把原文件随便改个其他名字,再复制破解DLL也行,默认安装到C盘。

在IIS下新建个站点,目录为空,端口80,绑定好域名:www.oneblog.me。

IIS打开站点属性——ISAPI筛选器,新建筛选器,名称无所谓,可执行文件选择ISAPI_Rewrite3的安装目录下的ISAPI_Rewrite.dll

网站根目录下创建http.ini,内容为:

  1. [ISAPI_Rewrite]
  2. # 3600 = 1 hour
  3. CacheClockRate 3600
  4. RepeatLimit 32
  5. RewriteCond Host: www\.oneblog\.me
  6. RewriteProxy (.*) http\://www.oneblog.me:81$1 [I,F,U]

打开ISAPI_Rewrite3安装目录下的Helicon Manager.exe

左侧选择站点,右侧选择Import frome 2.0,打开选择网站目录下刚才创建的http.ini文件,最后点应用即可,这时候网站根目录下回自动生成.htaccess文件。

重启IIS,访问www.oneblog.me即访问Apache下的www.oneblog.me:81站点。

php关闭warning (PHP.ini中display_errors = Off失效的解决)

PHP.ini中display_errors = Off失效的解决
问题:
PHP设置文件php.ini中明明已经设置display_errors = Off,但是在运行过程中,网页上还是会出现错误信息。
解决:
经查log_errors= On,据官方的说法,当这个log_errors设置为On,那么必须指定error_log文件,如果没指定或者指定的文件没有权限写入,那么照样会输出到正常的输出渠道,那么也就使得display_errors 这个指定的Off失效,错误信息还是打印了出来。于是将log_errors = Off,问题就解决了。

DZ论坛3.2邮件设置检测成功却收不到邮件的原因

邮件设置后检测能成功,测试找回密码时却收不到邮件,原因如下:

1.站点信息管理员邮箱。

2.站长-邮件设置。

3.Ucenter-邮件设置。

三个地方的邮箱必须一样,坑爹啊。

DZ论坛折腾:记一次IIS6配置伪静态和FTP服务器搭建

环境:IIS6

论坛版本:Discuz! X3.2

论坛安装好后按照IIS Web Server(独立主机用户)规则创建httpd.ini文件至根目录,发现无效。

所以接下来知道了服务器没有配置组件,又搜到这篇教程 实现 DZX3.1伪静态 ,,针对 IIS6 ,于是照做起来,最后成功。

需要注意的几点:

1.虽然环境是IIS6但是教程里需要用的静态规则是“Apache Web Server(虚拟主机用户)”而不是IIS的。

2.静态规则里注意“如果程序放在根目录中,请将 /discuz 修改为 /

3.ISAPI_Rewrite3.1下载时选择其他下载,注意下载文件格式是rar而不是exe,exe的不要下载。(下载网站太多这样搞的)

4.ISAPI_Rewrite.dll如果遇到没权限替换的,修改下这个文件的名字扔一边不用管它,再复制破解文件就行。

论坛搭建好后才想起来没有FTP账户,然后发现IIS里没有安装FTP服务,然后控制面板里找到安装,安装服务后发现没有系统镜像源没办法安装,以前没有用过Filezilla也不知道干什么用的,网上搜索FTP服务器发现Filezilla,刚好服务器桌面也有个Filezilla快捷文件,然后点开,发现了新大门,虽然没用过,但摸索了两下就知道怎么用了,后面就不多说了…

DZX3.2去掉图片附件图片名称和下载次数

打开\template\default\forum\discuzcode.htm

找到:

onmouseover=”showMenu({‘ctrlid’:this.id,’pos’:’12’})”

删除之,后台更新缓存即可。

javaweb学习总结(四)——Http协议

一、什么是HTTP协议

HTTP是hypertext transfer protocol(超文本传输协议)的简写,它是TCP/IP协议的一个应用层协议,用于定义WEB浏览器与WEB服务器之间交换数据的过程。客户端连上web服务器后,若想获得web服务器中的某个web资源,需遵守一定的通讯格式,HTTP协议用于定义客户端与web服务器通迅的格式。

二、HTTP协议的版本

HTTP协议的版本:HTTP/1.0、HTTP/1.1

三、HTTP1.0和HTTP1.1的区别

在HTTP1.0协议中,客户端与web服务器建立连接后,只能获得一个web资源。
在HTTP1.1协议,允许客户端与web服务器建立连接后,在一个连接上获取多个web资源。

四、HTTP请求

4.1、HTTP请求包括的内容

客户端连上服务器后,向服务器请求某个web资源,称之为客户端向服务器发送了一个HTTP请求

一个完整的HTTP请求包括如下内容:一个请求行、若干消息头、以及实体内容
范例:

4.2、HTTP请求的细节——请求行

请求行中的GET称之为请求方式,请求方式有:POST、GET、HEAD、OPTIONS、DELETE、TRACE、PUT,常用的有: GET、 POST
用户如果没有设置,默认情况下浏览器向服务器发送的都是get请求,例如在浏览器直接输地址访问,点超链接访问等都是get,用户如想把请求方式改为post,可通过更改表单的提交方式实现。
不管POST或GET,都用于向服务器请求某个WEB资源,这两种方式的区别主要表现在数据传递上:如果请求方式为GET方式,则可以在请求的URL地址后以?的形式带上交给服务器的数据,多个数据之间以&进行分隔,例如:GET /mail/1.html?name=abc&password=xyz HTTP/1.1
GET方式的特点:在URL地址后附带的参数是有限制的,其数据容量通常不能超过1K。
如果请求方式为POST方式,则可以在请求的实体内容中向服务器发送数据,Post方式的特点:传送的数据量无限制。

4.3、HTTP请求的细节——消息头

HTTP请求中的常用消息头

accept:浏览器通过这个头告诉服务器,它所支持的数据类型
Accept-Charset: 浏览器通过这个头告诉服务器,它支持哪种字符集
Accept-Encoding:浏览器通过这个头告诉服务器,支持的压缩格式
Accept-Language:浏览器通过这个头告诉服务器,它的语言环境
Host:浏览器通过这个头告诉服务器,想访问哪台主机
If-Modified-Since: 浏览器通过这个头告诉服务器,缓存数据的时间
Referer:浏览器通过这个头告诉服务器,客户机是哪个页面来的  防盗链
Connection:浏览器通过这个头告诉服务器,请求完后是断开链接还是何持链接

例如:

  1. Accept: application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg,
  2.     application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*
  3. Referer: http://localhost:8080/JavaWebDemoProject/Web/2.jsp
  4. Accept-Language: zh-CN
  5. User-Agent: Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; WOW64; Trident/4.0; SLCC2;  .NET CLR 2.0.50727; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E; InfoPath.3)
  6. Accept-Encoding: gzip, deflate
  7. Host: localhost:8080
  8. Connection: Keep-Alive

五、HTTP响应

5.1、HTTP响应包括的内容

一个HTTP响应代表服务器向客户端回送的数据,它包括: 一个状态行、若干消息头、以及实体内容 。

范例:

  1. HTTP/1.1 200 OK
  2. Server: Apache-Coyote/1.1
  3. Content-Type: text/html;charset=ISO-8859-1
  4. Content-Length: 105
  5. Date: Tue, 27 May 2014 16:23:28 GMT
  6. <html>
  7.     <head>
  8.         <title>Hello World JSP</title>
  9.     </head>
  10.     <body>
  11.         Hello World!
  12.     </body>
  13. </html>

5.2、HTTP响应的细节——状态行

状态行格式: HTTP版本号 状态码 原因叙述<CRLF>
举例:HTTP/1.1 200 OK
状态码用于表示服务器对请求的处理结果,它是一个三位的十进制数。响应状态码分为5类,如下所示:

5.3、HTTP响应细节——常用响应头

HTTP响应中的常用响应头(消息头)
Location: 服务器通过这个头,来告诉浏览器跳到哪里
Server:服务器通过这个头,告诉浏览器服务器的型号
Content-Encoding:服务器通过这个头,告诉浏览器,数据的压缩格式
Content-Length: 服务器通过这个头,告诉浏览器回送数据的长度
Content-Language: 服务器通过这个头,告诉浏览器语言环境
Content-Type:服务器通过这个头,告诉浏览器回送数据的类型
Refresh:服务器通过这个头,告诉浏览器定时刷新
Content-Disposition: 服务器通过这个头,告诉浏览器以下载方式打数据
Transfer-Encoding:服务器通过这个头,告诉浏览器数据是以分块方式回送的
Expires: -1  控制浏览器不要缓存
Cache-Control: no-cache
Pragma: no-cache

六、在服务端设置响应头来控制客户端浏览器的行为

6.1、设置Location响应头,实现请求重定向

  1. package gacl.http.study;
  2. import java.io.IOException;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. /**
  8.  * @author gacl
  9.  *
  10.  */
  11. public class ServletDemo01 extends HttpServlet {
  12.     public void doGet(HttpServletRequest request, HttpServletResponse response)
  13.             throws ServletException, IOException {
  14.         response.setStatus(302);//设置服务器的响应状态码
  15.         /**
  16.          *设置响应头,服务器通过 Location这个头,来告诉浏览器跳到哪里,这就是所谓的请求重定向
  17.          */
  18.         response.setHeader(“Location”“/JavaWeb_HttpProtocol_Study_20140528/1.jsp”);
  19.     }
  20.     public void doPost(HttpServletRequest request, HttpServletResponse response)
  21.             throws ServletException, IOException {
  22.         this.doGet(request, response);
  23.     }
  24. }

当在浏览器中使用URL地址”http://localhost:8080/JavaWeb_HttpProtocol_Study_20140528/servlet/ServletDemo01″访问ServletDemo01时,就可以看到服务器作出响应后发送到浏览器的状态码和响应头信息,如下图所示:

服务器返回一个302状态码告诉浏览器,你要的资源我没有,但是我通过Location响应头告诉你哪里有,而浏览器解析响应头Location后知道要跳转到/JavaWeb_HttpProtocol_Study_20140528/1.jsp页面,所以就会自动跳转到1.jsp,如下图所示:

6.2、设置Content-Encoding响应头,告诉浏览器数据的压缩格式

  1. package gacl.http.study;
  2. import java.io.ByteArrayOutputStream;
  3. import java.io.IOException;
  4. import java.util.zip.GZIPOutputStream;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. /**
  10.  * @author gacl
  11.  *这个小程序是用来演示以下两个小知识点
  12.  *1、使用GZIPOutputStream流来压缩数据
  13.  *2、设置响应头Content-Encoding来告诉浏览器,服务器发送回来的数据压缩后的格式
  14.  */
  15. public class ServletDemo02 extends HttpServlet {
  16.     public void doGet(HttpServletRequest request, HttpServletResponse response)
  17.             throws ServletException, IOException {
  18.         String data = “abcdabcdabcdabcdabcdabcdab” +
  19.                 “cdabcdabcdabcdabcdabcdabcdabcdabc” +
  20.                 “dabcdabcdabcdabcdabcdabcdabcdabc” +
  21.                 “dabcdabcdabcdabcdabcdabcdabcdabcdab” +
  22.                 “cdabcdabcdabcdabcdabcdabcdabcdabcdab” +
  23.                 “cdabcdabcdabcdabcdabcdabcdabcdabcdab” +
  24.                 “cdabcdabcdabcdabcdabcdabcdabcdabcdab” +
  25.                 “cdabcdabcdabcdabcdabcdabcdabcdabcdabcd”;
  26.         System.out.println(“原始数据的大小为:” + data.getBytes().length);
  27.         ByteArrayOutputStream bout = new ByteArrayOutputStream();
  28.         GZIPOutputStream gout = new GZIPOutputStream(bout); //buffer
  29.         gout.write(data.getBytes());
  30.         gout.close();
  31.         //得到压缩后的数据
  32.         byte g[] = bout.toByteArray();
  33.         response.setHeader(“Content-Encoding”“gzip”);
  34.         response.setHeader(“Content-Length”,g.length +“”);
  35.         response.getOutputStream().write(g);
  36.     }
  37.     public void doPost(HttpServletRequest request, HttpServletResponse response)
  38.             throws ServletException, IOException {
  39.         this.doGet(request, response);
  40.     }
  41. }

服务器发给浏览器的响应信息如下:

浏览器支持的压缩格式有:

6.3、设置content-type响应头,指定回送数据类型

  1. package gacl.http.study;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.OutputStream;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. public class ServletDemo03 extends HttpServlet {
  10.     public void doGet(HttpServletRequest request, HttpServletResponse response)
  11.             throws ServletException, IOException {
  12.         /**
  13.          * 浏览器能接收(Accept)的数据类型有: 
  14.          * application/x-ms-application, 
  15.          * image/jpeg, 
  16.          * application/xaml+xml, 
  17.          * image/gif, 
  18.          * image/pjpeg, 
  19.          * application/x-ms-xbap, 
  20.          * application/vnd.ms-excel, 
  21.          * application/vnd.ms-powerpoint, 
  22.          * application/msword, 
  23.          */
  24.         response.setHeader(“content-type”“image/jpeg”);//使用content-type响应头指定发送给浏览器的数据类型为”image/jpeg”
  25.         //读取位于项目根目录下的img文件夹里面的WP_20131005_002.jpg这张图片,返回一个输入流
  26.         InputStream in = this.getServletContext().getResourceAsStream(“/img/WP_20131005_002.jpg”);
  27.         byte buffer[] = new byte[1024];
  28.         int len = 0;
  29.         OutputStream out = response.getOutputStream();//得到输出流
  30.         while ((len = in.read(buffer)) > 0) {//读取输入流(in)里面的内容存储到缓冲区(buffer)
  31.             out.write(buffer, 0, len);//将缓冲区里面的内容输出到浏览器
  32.         }
  33.     }
  34.     public void doPost(HttpServletRequest request, HttpServletResponse response)
  35.             throws ServletException, IOException {
  36.         this.doGet(request, response);
  37.     }
  38. }

服务器发给浏览器的响应信息如下:

ServletDemo03的运行结果如下图所示:

在浏览器中显示出了图片

6.4、设置refresh响应头,让浏览器定时刷新

  1. package gacl.http.study;
  2. import java.io.IOException;
  3. import javax.servlet.ServletException;
  4. import javax.servlet.http.HttpServlet;
  5. import javax.servlet.http.HttpServletRequest;
  6. import javax.servlet.http.HttpServletResponse;
  7. public class ServletDemo04 extends HttpServlet {
  8.     public void doGet(HttpServletRequest request, HttpServletResponse response)
  9.             throws ServletException, IOException {
  10.         /**
  11.          * 设置refresh响应头,让浏览器每隔3秒定时刷新
  12.          */
  13.         // response.setHeader(“refresh”, “3”);
  14.         /**
  15.          * 设置refresh响应头,让浏览器3秒后跳转到http://www.baidu.com
  16.          */
  17.         response.setHeader(“refresh”“3;url=’http://www.baidu.com'”);
  18.         response.getWriter().write(“gacl”);
  19.     }
  20.     public void doPost(HttpServletRequest request, HttpServletResponse response)
  21.             throws ServletException, IOException {
  22.         this.doGet(request, response);
  23.     }
  24. }

6.5、设置content-disposition响应头,让浏览器下载文件

  1. package gacl.http.study;
  2. import java.io.IOException;
  3. import java.io.InputStream;
  4. import java.io.OutputStream;
  5. import javax.servlet.ServletException;
  6. import javax.servlet.http.HttpServlet;
  7. import javax.servlet.http.HttpServletRequest;
  8. import javax.servlet.http.HttpServletResponse;
  9. public class ServletDemo05 extends HttpServlet {
  10.     public void doGet(HttpServletRequest request, HttpServletResponse response)
  11.             throws ServletException, IOException {
  12.         /**
  13.          * 设置content-disposition响应头,让浏览器下载文件
  14.          */
  15.         response.setHeader(“content-disposition”“attachment;filename=xxx.jpg”);
  16.         InputStream in = this.getServletContext().getResourceAsStream(“/img/1.jpg”);
  17.         byte buffer[] = new byte[1024];
  18.         int len = 0;
  19.         OutputStream out = response.getOutputStream();
  20.         while ((len = in.read(buffer)) > 0) {
  21.             out.write(buffer, 0, len);
  22.         }
  23.     }
  24.     public void doPost(HttpServletRequest request, HttpServletResponse response)
  25.             throws ServletException, IOException {
  26.         this.doGet(request, response);
  27.     }
  28. }

在浏览器中访问ServletDemo05就会弹出文件下载框,如下图所示:

JavaWeb学习总结(三)——Tomcat服务器学习和使用(二)

一、打包JavaWeb应用

在Java中,使用”jar”命令来对将JavaWeb应用打包成一个War包,jar命令的用法如下:

范例:将JavaWebDemoProject这个JavaWeb应用打包成war包

执行完之后,就可以得到一个

文件,平时开发完JavaWeb应用后,一般都会将JavaWeb应用打包成一个war包,然后将这个war包放到Tomcat服务器的webapps目录下,当Tomcat服务器启动时,就会自动将webapps目录下的war包解压。

比如现在将放到放到Tomcat服务器的webapps目录下

Tomcat服务器启动后会自动”Deploying web application”,将这个war文件解压缩,如下图所示:

二、Tomcat的体系结构

Tomcat服务器的启动是基于一个server.xml文件的,Tomcat启动的时候首先会启动一个Server,Server里面就会启动Service,Service里面就会启动多个”Connector(连接器)”,每一个连接器都在等待客户机的连接,当有用户使用浏览器去访问服务器上面的web资源时,首先是连接到Connector(连接器),Connector(连接器)是不处理用户的请求的,而是将用户的请求交给一个Engine(引擎)去处理,Engine(引擎)接收到请求后就会解析用户想要访问的Host,然后将请求交给相应的Host,Host收到请求后就会解析出用户想要访问这个Host下面的哪一个Web应用,一个web应用对应一个Context。

  1. <?xml version=’1.0′ encoding=’utf-8′?>
  2. <Server port=“8005” shutdown=“SHUTDOWN”>
  3.   <Service name=“Catalina”>
  4.     <Connector port=“8080” protocol=“HTTP/1.1”
  5.                connectionTimeout=“20000”
  6.                redirectPort=“8443” />
  7.     <Connector port=“8443” protocol=“org.apache.coyote.http11.Http11Protocol”
  8.                maxThreads=“150” SSLEnabled=“true” scheme=“https” secure=“true”
  9.                clientAuth=“false” sslProtocol=“TLS”
  10.                keystoreFile=“conf/.keystore” keystorePass=“123456”/>
  11.     <Connector port=“8009” protocol=“AJP/1.3” redirectPort=“8443” />
  12.     <Engine name=“Catalina” defaultHost=“localhost”>
  13.       <Host name=“localhost”  appBase=“webapps”
  14.             unpackWARs=“true” autoDeploy=“true”>
  15.         <Valve className=“org.apache.catalina.valves.AccessLogValve” directory=“logs”
  16.                prefix=“localhost_access_log.” suffix=“.txt”
  17.                pattern=“%h %l %u %t &quot;%r&quot; %s %b” />
  18.       </Host>
  19.       <Host name=“www.gacl.cn” appBase=“F:\JavaWebApps”>
  20.         <Context path=“” docBase=“F:\JavaWebApps\JavaWebDemo1”/>
  21.       </Host>
  22.     </Engine>
  23.   </Service>
  24. </Server>

三、互联网上的加密原理

Tomcat服务器启动时候会启动多个Connector(连接器),而Tomcat服务器的连接器又分为加密连接器和非加密连机器,比如:

这里访问的就是使用8080端口的那个连接器

  1. <Connector port=“8080” protocol=“HTTP/1.1”
  2.                connectionTimeout=“20000”
  3.               redirectPort=“8443” />

这个Connector是一个没有加密的连接器,使用”http://localhost:8080/JavaWebDemoProject/Web/1.jsp”去请求服务器上的web资源的这个过程中,我们的请求是不加密的,要是想以一种加密的方式来访问Tomcat服务器,那么就要在Tomcat里面配置一个加密的Connector。要配置一个加密连接器,首先应该把互联网上的加密原理弄清楚。

3.1、对称加密

  采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。
  需要对加密和解密使用相同密钥的加密算法。由于其速度快,对称性加密通常在消息发送方需要加密大量数据时使用。对称性加密也称为密钥加密。
  所谓对称,就是采用这种加密方法的双方使用方式用同样的密钥进行加密和解密。密钥是控制加密及解密过程的指令。算法是一组规则,规定如何进行加密和解密。
  加密的安全性不仅取决于加密算法本身,密钥管理的安全性更是重要。因为加密和解密都使用同一个密钥,如何把密钥安全地传递到解密者手上就成了必须要解决的问题
  常用的对称加密有:DES、IDEA、RC2、RC4、SKIPJACK、RC5、AES算法等

3.2、非对称加密

非对称加密算法需要两个密钥:公开密钥(publickey)和私有密钥(privatekey)。公开密钥与私有密钥是一对,如果用公开密钥对数据进行加密,只有用对应的私有密钥才能解密;如果用私有密钥对数据进行加密,那么只有用对应的公开密钥才能解密。因为加密和解密使用的是两个不同的密钥,所以这种算法叫作非对称加密算法。 非对称加密算法实现机密信息交换的基本过程是:甲方生成一对密钥并将其中的一把作为公用密钥向其它方公开;得到该公用密钥的乙方使用该密钥对机密信息进行加密后再发送给甲方;甲方再用自己保存的另一把专用密钥对加密后的信息进行解密。另一方面,甲方可以使用乙方的公钥对机密信息进行签名后再发送给乙方;乙方再用自己的私匙对数据进行验签。

非对称加密工作原理

  1.A要向B发送信息,A和B都要产生一对用于加密和解密的公钥和私钥。
  2.A的私钥保密,A的公钥告诉B;B的私钥保密,B的公钥告诉A。
  3.A要给B发送信息时,A用B的公钥加密信息,因为A知道B的公钥。
  4.A将这个消息发给B(已经用B的公钥加密消息)。
  5.B收到这个消息后,B用自己的私钥解密A的消息。其他所有收到这个报文的人都无法解密,因为只有B才有B的私钥

  发送方使用接收方的公钥对数据加密,而接收方则使用自己的私钥解密,这样,信息就可以安全无误地到达目的地了,即使被第三方截获,由于没有相应的私钥,也无法进行解密。通过数字的手段保证加密过程是一个不可逆过程,即只有用私有密钥才能解密。

非对称性加密依然没有解决数据传输的安全性问题,比如A想向B发数据,B首先生成一对密钥(公钥和私钥),然后将公钥发给A,A拿到B发给他的公钥有就可以使用公钥加密数据后发给B,然而在B公钥发送给A的这个过程中,很有可能会被第三方C截获,C截获到B的公钥后,也使用B的公钥加密数据,然后发给B,B接收到数据后就晕了,因为搞不清楚接收到的数据到底是A发的还是C发的,这是其中一个问题,另一个问题就是,C截获到B发的公钥后,C可以自己生成一对密钥(公钥和私钥),然后发给A,A拿到公钥后就以为是B发给他的,然后就使用公钥加密数据发给B,发送给B的过程中被C截获下来,由于A是用C发给他的公钥加密数据的,而C有私钥,因此就可以解密A加密过后的内容了,而B接收到A发给他的数据后反而解不开了,因为数据是用C的公钥加密的,B没有C的私钥,所以就无法解密。所以,非对称性加密存在一个问题:A想向B发数据,A如何确定拿到的公钥一定是B发的呢?那么如何解决这个问题呢?只能靠一个第三方机构(CA机构,即证书授权中心(Certificate Authority ),或称证书授权机构)来担保。A想向B发数据,B首先将公钥发给CA机构,CA机构拿到B的公钥后跑到B的家里问:这是你发的公钥吗?B确认过后说是:没错,是我发的!那么此时CA机构就会为B的公钥做担保,生成一份数字证书给B,数字证书包含了CA的担保认证签名和B的公钥,B拿到CA的这份数字证书后,就发给A,A拿到数字证书后,看到上面有CA的签名,就可以确定当前拿到的公钥是B发的,那么就可以放心大胆地使用公钥加密数据,然后发给B了。

四、https连接器

明白了互联网上的加密原理之后,下面来看看浏览器与服务器交互时,浏览器想将数据加密后再发送给服务器,那么该怎么做呢?服务器首先要向浏览器出示一份数字证书,浏览器看到数字证书后,就可以使用数字证书里面的公钥加密数据,所以要想做浏览器和服务器的加密数据传输,那么首先得针对服务器生成一份数字证书。然后再配置一下服务器,让服务器收到浏览器的请求之后,会向浏览器出示它的数字证书。

4.1、生成Tomcat服务器的数字证书

SUN公司提供了制作证书的工具keytool, 在JDK 1.4以后的版本中都包含了这一工具,它的位置为<JAVA_HOME>\bin\keytool.exe

  1. keytool -genkey -alias tomcat -keyalg RSA

使用keytool生成一个名字为tomcat的证书,存放在.keystore这个密钥库中

命令执行完之后,操作系统的用户文件夹下面就会生成一个.keystore文件,如下图所示:

使用命令:keytool -list -keystore .keystore查看.keystore密钥库里面的所有证书

4.2、配置https连接器

将生成的.keystore密钥库文件拷贝到Tomcat服务器的conf目录下,如下图所示:

修改server.xml文件,配置https连接器,代码如下:

  1. <Connector port=“8443” protocol=“org.apache.coyote.http11.Http11Protocol”
  2.                maxThreads=“150” SSLEnabled=“true” scheme=“https” secure=“true”
  3.                 clientAuth=“false” sslProtocol=“TLS”
  4.               keystoreFile=“conf/.keystore” keystorePass=“123456”/>

在server.xml文件中配置了一个端口是8443的加密连接器,浏览器访问8443端口的连接器时,将会以加密的方式来访问web服务器,这个连接器收到浏览器的请求后,将会向浏览器出示一份数字证书,浏览器再用数字证书里面的公钥来加密数据,keystoreFile=”conf/.keystore” 用来指明密钥库文件的所在路径,服务器从密钥库中提取证书时需要密码,keystorePass=”123456″指明密钥库的访问密码。

使用”https://localhost:8443/”访问8443的加密连接器

由于密钥库里面的证书是我们手工生成的,没有经过CA的认证,所以使用”https://localhost:8443/”访问8443的加密连接器,浏览器会出现”证书错误,导航已阻止”,浏览器认为当前要访问的这个主机是不安全的,不推荐继续访问,点击”继续浏览此网站(不推荐)”就可以继续访问了,如下图所示:

4.3、安装数字证书

为了让浏览器信任我们生成的数字证书,需要将数字证书安装到浏览器中,以IE8浏览器为例进行证书安装说明,安装步骤如下:

证书安装成功后,重启IE浏览器,使用”https://localhost:8443/”访问8443的加密连接器,此时浏览器就不再提示证书错误了,如下图所示:

 4.4、删除数字证书

以IE8为例进行说明,操作步骤如下:工具—–>Internet选项

删除之后重启浏览器即可。

JavaWeb学习总结(二)——Tomcat服务器学习和使用(一)

一、Tomcat服务器端口的配置

  Tomcat的所有配置都放在conf文件夹之中,里面的server.xml文件是配置的核心文件。

  如果想修改Tomcat服务器的启动端口,则可以在server.xml配置文件中的Connector节点进行的端口修改

例如:将Tomcat服务器的启动端口由默认的8080改成8081端口

Tomcat服务器启动端口默认配置

  1. <Connector port=“8080” protocol=“HTTP/1.1”
  2.               connectionTimeout=“20000”
  3.                redirectPort=“8443” />

将Tomcat服务器启动端口修改成8081端口

  1. <Connector port=“8081” protocol=“HTTP/1.1”
  2.               connectionTimeout=“20000”
  3.                redirectPort=“8443” />

这样就把原来默认Tomcat默认的的8080端口改成了8081端口了,需要注意的是,一旦服务器中的*.xml文件改变了,则Tomcat服务器就必须重新启动,重新启动之后将重新读取新的配置信息。因为已经在server.xml文件中将Tomcat的启动端口修改成了8081,所以Tomcat服务器启动时就以8081端口启动了,如下图所示:

访问Tomcat服务器也必须以新的访问端口去访问:http://localhost:8081/,如下图所示:

二、Tomcat服务器虚拟目录的映射方式

Web应用开发好后,若想供外界访问,需要把web应用所在目录交给web服务器管理,这个过程称之为虚似目录的映射。那么在Tomcat服务器中,如何进行虚拟目录的映射呢?总共有如下的几种方式:

2.1、虚拟目录的映射方式一:在server.xml文件的host元素中配置

找到server.xml文件的host元素,如下图所示:

在<Host></Host>这对标签加上<Context path=”/JavaWebApp” docBase=”F:\JavaWebDemoProject” />即可将在F盘下的JavaWebDemoProject这个JavaWeb应用映射到JavaWebApp这个虚拟目录上,JavaWebApp这个虚拟目录是由Tomcat服务器管理的,JavaWebApp是一个硬盘上不存在的目录,是我们自己随便写的一个目录,也就是虚拟的一个目录,所以称之为”虚拟目录”,代码如下:

  1. <Host name=“localhost”  appBase=“webapps”
  2.              unpackWARs=“true” autoDeploy=“true”
  3.               xmlValidation=“false” xmlNamespaceAware=“false”>
  4.           <Context path=“/JavaWebApp” docBase=“F:\JavaWebDemoProject” />
  5.   </Host>

其中,Context表示上下文,代表的就是一个JavaWeb应用,Context元素有两个属性,

  Ⅰ.path:用来配置虚似目录,必须以”/”开头。

  Ⅱ.docBase:配置此虚似目录对应着硬盘上的Web应用所在目录。

  使用浏览器访问”/JavaWebApp”这个虚拟目录下的1.jsp这个web资源,访问结果如下:

1.jsp可以正常访问,这说明我们已经成功地将将在F盘下的JavaWebDemoProject这个JavaWeb应用映射到JavaWebApp这个虚拟目录上了,访问”/JavaWebApp/1.jsp”就相当于访问”F:\JavaWebDemoProject\1.jsp”

  注意:在Tomcat6之后中,不再建议在server.xml文件中使用配置context元素的方式来添加虚拟目录的映射,因为每次修改server.xml文件后,Tomcat服务器就必须要重新启动后才能重新加载server.xml文件。在Tomcat服务器的文档http://localhost:8080/docs/config/context.html中有这样的说明:

  It is NOT recommended to place <Context> elements directly in the server.xml file. This is because it makes modifying the Context configuration more invasive since the main conf/server.xml file cannot be reloaded without restarting Tomcat.

Individual Context elements may be explicitly defined:

  • In an individual file at /META-INF/context.xml inside the application files. Optionally (based on the Host’s copyXML attribute) this may be copied to $CATALINA_BASE/conf/[enginename]/[hostname]/ and renamed to application’s base file name plus a “.xml” extension.
  • In individual files (with a “.xml” extension) in the $CATALINA_BASE/conf/[enginename]/[hostname]/ directory. The context path and version will be derived from the base name of the file (the file name less the .xml extension). This file will always take precedence over any context.xml file packaged in the web application’s META-INF directory.
  • Inside a Host element in the main conf/server.xml.

2.2、虚拟目录的映射方式二:让tomcat服务器自动映射

tomcat服务器会自动管理webapps目录下的所有web应用,并把它映射成虚似目录。换句话说,tomcat服务器webapps目录中的web应用,外界可以直接访问。

例如:把F盘下的JavaWebDemoProject这个JavaWeb应用直接copy到tomcat服务器webapps目录中,如下图所示:

此时Tomcat服务器就会自动为JavaWebDemoProject这个JavaWeb应用映射一个同名的虚拟目录”/JavaWebDemoProject”,然后就可以使用浏览器访问这个JavaWeb应用的资源了,如下图所示:

2.3、虚拟目录的映射方式三

参考Tomcat服务器文档:

In individual files (with a “.xml” extension) in the $CATALINA_BASE/conf/[enginename]/[hostname]/ directory. The context path and version will be derived from the base name of the file (the file name less the .xml extension). This file will always take precedence over any context.xml file packaged in the web application’s META-INF directory.

  意思就是:在tomcat服务器的\conf\Catalina\localhost目录下添加一个以xml作为扩展名的文件,xml文件的名字可以任意取,比如下面的aa.xml,注意这一句话”The context path and version will be derived from the base name of the file“,这一句话的意思翻译过来就是”context元素的path属性源自于是这个xml文件的名字”,上面提到过,Context元素的path属性是用来配置虚似目录的名称的,所以虚似目录的名称就是这个xml文件的名称。

  $CATALINA_BASE指的就是tomcat服务器根目录,[enginename]指的是Tomcat服务器使用的引擎名称,Tomcat使用的引擎是Catalina

在aa.xml文件中添加Context元素映射JavaWeb应用,代码如下:

  1. <Context docBase=“F:\JavaWebDemoProject” />

注意:在Context元素中并没有指明path属性来设置虚拟目录的名称,那么”F:\JavaWebDemoProject”映射的虚拟目录名称是神马呢,就是当前正在编辑的这个xml文件的名称aa。

使用这种方式映射虚拟目录的最大好处是修改了配置文件后不用重启Tomcat服务器,比如将aa.xml修改成bb.xml,Tomcat服务器会自动Undeploying context [/aa],然后自动信息: Deploying configuration descriptor D:\apache-tomcat-7.0.53\conf\Catalina\localhost\bb.xml

三、Tomcat服务器配置虚似主机

3.1、配置虚拟主机

配置虚似主机就是配置一个网站。
在Tomcat服务器配置一个虚拟主机(网站),需要修改conf文件夹下的server.xml这个配置文件,使用Host元素进行配置,打开server.xml,可以看到Tomcat服务器自带的一个名称为localhost的虚拟主机(网站),如下图所示:

平时我们将开发好的JavaWeb应用放到webapps文件夹下,然后就可以使用”http://localhost:端口号/JavaWebAppName“的方式去访问了,其实访问的就是name是”localhost”的那台虚拟主机(Host),这台虚拟主机管理webapps文件夹下的所有web应用。

例如:http://localhost:8080/JavaWebDemoProject/1.jsp,这个URL地址访问的就是名称是localhost的那台虚拟主机下的JavaWebDemoProject这个应用里面的1.jsp这个web资源。
我们可以使用如下的方式配置一个虚拟主机,例如:

  1. <Host name=“www.gacl.cn” appBase=“F:\JavaWebApps”>
  2. /Host>

这里我们新配置一个虚拟主机,虚拟主机的name是”www.gacl.cn”,虚拟主机”www.gacl.cn”现在管理着JavaWebApps文件夹下的所有web应用,平时我们在互联网上使用域名”www.baidu.com”访问百度的网站时,其实就是在访问一个名称是”www.baidu.com”的虚拟主机,所以当我们要访问name是”www.gacl.cn”的这个虚拟主机时,就可以使用”域名(www.gacl.cn)”去访问,注意一下appBase=”F:\JavaWebApps”,这里的JavaWebApps文件夹代表的不是一个项目的根目录,而是一个存放了一个或者多个JavaWeb应用的文件夹,如下图所示:

就好像是Tomcat服务器的webapps文件夹一样,里面存放了很多的JavaWeb应用

3.2、windows系统中注册域名

配置的主机(网站)要想通过域名被外部访问,必须在DNS服务器或windows系统中注册访问网站时使用的域名,找到”C:\Windows\System32\drivers\etc“目录下的hosts文件,如下图所示:

编辑这个文件,将新添加的网站的域名和IP地址绑定在一起,这样我们就可以在浏览器中使用www.gacl.cn这个域名去访问name是www.gacl.cn那个虚拟主机里面管理的那些web应用了

使用浏览器通过域名”www.gacl.cn”访问”www.gacl.cn”这个虚拟主机下的JavaWebDemo1这个web应用下的1.jsp这个web资源,”www.gacl.cn”这个虚拟主机开放了一个8080端口,用户只能通过这个8080端口去访问JavaWebDemo1这个web应用下的1.jsp这个web资源

四、浏览器与服务器交互的过程

4.1、浏览器与服务器交互图

 

当我们打开浏览器,在浏览器的地址栏中输入URL地址”http://www.gacl.cn:8080/JavaWebDemo1/1.jsp”去访问服务器上的1.jsp这个web资源的过程中,浏览器和服务器都做了神马操作呢,我们是怎么在浏览器里面看到1.jsp这个web资源里面的内容的呢?

浏览器和服务器做了以下几个操作:

1、浏览器根据主机名”www.gacl.cn”去操作系统的Hosts文件中查找主机名对应的IP地址。

2、浏览器如果在操作系统的Hosts文件中没有找到对应的IP地址,就去互联网上的DNS服务器上查找”www.gacl.cn”这台主机对应的IP地址。

3、浏览器查找到”www.gacl.cn”这台主机对应的IP地址后,就使用IP地址连接到Web服务器。

4、浏览器连接到web服务器后,就使用http协议向服务器发送请求,发送请求的过程中,浏览器会向Web服务器以Stream(流)的形式传输数据,告诉Web服务器要访问服务器里面的哪个Web应用下的Web资源,如下图所示:

这就是浏览器向Web服务器发请求时向服务器传输的数据,解释一下”GET /JavaWebDemo1/1.jsp HTTP/1.1“这里面的内容,

GET:告诉Web服务器,浏览器是以GET的方式向服务器发请求。

/JavaWebDemo1/1.jsp:告诉Web服务器,浏览器要访问JavaWebDemo1应用里面的1.jsp这个Web资源。

    HTTP/1.1:告诉Web服务器,浏览器是以HTTP协议请求的,使用的是1.1的版本。

5、浏览器做完上面4步工作后,就开始等待,等待Web服务器把自己想要访问的1.jsp这个Web资源传输给它。

6、服务器接收到浏览器传输的数据后,开始解析接收到的数据,服务器解析”GET /JavaWebDemo1/1.jsp HTTP/1.1“里面的内容时知道客户端浏览器要访问的是JavaWebDemo1应用里面的1.jsp这个Web资源,然后服务器就去读取1.jsp这个Web资源里面的内容,将读到的内容再以Stream(流)的形式传输给浏览器,如下图所示:

这个就是Web服务器传输给浏览器的数据。

7、浏览器拿到服务器传输给它的数据之后,就可以把数据展现给用户看了,如下图所示:

看到的这个”JavaWebDemo1″就是浏览器解析服务器发送回来的数据后的效果

服务器发送回来的数据:

  1. HTTP/1.1 200 OK
  2. Server: Apache-Coyote/1.1
  3. Content-Type: text/html;charset=ISO-8859-1
  4. Content-Length: 102
  5. Date: Mon, 19 May 2014 14:25:14 GMT
  6. <html>
  7.     <head>
  8.         <title>JavaWebDemo1</title>
  9.     </head>
  10.     <body>
  11.         JavaWebDemo1
  12.     </body>
  13. </html>

这就是浏览器和服务器的交互过程。

五、JavaWeb应用的组成结构

开发JavaWeb应用时,不同类型的文件有严格的存放规则,否则不仅可能会使web应用无法访问,还会导致web服务器启动报错

WebRoot →Web应用所在目录,一般情况下虚拟目录要配置到此文件夹当中。

    ┝WEB-INF:此文件夹必须位于WebRoot文件夹里面,而且必须以这样的形式去命名,字母都要大写。

      ┝web.xml:配置文件,有格式要求,此文件必须以这样的形式去命名,并且必须放置到WEB-INF文件夹中。

  web.xml的格式可以直接从Tomcat中参考得到:找到Tomcat目录下的webapps\ROOT\WEB-INF这个目录下的web.xml文件,把这个文件拷贝到我们新建的WEB-INF文件夹中,并修改这个web.xml文件,把里面的注释删除掉,只留下如下所示的代码即可:

web.xml :

  1. <?xml version=“1.0” encoding=“ISO-8859-1”?>
  2. <web-app xmlns=“http://java.sun.com/xml/ns/javaee”
  3.    xmlns:xsi=“http://www.w3.org/2001/XMLSchema-instance”
  4.    xsi:schemaLocation=“http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd”
  5.    version=“2.5”>
  6.   <display-name>Welcome to Tomcat</display-name>
  7.   <description>
  8.      Welcome to Tomcat
  9.   </description>
  10. </web-app>

这就是web.xml这个文件的格式