精华内容
下载资源
问答
  • HTML的HTTP协议头信息中控制着页面在几个地方的缓存信息,包括浏览器端,中间缓存服务器端(如:squid等),Web服务器端。本文讨论头信息 中带缓存控制信息的HTML页面(JSP/Servlet生成好出来的也是HTML页面)中间缓存...

     HTML的HTTP协议头信息中控制着页面在几个地方的缓存信息,包括浏览器端,中间缓存服务器端(如:squid等),Web服务器端。本文讨论头信息 中带缓存控制信息的HTML页面(JSP/Servlet生成好出来的也是HTML页面)在中间缓存服务器中的缓存情况。

          HTTP协议中关于缓存的信息头关键字包括Cache-Control(HTTP1.1),Pragma(HTTP1.0),last-Modified,Expires等。

          HTTP1.0中通过Pragma 控制页面缓存,可以设置:Pragma或no-cache。网上有非常多的文章说明如何控制不让浏览器或中间缓存服务器缓存页面,通常设置的值为no- cache,不过这个值不这么保险,通常还加上Expires置为0来达到目的。但是如我们刻意需要浏览器或缓存服务器缓存住我们的页面这个值则要设置为 Pragma。

          HTTP1.1中启用Cache-Control 来控制页面的缓存与否,这里介绍几个常用的参数:

    • no-cache,浏览器和缓存服务器都不应该缓存页面信息;
    • public,浏览器和缓存服务器都可以缓存页面信息;
    • no-store,请求和响应的信息都不应该被存储在对方的磁盘系统中;
    • must-revalidate,对于客户机的每次请求,代理服务器必须想服务器验证缓存是否过时;

           Last-Modified只页面的最后生成时间,GMT格式;

           Expires过时期限值,GMT格式,指浏览器或缓存服务器在该时间点后必须从真正的服务器中获取新的页面信息;

           上面两个值在JSP中设置值为字符型的GMT格式,无法生效,设置long类型才生效;

     

    下面是一个测试例子:

    复制代码

     1 package com.servlet;
     2 
     3 import java.io.IOException;
     4 import java.io.PrintWriter;
     5 
     6 import javax.servlet.ServletException;
     7 import javax.servlet.http.HttpServlet;
     8 import javax.servlet.http.HttpServletRequest;
     9 import javax.servlet.http.HttpServletResponse;
    10 
    11 public class ServletA extends HttpServlet {
    12     @Override
    13     public void service(HttpServletRequest request, HttpServletResponse response)
    14             throws ServletException, IOException {
    15         response.setContentType("text/html");
    16         //servlet页面默认是不缓存的
    17         //本页面允许在浏览器端或缓存服务器中缓存,时限为20秒。
    18         //20秒之内重新进入该页面的话不会进入该servlet的
    19         java.util.Date date = new java.util.Date();    
    20         response.setDateHeader("Last-Modified",date.getTime()); //Last-Modified:页面的最后生成时间 
    21         response.setDateHeader("Expires",date.getTime()+20000); //Expires:过时期限值 
    22         response.setHeader("Cache-Control", "public"); //Cache-Control来控制页面的缓存与否,public:浏览器和缓存服务器都可以缓存页面信息;
    23         response.setHeader("Pragma", "Pragma"); //Pragma:设置页面是否缓存,为Pragma则缓存,no-cache则不缓存
    24 
    25         //不允许浏览器端或缓存服务器缓存当前页面信息。
    26         /*response.setHeader( "Pragma", "no-cache" );   
    27         response.setDateHeader("Expires", 0);   
    28         response.addHeader( "Cache-Control", "no-cache" );//浏览器和缓存服务器都不应该缓存页面信息
    29         response.addHeader( "Cache-Control", "no-store" );//请求和响应的信息都不应该被存储在对方的磁盘系统中;    
    30         response.addHeader( "Cache-Control", "must-revalidate" );*///于客户机的每次请求,代理服务器必须想服务器验证缓存是否过时;
    31 
    32         System.out.println("进入了servlet");
    33         response.getWriter().write("欢迎光临我的主页");
    34     }
    35 
    36     
    37 }

    复制代码

      如果需要在html页面上设置不缓存,这在<head>标签中加入如下语句:

    1 <meta http-equiv="pragma" content="no-cache">
    2 <meta http-equiv="cache-control" content="no-cache">
    3 <meta http-equiv="expires" content="0">   

     

    附:html页面中meta的作用

      meta是用来在HTML文档中模拟HTTP协议的响应头报文。meta 标签用于网页的<head>与</head>中,meta 标签的用处很多。meta 的属性有两种:name和http-equiv。name属性主要用于描述网页,对应于content(网页内容),以便于搜索引擎机器人查找、分类(目前几乎所有的搜索引擎都使用网上机器人自动查找meta值来给网页分类)。这其中最重要的是description(站点在搜索引擎上的描述)和keywords(分类关键词),所以应该给每页加一个meta值。比较常用的有以下几个:

      name 属性

      1、<meta name="Generator" contect="">用以说明生成工具(如Microsoft FrontPage 4.0)等;

      2、<meta name="KEYWords" contect="">向搜索引擎说明你的网页的关键词;

      3、<meta name="DEscription" contect="">告诉搜索引擎你的站点的主要内容;

      4、<meta name="Author" contect="你的姓名">告诉搜索引擎你的站点的制作的作者;

      5、<meta name="Robots" contect= "all|none|index|noindex|follow|nofollow">

      其中的属性说明如下:

      设定为all:文件将被检索,且页面上的链接可以被查询;

      设定为none:文件将不被检索,且页面上的链接不可以被查询;

      设定为index:文件将被检索;

      设定为follow:页面上的链接可以被查询;

      设定为noindex:文件将不被检索,但页面上的链接可以被查询;

      设定为nofollow:文件将不被检索,页面上的链接可以被查询。

      http-equiv属性

      1、<meta http-equiv="Content-Type" contect="text/html";charset=gb_2312-80">

    和 <meta http-equiv="Content-Language" contect="zh-CN">用以说明主页制作所使用的文字以及语言;

      又如英文是ISO-8859-1字符集,还有BIG5、utf-8、shift-Jis、Euc、Koi8-2等字符集;

      2、<meta http-equiv="Refresh" contect="n;url=http://yourlink">定时让网页在指定的时间n内,跳转到页面http://yourlink;

      3、<meta http-equiv="Expires" contect="Mon,12 May 2001 00:20:00 GMT">可以用于设定网页的到期时间,一旦过期则必须到服务器上重新调用。需要注意的是必须使用GMT时间格式;

      4、<meta http-equiv="Pragma" contect="no-cache">是用于设定禁止浏览器从本地机的缓存中调阅页面内容,设定后一旦离开网页就无法从Cache中再调出;

      5、<meta http-equiv="set-cookie" contect="Mon,12 May 2001 00:20:00 GMT">cookie设定,如果网页过期,存盘的cookie将被删除。需要注意的也是必须使用GMT时间格式;

      6、<meta http-equiv="Pics-label" contect="">网页等级评定,在IE的internet选项中有一项内容设置,可以防止浏览一些受限制的网站,而网站的限制级别就是通过meta属性来设置的;

      7、<meta http-equiv="windows-Target" contect="_top">强制页面在当前窗口中以独立页面显示,可以防止自己的网页被别人当作一个frame页调用;

      8、<meta http-equiv="Page-Enter" contect="revealTrans(duration=10,transtion= 50)">和<meta http-equiv="Page-Exit" contect="revealTrans(duration=20,transtion=6)">设定进入和离开页面时的特殊效果,这个功能即FrontPage中的“格式/网页过渡”,不过所加的页面不能够是一个frame页面。

    ----------------------------------------------------------------------

     

    http 头信息详解

     

    HTTP(HyperTextTransferProtocol)是超文本传输协议的缩写,它用于传送WWW方式的数据,关于HTTP协议的详细内容请参考RFC2616。HTTP协议采用了请求/响应模型。客户端向服务器发送一个请求,请求头包含请求的方法、URI、协议版本、以及包含请求修饰符、客户信息和内容的类似于MIME的消息结构。服务器以一个状态行作为响应,相应的内容包括消息协议的版本,成功或者错误编码加上包含服务器信息、实体元信息以及可能的实体内容。 

    通常HTTP消息包括客户机向服务器的请求消息和服务器向客户机的响应消息。这两种类型的消息由一个起始行,一个或者多个头域,一个只是头域结束的空行和可选的消息体组成。HTTP的头域包括通用头,请求头,响应头和实体头四个部分。每个头域由一个域名,冒号(:)和域值三部分组成。域名是大小写无关的,域值前可以添加任何数量的空格符,头域可以被扩展为多行,在每行开始处,使用至少一个空格或制表符。 

    通用头域 

    通用头域包含请求和响应消息都支持的头域,通用头域包含Cache-Control、 Connection、Date、Pragma、Transfer-Encoding、Upgrade、Via。对通用头域的扩展要求通讯双方都支持此扩展,如果存在不支持的通用头域,一般将会作为实体头域处理。下面简单介绍几个在UPnP消息中使用的通用头域。 


    Cache-Control头域 

    Cache-Control指定请求和响应遵循的缓存机制。在请求消息或响应消息中设置 Cache-Control并不会修改另一个消息处理过程中的缓存处理过程。请求时的缓存指令包括no-cache、no-store、max-age、 max-stale、min-fresh、only-if-cached,响应消息中的指令包括public、private、no-cache、no- store、no-transform、must-revalidate、proxy-revalidate、max-age。各个消息中的指令含义如下: 

    Public指示响应可被任何缓存区缓存。 

    Private指示对于单个用户的整个或部分响应消息,不能被共享缓存处理。这允许服务器仅仅描述当用户的部分响应消息,此响应消息对于其他用户的请求无效。 

    no-cache指示请求或响应消息不能缓存 

    no-store用于防止重要的信息被无意的发布。在请求消息中发送将使得请求和响应消息都不使用缓存。 

    max-age指示客户机可以接收生存期不大于指定时间(以秒为单位)的响应。 

    min-fresh指示客户机可以接收响应时间小于当前时间加上指定时间的响应。 

    max-stale指示客户机可以接收超出超时期间的响应消息。如果指定max-stale消息的值,那么客户机可以接收超出超时期指定值之内的响应消息。 


    Date头域 

    Date头域表示消息发送的时间,时间的描述格式由rfc822定义。例如,Date:Mon,31Dec200104:25:57GMT。Date描述的时间表示世界标准时,换算成本地时间,需要知道用户所在的时区。 


    Pragma头域 

    Pragma头域用来包含实现特定的指令,最常用的是Pragma:no-cache。在HTTP/1.1协议中,它的含义和Cache- Control:no-cache相同。 

    请求消息 

    请求消息的第一行为下面的格式: 

    MethodSPRequest-URISPHTTP-VersionCRLFMethod 表示对于Request-URI完成的方法,这个字段是大小写敏感的,包括OPTIONS、GET、HEAD、POST、PUT、DELETE、 TRACE。方法GET和HEAD应该被所有的通用WEB服务器支持,其他所有方法的实现是可选的。GET方法取回由Request-URI标识的信息。 HEAD方法也是取回由Request-URI标识的信息,只是可以在响应时,不返回消息体。POST方法可以请求服务器接收包含在请求中的实体信息,可以用于提交表单,向新闻组、BBS、邮件群组和数据库发送消息。 

    SP表示空格。Request-URI遵循URI格式,在此字段为星号(*)时,说明请求并不用于某个特定的资源地址,而是用于服务器本身。HTTP- Version表示支持的HTTP版本,例如为HTTP/1.1。CRLF表示换行回车符。请求头域允许客户端向服务器传递关于请求或者关于客户机的附加信息。请求头域可能包含下列字段Accept、Accept-Charset、Accept- Encoding、Accept-Language、Authorization、From、Host、If-Modified-Since、If- Match、If-None-Match、If-Range、If-Range、If-Unmodified-Since、Max-Forwards、 Proxy-Authorization、Range、Referer、User-Agent。对请求头域的扩展要求通讯双方都支持,如果存在不支持的请求头域,一般将会作为实体头域处理。 

    典型的请求消息: 

    GET http://download.microtool.de:80/somedata.exe 
    Host: download.microtool.de 
    Accept:*/* 
    Pragma: no-cache 
    Cache-Control: no-cache 
    Referer: http://download.microtool.de/ 
    User-Agent:Mozilla/4.04[en](Win95;I;Nav) 
    Range:bytes=554554- 

    上例第一行表示HTTP客户端(可能是浏览器、下载程序)通过GET方法获得指定URL下的文件。棕色的部分表示请求头域的信息,绿色的部分表示通用头部分。 


    Host头域 

    Host头域指定请求资源的Intenet主机和端口号,必须表示请求url的原始服务器或网关的位置。HTTP/1.1请求必须包含主机头域,否则系统会以400状态码返回。 


    Referer头域 

    Referer头域允许客户端指定请求uri的源资源地址,这可以允许服务器生成回退链表,可用来登陆、优化cache等。他也允许废除的或错误的连接由于维护的目的被追踪。如果请求的uri没有自己的uri地址,Referer不能被发送。如果指定的是部分uri地址,则此地址应该是一个相对地址。 


    Range头域 

    Range头域可以请求实体的一个或者多个子范围。例如, 

    表示头500个字节:bytes=0-499 

    表示第二个500字节:bytes=500-999 

    表示最后500个字节:bytes=-500 

    表示500字节以后的范围:bytes=500- 

    第一个和最后一个字节:bytes=0-0,-1 

    同时指定几个范围:bytes=500-600,601-999 

    但是服务器可以忽略此请求头,如果无条件GET包含Range请求头,响应会以状态码206(PartialContent)返回而不是以200 (OK)。 


    User-Agent头域 

    User-Agent头域的内容包含发出请求的用户信息。 

    响应消息 

    响应消息的第一行为下面的格式: 

    HTTP-VersionSPStatus-CodeSPReason-PhraseCRLF 

    HTTP-Version表示支持的HTTP版本,例如为HTTP/1.1。Status- Code是一个三个数字的结果代码。Reason-Phrase给Status-Code提供一个简单的文本描述。Status-Code主要用于机器自动识别,Reason-Phrase主要用于帮助用户理解。Status-Code的第一个数字定义响应的类别,后两个数字没有分类的作用。第一个数字可能取5个不同的值: 

    1xx:信息响应类,表示接收到请求并且继续处理 

    2xx:处理成功响应类,表示动作被成功接收、理解和接受 

    3xx:重定向响应类,为了完成指定的动作,必须接受进一步处理 

    4xx:客户端错误,客户请求包含语法错误或者是不能正确执行 

    5xx:服务端错误,服务器不能正确执行一个正确的请求 

    响应头域允许服务器传递不能放在状态行的附加信息,这些域主要描述服务器的信息和 Request-URI进一步的信息。响应头域包含Age、Location、Proxy-Authenticate、Public、Retry- After、Server、Vary、Warning、WWW-Authenticate。对响应头域的扩展要求通讯双方都支持,如果存在不支持的响应头域,一般将会作为实体头域处理。 

    典型的响应消息: 

    HTTP/1.0200OK 

    Date:Mon,31Dec200104:25:57GMT 

    Server:Apache/1.3.14(Unix) 

    Content-type:text/html 

    Last-modified:Tue,17Apr200106:46:28GMT 

    Etag:"a030f020ac7c01:1e9f" 

    Content-length:39725426 

    Content-range:bytes554554-40279979/40279980 

    上例第一行表示HTTP服务端响应一个GET方法。棕色的部分表示响应头域的信息,绿色的部分表示通用头部分,红色的部分表示实体头域的信息。 

    Location响应头 

    Location响应头用于重定向接收者到一个新URI地址。 

    Server响应头 

    Server响应头包含处理请求的原始服务器的软件信息。此域能包含多个产品标识和注释,产品标识一般按照重要性排序。 

    实体 

    请求消息和响应消息都可以包含实体信息,实体信息一般由实体头域和实体组成。实体头域包含关于实体的原信息,实体头包括Allow、Content- Base、Content-Encoding、Content-Language、 Content-Length、Content-Location、Content-MD5、Content-Range、Content-Type、 Etag、Expires、Last-Modified、extension-header。extension-header允许客户端定义新的实体头,但是这些域可能无法未接受方识别。实体可以是一个经过编码的字节流,它的编码方式由Content-Encoding或Content-Type定义,它的长度由Content-Length或Content-Range定义。 

    Content-Type实体头 

    Content-Type实体头用于向接收方指示实体的介质类型,指定HEAD方法送到接收方的实体介质类型,或GET方法发送的请求介质类型 Content-Range实体头 

    Content-Range实体头用于指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式: 

    Content-Range:bytes-unitSPfirst-byte-pos-last-byte-pos/entity-legth 

    例如,传送头500个字节次字段的形式:Content-Range:bytes0- 499/1234如果一个http消息包含此节(例如,对范围请求的响应或对一系列范围的重叠请求),Content-Range表示传送的范围, Content-Length表示实际传送的字节数。 

    Last-modified实体头 

    Last-modified实体头指定服务器上保存内容的最后修订时间。 
     

    应答 头  说明
    Allow服务器支持哪些请求方法(如GET、POST等)。
    Content-Encoding文档的编码(Encode)方法。只有在解码之后才可以得到Content-Type头指定的内容类型。利用gzip压缩文档能够显著地减少HTML文档的下载时间。Java的GZIPOutputStream可以很方便地进行gzip压缩,但只有Unix上的Netscape和Windows上的IE 4、IE 5才支持它。因此,Servlet应该通过查看Accept-Encoding头(即request.getHeader("Accept-Encoding"))检查浏览器是否支持gzip,为支持gzip的浏览器返回经gzip压缩的HTML页面,为其他浏览器返回普通页面。
    Content-Length表示内容长度。只有当浏览器使用持久HTTP连接时才需要这个数据。如果你想要利用持久连接的优势,可以把输出文档写入ByteArrayOutputStram,完成后查看其大小,然后把该值放入Content-Length头,最后通过byteArrayStream.writeTo(response.getOutputStream()发送内容。
    Content-Type表示后面的文档属于什么MIME类型。Servlet默认为text/plain,但通常需要显式地指定为text/html。由于经常要设置Content-Type,因此HttpServletResponse提供了一个专用的方法setContentTyep。 
    Date当前的GMT时间。你可以用setDateHeader来设置这个头以避免转换时间格式的麻烦。
    Expires应该在什么时候认为文档已经过期,从而不再缓存它?
    Last-Modified文档的最后改动时间。客户可以通过If-Modified-Since请求头提供一个日期,该请求将被视为一个条件GET,只有改动时间迟于指定时间的文档才会返回,否则返回一个304(Not Modified)状态。Last-Modified也可用setDateHeader方法来设置。
    Location表示客户应当到哪里去提取文档。Location通常不是直接设置的,而是通过HttpServletResponse的sendRedirect方法,该方法同时设置状态代码为302。
    Refresh表示浏览器应该在多少时间之后刷新文档,以秒计。除了刷新当前文档之外,你还可以通过setHeader("Refresh", "5; URL=http://host/path")让浏览器读取指定的页面。 
    注意这种功能通常是通过设置HTML页面HEAD区的<META HTTP-EQUIV="Refresh" CONTENT="5;URL=http://host/path">实现,这是因为,自动刷新或重定向对于那些不能使用CGI或Servlet的HTML编写者十分重要。但是,对于Servlet来说,直接设置Refresh头更加方便。 

    注意Refresh的意义是“N秒之后刷新本页面或访问指定页面”,而不是“每隔N秒刷新本页面或访问指定页面”。因此,连续刷新要求每次都发送一个Refresh头,而发送204状态代码则可以阻止浏览器继续刷新,不管是使用Refresh头还是<META HTTP-EQUIV="Refresh" ...>。 

    注意Refresh头不属于HTTP 1.1正式规范的一部分,而是一个扩展,但Netscape和IE都支持它。
    Server服务器名字。Servlet一般不设置这个值,而是由Web服务器自己设置。
    Set-Cookie设置和页面关联的Cookie。Servlet不应使用response.setHeader("Set-Cookie", ...),而是应使用HttpServletResponse提供的专用方法addCookie。参见下文有关Cookie设置的讨论。
    WWW-Authenticate客户应该在Authorization头中提供什么类型的授权信息?在包含401(Unauthorized)状态行的应答中这个头是必需的。例如,response.setHeader("WWW-Authenticate", "BASIC realm=\"executives\"")。 
    注意Servlet一般不进行这方面的处理,而是让Web服务器的专门机制来控制受密码保护页面的访问(例如.htaccess)。

     

     

     

    展开全文
  • [b]通常做前端Web界面时,经常需要用js模拟浏览器的查找功能。下面介绍下IE和Chrome浏览器中如何用js模拟该功能。[/b] ...通常如果是整个页面查找,只需调用方法document.body.createTextRang...
    [b]通常在做前端Web界面时,经常需要用js模拟浏览器的查找功能。下面介绍下IE和Chrome浏览器中如何用js模拟该功能。[/b]
    

    [b]一、IE浏览器[/b]
    在IE浏览器中我们需要用到TextRange对象,该对象主要用来在IE浏览器中查找文本。

    [b]如何创建该对象呢?[/b]
    通常如果是在整个页面查找,只需调用方法document.body.createTextRange()即可。而如何是要在某一个对象内查找,例如:textArea,则需要调用docuemnt.getElementById('textAreaId').createTextRange()即可。

    对象TextRange有两个比较重要的概念就是开始位置和结束位置,当我们创建完TextRange对象后,开始位置默认为整个查找域的起始位置,结束位置默认为整个查找域的结束位置。拿textArea举例来说就是整个textArea的开头和结尾。

    [b]当我们创建某个TextRange对象后,如何查找字符串呢?[/b]
    我们需要用到TextRange对象的findText()方法,当我们调用查找方法后,该方法会不断的向下查找我们要查询的字符串,且开始位置和结束位置默认为当前查找到的字符串所在的开始位置和结束位置。当下一次查找逻辑运行时,会从当前的开头位置开始查找。

    [b]如何让浏览器选中我们查找到的字符串呢?[/b]
    调用TextRange对象select()方法即可

    [b]当搜索的内容过多时,当前查找到的字符串可能不在可视范围内,如何让浏览器自动定位?[/b]
    调用TextRange对象的scrollIntoView()方法可以滚动屏幕到合适位置


    [b]二、谷歌浏览器[/b]

    谷歌浏览器中比较简单,只需要简单的调用window下的find方法即可。但是需要注意的是,如果需要循环查找,则需要多设置两个参数,如下所示:

    window.find(searchValue,false,true);


    [b]三、完整实例代码如下:[/b]

    //在整个文本中查找第几个,从0开始
    var nextIndex = 0;
    //上一次需要查找的字符串
    var searchValue = '';

    function findInPage(targetEle,searchText) {
    //判断搜索字符是否为空
    if (!searchText){
    alert('搜索字符串为空');
    }
    //判断搜索条件是否已经改变
    if(searchText && searchText != searchValue && nextIndex > 0){
    searchValue = searchText;
    nextIndex = 0;
    }else{
    searchValue = searchText;
    }

    if (document.all) {
    txt = targetEle.createTextRange();
    //搜索str
    var found = '';
    //查找第nextIndex个的字符串。之所以要用循环,是因为TextRange对象每次都是新生成的,所以查找初始位置每次都会还原。那么要查找第n次出现的字符串,就需要调用findText()方法多次,且每次查找都要重新设置开始位置和结束位置。
    for (i = 0; i <= nextIndex && (found = txt.findText(searchValue))==true; i++) {
    txt.moveStart("character", 1);
    txt.moveEnd("textedit");
    }
    //选中本次查找的字符串
    if (found) {
    //这里设置为-1,表示为倒序查找。之所以要这样做,是因为此时我们已经查找到了第nextIndex出现的字符串,那么此时如果设置为倒序查找,且将开始位置设置为末尾,那么此时调用findText()方法查找,则会刚好查到我们上一次查到的字符串
    txt.moveStart("character", -1);
    txt.findText(searchValue);
    txt.select();
    //滚动屏幕到合适位置
    txt.scrollIntoView();
    nextIndex++;
    }else{
    //循环查找
    if (nextIndex > 0) {
    nextIndex = 0;
    findInPage(searchValue);
    }
    }
    }else{
    //谷歌循环查找
    window.find(searchValue,false,true);
    }
    }
    展开全文
  • 浏览器缓存JSP页面

    2010-07-28 15:18:55
    项目开发中,通常IE会缓存页面,但是缓存历史页面在业务系统中往往页面缓存会给系统带来很多问题。为了不让浏览器缓存JSP页面,应避免浏览器缓存当前JSP页面。  查阅资料,对浏览器缓存实现方式总结如下:    ...

            项目开发中,通常IE会缓存页面,但是缓存历史页面在业务系统中往往页面缓存会给系统带来很多问题。为了不让浏览器缓存JSP页面,应避免浏览器缓存当前JSP页面。

         查阅资料,对浏览器缓存实现方式总结如下:

     

        一、服务端

        

    <%   
    response.setHeader("Pragma","No-cache");    
    response.setHeader("Cache-Control","no-cache");    
    response.setDateHeader("Expires", -10); 
    %>

     

        二、客户端

         meta是用来在HTML文档中模拟HTTP协议的响应头报文。

         meta 标签用于网页的<head>与</head>中,meta 标签的用处很多。

         meta 的属性有两种:name和http-equiv。

         name属性主要用于描述网页,对应于content(网页内容),以便于搜索引擎机器人查找、分类(目前几乎所有的搜索引擎都使用网上机器人自动查找meta值来给网页分类)。这其中最重要的是description(站点在搜索引擎上的描述)和keywords(分类关键词),所以应该给每页加一个meta值。比较常用的有以下几个:

     

    name属性
    1、 <meta name="Generator" contect="">用以说明生成工具(如Microsoft FrontPage 4.0)等;
    2、 <meta name="KEYWords" contect="">向搜索引擎说明你的网页的关键词;
    3、 <meta name="DEscription" contect="">告诉搜索引擎你的站点的主要内容;
    4、 <meta name="Author" contect="你的姓名">告诉搜索引擎你的站点的制作的作者;
    5、 <meta name="Robots" contect="all|none|index|noindex|follow|nofollow">

    其中的属性说明如下:
    设定为all:文件将被检索,且页面上的链接可以被查询;
    设定为none:文件将不被检索,且页面上的链接不可以被查询;
    设定为index:文件将被检索;
    设定为follow:页面上的链接可以被查询;
    设定为noindex:文件将不被检索,但页面上的链接可以被查询;
    设定为nofollow:文件将不被检索,页面上的链接可以被查询。

     

    http-equiv属性


    1、<meta http-equiv="Content-Type" contect="text/html";charset=gb_2312-80">
    和 <meta http-equiv="Content-Language" contect="zh-CN">用以说明主页制作所使用的文字以及语言;又如英文是ISO-8859-1字符集,还有BIG5、utf-8、shift-Jis、Euc、Koi8-2等字符集;


    2、<meta http-equiv="Refresh" contect="n;url=http://yourlink">定时让网页在指定的时间n内,跳转到页面http;//yourlink;


    3、<meta http-equiv="Expires" contect="Mon,12 May 2001 00:20:00 GMT">可以用于设定网页的到期时间,一旦过期则必须到服务器上重新调用。需要注意的是必须使用GMT时间格式;


    4、<meta http-equiv="Pragma" contect="no-cache">是用于设定禁止浏览器从本地机的缓存中调阅页面内容,设定后一旦离开网页就无法从Cache中再调出;


    5、<meta http-equiv="set-cookie" contect="Mon,12 May 2001 00:20:00 GMT">cookie设定,如果网页过期,存盘的cookie将被删除。需要注意的也是必须使用GMT时间格式;


    6、<meta http-equiv="Pics-label" contect="">网页等级评定,在IE的internet选项中有一项内容设置,可以防止浏览一些受限制的网站,而网站的限制级别就是通过meta属性来设置的;


    7、<meta http-equiv="windows-Target" contect="_top">强制页面在当前窗口中以独立页面显示,可以防止自己的网页被别人当作一个frame页调用;


    8、<meta http-equiv="Page-Enter" contect="revealTrans(duration=10,transtion= 50)">和<meta http-equiv="Page-Exit" contect="revealTrans(duration=20,transtion =6)">设定进入和离开页面时的特殊效果,这个功能即FrontPage中的“格式/网页过渡”,不过所加的页面不能够是一个frame页面。

     

     

    缓存的应用

     

         一、防止JSP页面缓存为了防止浏览器缓存当前访问的JSP动态页面,可以采用如下的方式进行设置:

    <% 
          // 将过期日期设置为一个过去时间
        response.setHeader("Expires", "Sat, 6 May 1995 12:00:00 GMT");
    
          // 设置 HTTP/1.1 no-cache 头
        response.setHeader("Cache-Control", "no-store,no-cache,must-revalidate");
    
          // 设置 IE 扩展 HTTP/1.1 no-cache headers, 用户自己添加
        response.addHeader("Cache-Control", "post-check=0, pre-check=0");
    
          // 设置标准 HTTP/1.0 no-cache header.
          response.setHeader("Pragma", "no-cache");
    %>

     如果每一个页面都包含这些,代码会很繁琐,可以通过自定义过滤器(Filter)的方法来处理相关的页面。

    二、jsp,html 清除页面缓存(也是我开始谈到的问题的解决方式)

    1、禁止客户端缓存要在<head>中加入类似如下内容:

    <META HTTP-EQUIV="pragma" CONTENT="no-cache"> 
    <META HTTP-EQUIV="Cache-Control" CONTENT="no-cache, must-revalidate"> 
    <META HTTP-EQUIV="expires" CONTENT="Wed, 26 Feb 1997 08:21:57 GMT"> 

    或者

    <meta http-equiv="pragma" content="no-cache">
    <meta http-equiv="cache-control" content="no-cache">
    <meta http-equiv="expires" content="0">   

     

     

    2、在服务器的动态网页中禁止缓存,要加入类似如下脚本

     

    response.setHeader("Pragma","No-cache"); 
    response.setHeader("Cache-Control","no-cache"); 
    response.setDateHeader("Expires", 0);  

     

     

    注意: jsp cache最好做在过滤器上,把需要缓冲的页面集中在同一个目录下,每次更改只须更改web.xml就可以完成缓冲设置,这样比较方便.

    三、设置有限时间的缓存

        int minutes = 10;
      
        Date d = new Date();
    
        String modDate = d.toGMTString();
    
        String expDate = null;
    
        expDate = (new Date(d.getTime() + minutes*60000)).toGMTString();
    
        response.setHeader("Last-Modified", modDate);
    
        response.setHeader("Expires", expDate);
    
        response.setHeader("Cache-Control", "public"); //   HTTP/1.1
    
        response.setHeader("Pragma", "Pragma"); //   HTTP/1.0

     

     

     

    展开全文
  • 在浏览器中输入域名,敲下回车后,不一会儿浏览器就会显示我们想要的界面。本文将简单介绍这其中经历了什么过程。 注意:以下分析基于HTTP请求,并且Web容器使用Tomcat,后端框架使用SSM 一、URL解析 1、地址解析 ...

    转载自 : 从输入URL到浏览器显示页面的流程

    从输入URL到浏览器显示页面的流程

    当在浏览器中输入域名,敲下回车后,不一会儿浏览器就会显示我们想要的界面。本文将简单介绍这其中经历了什么过程。

    注意:以下分析基于HTTP请求,并且Web容器使用Tomcat,后端框架使用SSM

    一、URL解析

    1、地址解析

    浏览器会根据你的输入来判断该输入是一条合法的URL,还是需要被搜索的关键词。并且根据你输入的内容进行自动完成、字符编码等操作。

    2、其他操作

    目前大部分浏览器都会强制客户端使用HTTPS协议以保证信息传输的安全性。同时还会进行一些额外的操作,比如安全检查、访问限制等。

    3、缓存检查

    有时候博客在gitee上进行了更新,但是通过谷歌浏览器查看博客时,仍是更新前的博客,这是因为浏览器中缓存了之前的博客界面。

    浏览器会先检测是否缓存了目标URL的页面,如果有且缓存未过期,则直接展示缓存页面,无需再向服务器进行请求。

    img

    二、DNS解析

    DNS解析是寻找所需要的资源的IP地址的过程。因为互联网中每一台连网的机器都有唯一IP作为标识,但是它是一串数字,记忆太过困难。所以就需要将网址和IP地址进行转换,也就是DNS解析。其具体步骤如下。

    img

    1、查询缓存

    我们的浏览器、操作系统、路由器都会缓存一些URL对应的IP地址,统称为DNS高速缓存。这是为了加快DNS解析速度,使得不必每次都到根域名服务器中去查询。

    2、递归解析

    输入www.baidu.com网址后,首先在高速缓存中查找,没找到去根域名服务器查找,没有再去com顶级域名服务器查找,依次类推,直到找到IP地址,然后把它记录在本地告诉缓存中,供下次使用。

    大致过程就是.-> .com ->baidu.com. -> www.baidu.com.

    其中.代表根域名服务器。

    3、DNS负载均衡

    访问baidu.com的时候,每次响应的可能并非是同一个服务器(IP地址不同),一般大公司都有成百上千台服务器来支撑访问,DNS可以返回一个合适的机器的IP给用户,例如可以根据每台机器的负载量,该机器离用户地理位置的距离等等,这种过程就是DNS负载均衡。

    三、建立TCP连接

    TCP/IP 分为四层,在发送数据时,每层都要对数据进行封装

    img

    TCP提供一种面向连接的,可靠的字节流服务,是一种可靠传输。接下来将会讲解TCP的首部、三次握手与四次挥手

    1、TCP的首部

    TCP首部的格式如下

    img

    • 源端口:源端口和IP地址的作用是标识报文的发送地址和返回地址

    • 目的端口:端口指明接收方计算机上的应用程序接口

      • TCP报头中的源端口号和目的端口号同IP数据报中的源IP与目的IP唯一确定一条TCP连接
    • 序号:是TCP可靠传输的关键部分

      • 序号是该报文段发送的数据组的

        第一个字节的序号

        。在TCP传送的流中,每

        一个字节都有一个序号

        • 比如一个报文段的序号为300,报文段数据部分共有100字节,则下一个报文段的序号为400。所以序号确保了TCP传输的有序性
    • 确认号:ack,用于指明下一个期待收到的字节序号,表明该序号之前的所有数据已经正确无误的收到

      • 确认号只有当ACK标志为1时才有效。比如建立连接时,SYN报文的ACK标志位为0
    • 首部长度/数据偏移:占4位,它指出TCP报文的数据距离TCP报文段的起始处有多远

    • 保留:占6位,保留今后使用,但目前应都位0

    • 控制位:URG ACK PSH RST SYN FIN,共6个,每一个标志位表示一个控制功能

      • URG:紧急。当URG=1时,表明紧急指针字段有效。告诉系统此报文段中有紧急数据
      • ACK:确认。当ACK=1时,确认号字段才有效。TCP规定,在连接建立后所有报文的传输都必须把ACK置1
      • PSH:推送。当两个应用进程进行交互式通信时,有时在一端的应用进程希望在键入一个命令后立即就能收到对方的响应,这时候就将PSH=1
      • RST:复位。当RST=1,表明TCP连接中出现严重差错,必须释放连接,然后再重新建立连接
      • SYN:同步,在连接建立时用来同步序号。当SYN=1,ACK=0,表明是连接请求报文,若同意连接,则响应报文中应该使SYN=1,ACK=1
      • FIN:终止,用来释放连接。当FIN=1,表明此报文的发送方的数据已经发送完毕,并且要求释放
    • 窗口滑动窗口大小,用来告知发送端接受端的缓存大小,以此控制发送端发送数据的速率,从而达到流量控制。窗口大小时一个16bits字段,因而窗口大小最大为65535

    • 校验和:奇偶校验,此校验和是对整个的 TCP 报文段,包括 TCP 头部和 TCP 数据,以 16 位字进行计算所得。由发送端计算和存储,并由接收端进行验证

    • 紧急指针:只有当 URG 标志置 1 时紧急指针才有效。紧急指针是一个正的偏移量,和顺序号字段中的值相加表示紧急数据最后一个字节的序号。 TCP 的紧急方式是发送端向另一端发送紧急数据的一种方式

    • 选项和填充:最常见的可选字段是最长报文大小,又称为MSS(Maximum Segment Size),每个连接方通常都在通信的第一个报文段(为建立连接而设置SYN标志为1的那个段)中指明这个选项,它表示本端所能接受的最大报文段的长度。选项长度不一定是32位的整数倍,所以要加填充位,即在这个字段中加入额外的零,以保证TCP头是32的整数倍

    • 数据部分: TCP 报文段中的数据部分是可选的。在一个连接建立和一个连接终止时,双方交换的报文段仅有 TCP 首部。如果一方没有数据要发送,也使用没有任何数据的首部来确认收到的数据。在处理超时的许多情况中,也会发送不带任何数据的报文段。

    2、三次握手

    img

    握手过程中传送的包里不包含数据,三次握手完毕后,客户端与服务器才正式开始传送数据。理想状态下,TCP连接一旦建立,在通信双方中的任何一方主动关闭连接之前,TCP 连接都将被一直保持下去。

    为什么是三次握手?两次不行吗?四次不行吗?

    为什么不是两次握手

    这是为了避免服务器建立无用连接(客户端服务器建立连接后,却不传输数据)

    如果只进行两次握手,如果客户端向服务器第一次发送的建立连接的请求因为某原因,兜兜转转绕了一大圈才到达服务器。这期间客户端因为未收到服务器的响应,就会再次发送连接请求,这时服务器收到了,向客户端发送连接请求后,连接便建立了。然后数据传输完毕后,释放连接。这时刚刚兜兜转转一大圈的建立连接的请求到了服务器,服务器收到后再次向客户端发送请求,发送后又建立了连接,但是建立连接后客户端没有再理会服务器,客户端与服务器之间没有传输数据,此时服务器的资源就会被浪费

    img

    为什么不是四次握手

    因为通信不可能100%可靠(红军蓝军约定), 而上面的三次握手已经做好了通信的准备工作, 再增加握手, 并不能显著提高可靠性,所以只需要三次握手就足够了

    这里简单介绍一下红军蓝军约定

    红军和蓝军都想消灭一波敌人,但是单凭他们一个军队的力量都不足以消灭这波敌人,因此他们想到了一起合作,于是红军向蓝军发了一封电报,内容是约定好早上8点一起向敌军进攻,由于他们不确定蓝军是否一定能收到电报, 所以只有收到蓝军的回复之后才会进行进攻,而蓝军也是同样的想法,因为他们不确定红军一定能收到自己的回复而在约定好的时间发动进攻,所以他们只有收到红军的回复后才发动进攻….

    问怎样才能保证这次战役一定胜利呢?答案是不可能的,因为双方都对于自己发出的消息对方是否一定接收得到存在质疑,所以,这样的通信将一直进行下去,结果将是使胜利的几率-直接近100%,但是却永远达不到100%。

    3、四次挥手

    img

    • 第一次挥手
      • 客户端发送一个FIN=1,用来关闭客户端到服务器的数据传送,此后客户端不会再向服务器发送数据(当然,在fin包之前发送出去的数据,如果没有收到对应的ack确认报文,客户端依然会重发这些数据),但是,此时客户端还可以接受数据。 FIN=1,其序列号为seq=u(等于前面已经传送过来的数据的最后一个字节的序号加1),此时,客户端进入FIN-WAIT-1(终止等待1)状态。 TCP规定,FIN报文段即使不携带数据,也要消耗一个序号
    • 第二次挥手
      • 服务器收到FIN包后,发送一个ACK给对方并且带上自己的序列号seq,确认序号为收到序号+1(与SYN相同,一个FIN占用一个序号)。此时,服务端就进入了CLOSE-WAIT(关闭等待)状态。TCP服务器通知高层的应用进程,客户端向服务器的方向就释放了,这时候处于半关闭状态,即客户端已经没有数据要发送了,但是服务器若发送数据,客户端依然要接受。这个状态还要持续一段时间,也就是整个CLOSE-WAIT状态持续的时间
      • 此时,客户端就进入FIN-WAIT-2(终止等待2)状态,等待服务器发送连接释放报文(在这之前还需要接受服务器发送的最后的数据)
    • 第三次挥手
      • 服务器发送一个FIN=1,用来关闭服务器到客户端的数据传送,也就是通知客户端,可以真正地释放连接了。由于在半关闭状态,服务器很可能又发送了一些数据,假定此时的序列号为seq=w,此时,服务器就进入了LAST-ACK(最后确认)状态,等待客户端的确认
    • 第四次挥手
      • 客户端收到FIN后,发送一个ACK=1给服务器,确认序号为收到序号+1,此时,客户端就进入了TIME-WAIT(时间等待)状态。注意此时TCP连接还没有释放,必须经过2MSL(最长报文段寿命)的时间后,当客户端撤销相应的TCB后,才进入CLOSED状态
      • 服务器只要收到了客户端发出的确认,立即进入CLOSED状态。同样,撤销TCB后,就结束了这次的TCP连接。可以看到,服务器结束TCP连接的时间要比客户端早一些

    为什么客户端最后还要等待2MSL

    确保第四次挥手服务器能够收到,同时使失效的连接请求从网络中消失

    MSL是Maximum Segment Lifetime英文的缩写,中文可以译为报文最大生存时间,他是任何报文在网络上存在的最长时间,超过这个时间报文将被丢弃。

    • 保证客户端发送的最后一个ACK报文能够到达服务器,因为这个ACK报文可能丢失。站在服务器的角度看来,我已经发送了FIN+ACK报文请求断开了,客户端还没有给我回应,应该是我发送的请求断开报文它没有收到,于是服务器又会重新发送一次,而客户端就能在这个2MSL时间段内收到这个重传的报文,接着给出回应报文,并且会重启2MSL计时器
    • 防止类似与三次握手中提到了的已经失效的连接请求报文段出现在本连接中。客户端发送完最后一个确认报文后,在这个2MSL时间中,就可以使本连接持续的时间内所产生的所有报文段都从网络中消失(最长生存MSL)。这样新的连接中不会出现旧连接的请求报文

    为什么建立连接是三次握手,关闭连接确是四次挥手

    • 建立连接的时候, 服务器在LISTEN状态下,收到建立连接请求的SYN报文后,把ACK和SYN放在一个报文里发送给客户端
    • 关闭连接时,服务器收到对方的FIN报文时,仅仅表示对方不再发送数据了但是还能接收数据,而自己也未必全部数据都发送给对方了,所以己方可以立即关闭,也可以发送一些数据给对方后,再发送FIN报文给对方来表示同意现在关闭连接,因此,己方ACK和FIN一般都会分开发送,从而导致多了一次

    四、发送HTTPS请求

    1、HTTP简介

    参考你每天都在使用的HTTP协议,到底是什么鬼?

    2、HTTPS简介

    在HTTP的基础上再加一层TLS(传输层安全性协议)或者SSL(安全套接层),就构成了HTTPS协议。

    HTTPS详细介绍可以参考一文带你了解HTTPS

    HTTPS如何保证可靠性

    • 对称加密以及非对称加密
      • 通过非对称加密生成密钥,后面通过这个密钥进行对称加密进行传输
    • 数字签名
      • 保证非对称加密时发送的公钥是被认证过的,是安全可靠的
    • 单向Hash算法

    大致过程如下

    img

    3、HTTPS传输过程

    • 建立TCP连接(HTTP)
    • 将HTTP请求转换为HTTPS请求,转到HTTPS网站
      • 因为一般人输入网址时,都是输入如www.baidu.com,而不会输入https://www.baidu.com。这时默认使用的是HTTP协议,浏览器会帮我们自动转换为HTTPS协议
    • 建立新的TCP连接(HTTPS)
      • 因为HTTP与HTTPS的端口不同。HTTP使用80端口,HTTPS使用443端口
    • 完成一系列的协商工作
      • 完成加密套件的协商和证书的身份确认,这次交互客户端和服务端会协商出相同的密钥交换算法、对称加密算法、内容一致性校验算法、证书签名算法等等。浏览器获取到证书之后,也要验证证书的有效性,是否过期是否撤销
    • 浏览器获取CA域名
      • 如果没有CA域名的缓存,还需要进行DNS解析
    • 再次建立新的TCP连接(CA域名)
    • 发送OCSP请求
      • OCSP全称是Online Certificate Status Protocol,在线证书状态协议,顾名思义用来获取证书状态的请求,这里的状态包括有效、过期、未知。并且可以宽限一段客户端访问证书的时间
    • 进行密钥协商

    经过以上过程后,便可以进行数据的对称加密传输了。

    五、查询MAC地址

    这一步主要负责为打包好的数据+TCP首部+IP首部寻找传输路线,找到IP对应的物理机,这里会用到ARP协议。

    1、ARP协议

    ARP(Address Resolution Protocol)即地址解析协议, 用于实现从 IP 地址到 MAC 地址的映射,即询问目标IP对应的MAC地址。

    2、ARP如何交互

    ARP协议通过一问一答实现交互,但是问和答都有讲究,问是通过广播形式实现,答是通过单播形式。


    以上都是计算机网络的部分,接下来将介绍服务器如何接收与处理请求

    img

    六、请求在Tomcat中的处理流程

    Web 容器以进程的方式在计算机上运行,它主要负责接收请求,并将其投送至特定的应用,但Web容器并不属于计算机网络的组成部分。接下来将以Tomcat为例介绍Web容器的核心组件。

    1、Tomcat的核心组件

    Tomcat的核心组件主要有:Server、Service、Connector、Engine、Host和Conext

    一个Server可以包含多个Service,一个Service可以包含多个Connector,但只能包含一个Engine,一个Engine可以包含多个Host,一个Host可以包含多个Conetxt

    它们之间的关系如下图所示

    img

    配置文件的结构如下

    <Server>                              
        <Service>
            <Engine>
                <Host>
                    <Context />
                </Host>
                <Host>
                    <Context />
                </Host>
            </Engine>  
            <Connector />
            <Connector />
        </Service>
    </Server>
    

    Server

    Server 是整个配置文件的唯一根元素,代表整个 Tomcat 容器。Server 内部可以包含多个 Service,其主要职责就是管理多个 Service,对外提供给客户端访问,同时维护所有 Service 的生命周期,包括初始化服务、结束服务、定位客户端要访问的 Service 等等。

    Service

    Service 的主要职责就是将 Engine 与 Connector 装配在一起对外提供服务。一个 Service 可以包含多个 Connector,但只能包含一个 Engine,其中 Connector 负责从客户端接收请求,Engine 负责处理 Connector 接收进来的请求。

    Connector

    Connector是主要负责接收请求的组件

    Tomcat有以下两种工作模式

    • 作为Web服务器,直接接收客户端的请求
    • 作为Java Web服务器,接收前置Web服务器的请求

    img

    每个 Service 可以有一个或多个 Connector,不同工作模式下,Tomcat 需要为各种类型的请求分别定义相应的 Connector,这样才能正确接收客户端对应协议的请求。定义 Connector 可以使用多种属性,某些属性只适用于某种特定的 Connector 类型。

    一般说来,常见的 Connector 有 4 种类型

    • HTTP
    • HTTPS
    • AJP
    • Proxy

    img

    Connector作为通信接口,它为其所属特定的 Service 接收外部客户端请求,以及回送应答至外部客户端。具体职责包括创建 Request、Response 对象用于跟外部客户端交换数据,并将 Request 交给配套的 Engine 来处理

    Engine

    Engine 是 Service 组件中负责请求处理的组件,其内部可以包含多个 Host。Engine 从一个或多个 Connector 中接收请求并处理,并将处理结果封装成应答交给 Connector,最终回传给外部客户端。

    Host

    Host 代表一个虚拟主机,它对应计算机网络上的一个实体。即某个在 DNS 服务器上注册过的域名或者 IP 地址,例如:www.baidu.com或 201.187.10.21。Host 内部可以包含多个 Context,每个 Context 表示一个 Web 应用。Host 负责安装、展开、启动和结束每个 Web 应用。

    客户端在填写目标地址时会通过主机名来标识它希望访问的服务器,Tomcat 将从 HTTP 请求头的 Host 字段提取主机名,然后再匹配对应的虚拟主机。如果没有找到匹配的,HTTP 请求将被发送至默认主机 defaultHost。

    Context

    Context 代表在特定虚拟主机上运行的一个 Web 应用,负责处理某个特定 Web 应用的所有请求

    2、Tomcat处理HTTP请求

    当以 HTTP 请求到达Tomcat服务器(Server)以后,Tomcat会进行以下几个步骤,将请求交给对应的Web应用进行处理

    • 根据协议类型和端口号选定 Service 和 Engine
      • Connector 主要负责接收请求。当 Connector 接收到特定协议和特定端口的请求后,其所属的 Service 和 Service 下的 Engine 也就确定了
    • 根据域名或 IP 地址选定 Host
      • Engine一旦确定了,就会根据 IP 来选择对应的虚拟主机Host来处理请求。如果匹配失败了,则会使用默认虚拟主机来处理请求
    • 根据 URI 选定 Context
      • URI 中的 context-path 指定了 HTTPS 请求将要访问的 Web 应用
      • 当请求抵达时,Tomcat 将根据 Context 的属性 path 取值与 URI 中的 context-path 的匹配程度来选择 Web 应用处理相应请求

    七、请求在Web应用中的处理流程

    请求被 Web 容器中的 Connector 捕获,选取对应的 Server 中的 Engine ,Engine 再根据IP选择对应的虚拟主机,虚拟主机根据URI将请求交给对应的Web应用进行处理。接下来将介绍请求在Web请求中的处理过程。

    介绍处理过程前,先对Web应用的基本组件进行简单介绍。

    1、Web应用核心组件

    Listener

    监听器 Listener 主要用于监听 Application、Session、Request 等对象的变化,每当这些对象发生变化就会回调用对应的监听方法。

    Filter

    过滤器 Filter 负责对请求做预处理,接着将请求交给 Servlet 进行处理并生成响应,最后 Filter 再对响应进行后处理。

    从请求的处理过程来看,Filter 主要参与以下几个环节

    • 在 HttpServletRequest 到达 Servlet 之前,拦截客户的 HttpServletRequest
    • 根据需要检查 HttpServletRequest,也可以修改 HttpServletRequest 报文头和数据
    • 在 Servlet 生成的 HttpServletResponse 抵达客户端之前,拦截 HttpServletResponse
    • 根据需要检查 HttpServletResponse,也可以修改 HttpServletResponse 报文头和数据

    简单来说就是在真正处理请求以及返回响应之前,通过过滤器对内容再进行一些修改

    Servlet

    Servlet 负责处理客户端访问动态资源的 HTTP 请求,接口 javax.servlet.Servlet 定义了所有 Servlet 必须要实现的方法

    public interface Servlet {
        // 由 Servlet 容器调用,完成 Servlet 初始化,启动对外服务
        void init(ServletConfig var1) throws ServletException;
    
        // 获取 Servlet 初始化和启动时参数的配置信息对象 ServletConfig
        ServletConfig getServletConfig();
    
        // 由 Servlet 容器调用,让 Servlet 处理某个 HTTP 请求
        void service(ServletRequest var1, ServletResponse var2) throws ServletException, IOException;
    
        // 获取 Servlet 的说明信息,包括:作者、版本和版权等等
        String getServletInfo();
    
        // 由 Servlet 容器调用,用于关闭停止 Servlet 提供的服务
        void destroy();
    }
    

    从 HTTP 请求的处理过程来看,Servlet 主要参与以下几个环节

    • 接收请求
      • 客户端请求会被封装成 HttpServletRequest 对象,包含报文头参数和报文体等信息
    • 处理请求
      • 通常调用 Servlet 的方法 service、doPost 或 doGet 等方法处理请求,并进一步调用业务层相应逻辑对其进行处理等
    • 反回响应
      • 处理完请求后,可以转发(forward)、重定向(redirect)到某个视图页面或者直接返回结果数据

    2、Web应用处理HTTP请求流程

    Web 应用处理 HTTP 请求的流程主要是穿越 Listener 和多个 Filters,最终抵达 Servlet 的过程,Servlet再进行下一步的处理。

    具体流程如下图

    img

    八、请求在Spring Web应用中的处理流程

    因为使用 SSM 框架,所以 Spring MVC 中的 DispatcherServlet 充当了 Web 应用中的 Serlvet,负责将任务分配给对应的Controller,并将最终视图返回给 Web 容器。

    1、Spring MVC的核心组件

    DispatcherServlet

    DispatcherServlet 是整个流程控制的中心,由它来接收请求并调用其它组件处理用户的请求,同时还负责响应结果。DispatcherServlet的存在降低了组件之间的耦合性。

    HandlerMapping

    HandlerMapping 负责根据用户请求映射获得对应的 Handler和 HandlerInterceptor。处理方法为从 URL 获得 URI,在通过 URI 从 HandlerMapping 中找到对应的 Handler 和 HandlerInterceptor,即处理器和拦截器。

    HandlerAdapter

    HandlerAdapter 负责按照特定规则去执行 Handler。

    如果 Handler 有对应的 HandlerAdapater,HandlerAdapater 则会在调用 Handler 之前执行 HandlerInterceptor 的 preHandler() 方法对 Handler 进行拦截

    HandlerInterceptor

    HandlerInterceptor 主要负责在执行 Handler 前对其进行拦截。HandlerInterceptor 中的 preHandler() 方法将会提取 HTTP 请求中的数据填充到处理器 Handler 的中。

    Handler

    Handler 即Controller ,是处理业务代码的核心器件。这部分由程序员自行编写,一般的SSM框架中,其下层还有Service和Dao。

    2、Spring MVC处理请求流程

    当 Web 容器中的 Host 会选择对应的 Web应用来处理请求,这里将请求交给了 Spring MVC 中的 DispatcherServlet 来进一步处理请求。

    • DispatcherServlet 通过解析 HTTP 请求的 URL 获得 URI,再根据该 URI 从 HandlerMapping 当中获得该请求对应的 Handler 和 HandlerInterceptor
    • DispatcherServlet 根据获得的 Handler 选择合适的 HandlerAdapter。如果成功获得 HandlerAdapter,HandlerAdapater 则会在调用 Handler 之前执行 HandlerInterceptor 的 preHandler() 方法对 Handler 进行拦截
    • Handler 即 Controller 会进行请求的处理,并向下调用 Service 和 Dao 来处理请求
    • Hander 处理完成请求后会返回模型数据,模型数据由 DispatcherServlet 封装后返回给Web 容器

    处理的流程图如下

    img

    九、返回过程

    Web 应用处理完请求并将结果返回给 Web 容器后,容器会将响应结果返回给客户端,这是上面流程的逆过程。浏览器收到响应结果后,会对结果进行解析和渲染。这样我们就能看到浏览器给我们显示的网页了。

    十、整体流程图

    下面给出了输入URL到浏览器显示界面的流程图

    img

    以上便是从输入URL到浏览器显示页面的整个流程

    参考文献

    你每天都在使用的HTTP协议,到底是什么鬼?

    图解 Spring:HTTP 请求的处理流程与机制

    在浏览器输入 URL 回车之后发生了什么(超详细版)

    史上最详细的经典面试题 从输入URL到看到页面发生了什么?

    展开全文
  • 在上一节中(Python实现网页自动化-初步使用(一))已经部署了Selenium+chromedriver的开发环境,真正的开发之前,还需要学会利用浏览器查找网页元素; 因为Selenium是通过程序来自动操控网页的控件元素,比如...
  • 一个用来显示原有的页面加载过来的所有数据,另一个用来盛放查找时符合查找要求的数据。 例子:html代码:(后台语言为php) <section class="recordlist"> <div class="searchbox"> <span class="searchicon"><i ...
  • Visual C#打造多页面网页浏览器关键词: Visual C#打造多页面网页浏览器 一、简介 大家都知道,目前比较流行的网络浏览器如Mozilla FireFox以及MyIE2等都具有多页面浏览功能,每打开一个新的页面都自动产生一个新的...
  • 以下方式都是在查找机器学习、深度学习相关的论文而发现的。 目录 一.https://arxiv.org/search/cs 二.semanticscholar:https://www.semanticscholar.org/search?year%5B0%5D=2014&year%5B1%5D=2019&q=...
  • JSP页面缓存技术--浏览器缓存
  • 在浏览器地址栏输入URL之后发生了什么?eg:www.baidu.com URL解析 地址解析:首先判断你输入的是一个合法的 URL 还是一个待搜索的关键词,并且根据你输入的内容进行自动完成、字符编码等操作。 https:由于安全...
  • JSP页面缓存技术浏览器缓存

    千次阅读 2011-01-14 01:04:00
    一、概述   缓存的思想可以应用软件分层的各个层面。它是一种内部机制,对外界而言,是不可感知的。   数据库本身有缓存,持久层也可以缓存。(比如:hibernate,还分1级和2级缓存)  ...
  • 前端页面也可以写,但如果前端页面没有写,他只是留了一个空位,让我们后端去显示,我们就需要自己去编写。 首先凡是涉及到数据,我们都离不开pojo类,要写这个pojo类,我们是需要先去数据库查看一下对应的信息,...
  • 相信很多人和我一样,使用浏览器搜索或者浏览网页的时候,没有仔细的考虑在浏览器的地址栏输入网址或者搜索关键词之后,浏览器和服务器到底做了什么工作。下面是一个总体的过程,其中蓝色方块的过程会进行详细的...
  • html5页面不使用浏览器缓存

    千次阅读 2018-04-25 09:33:59
    如果需要html页面上设置不缓存,这&lt;head&gt;标签中加入如下语句:1 &lt;meta http-equiv="pragma" content="no-cache"&gt;2 &lt;meta http-equiv="cache-...
  • 这个问题已经是老生常谈了,更是经常被某厂作为面试的压轴题,网上也有很多文章但最近闲的无聊,然后就自己做了一篇笔记,大致流程URL 解析、DNS ...第二步 浏览器去万网或者阿里云DNS查找该域名的IP地址判断是否存...
  • 使用Ajax采集数据时,有些Ajax接口含有很多的加密参数,直接很难发现规律。此时,就可以使用模拟浏览器运行的方式来采集。Python 提供了许多模拟浏览器运行的库,如Selenium、Splash、PyV8、Ghost等。 一、模拟...
  • 本文的步骤是建立,请求的是一个简单的 HTTP 请求,没有 HTTPS、HTTP2、最简单的 DNS、没有代理、并且服务器没有任何问题的基础上,尽管这是不切实际的。 大致流程 URL 解析 DNS 查询 TCP 连接 处理请求 接受响应 ...
  • 定位到关键词位置并添加样式 结束 查找关键词、高亮、记录位置 yes no yes no 注 文章是个人知识点整理总结,如有错误和不足之处欢迎指正。 如有疑问、或希望与笔者探讨技术问题(包括但不限于本章内容),欢迎添加...
  • 总体的流程: DNS解析:将域名解析成IP地址 ... 浏览器解析渲染页面 结束连接:TCP四次挥手 DNS解析 TCP连接 发送HTTP请求 服务器处理请求并返回HTTP响应 浏览器解析渲染页面 TCP四次挥手 ...
  •  缓存的思想可以应用软件分层的各个层面。它是一种内部机制,对外界而言,是不可感知的。  数据库本身有缓存,持久层也可以缓存。(比如:hibernate,还分1级和2级缓存)  业务层也可以有缓存(但...
  • 地址栏输入URL按下enter键,到页面展示,这中间都发生了什么 这是一道常考的面试题,涉及到网络、操作系统、浏览器渲染等问题,看一下李兵老师的一副总结图片,比较全面的总结了其中的过程 由上图可知,整个...
  • 这篇笔记是我这两天看了数十篇文章总结出来的,所以相对全面一点,但由于我是做前端的,所以会比较重点分析浏览器渲染页面那一部分,至于其他部分我会罗列出关键词,感兴趣的可以自行查阅, 注意: 本文的步骤是建立...
  • 首先判断你输入的是一个合法的 URL 还是一个待搜索的关键词,并且根据你输入的内容进行自动完成、字符编码等操作。 HSTS 由于安全隐患,会使用 HSTS 强制客户端使用 HTTPS 访问页面。详见:你所不知道的 HSTS。...
  • 0.安装selenium + Chrome Driver 安装selenium: pip install selenium 安装Chrome Driver: ... 版本要对应(chrome://version查看版本) ...1.使用selenium模拟浏览器操作demo from selenium import webdriver impo
  • 这篇笔记是我这两天看了数十篇文章总结出来的,所以相对全面一点,但由于我是做前端的,所以会比较重点分析浏览器渲染页面那一部分,至于其他部分我会罗列出关键词,感兴趣的可以自行查阅, **注意:**本文的步骤是...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 16,997
精华内容 6,798
关键字:

在浏览器页面查找关键词