|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
java也能做一些底层语言开发做的事情(难度很高,不是java顶尖高手是做不来的),cookie|js|servlet
9.1Cookie概述
Cookie是服务器发送给扫瞄器的体积很小的纯文本信息,用户今后会见统一个Web服务器时扫瞄器会把它们原样发送给服务器。经由过程让服务器读取它本来保留到客户真个信息,网站可以为扫瞄者供应一系列的便利,比方在线买卖过程当中标识用户身份、平安请求不高的场所制止用户反复输出名字和暗码、流派网站的主页定制、有针对性地投放告白,等等。
Cookie的目标就是为用户带来便利,为网站带来增值。固然有着很多误传,现实上Cookie其实不会形成严峻的平安威逼。Cookie永久不会以任何体例实行,因而也不会带来病毒或打击你的体系。别的,因为扫瞄器一样平常只同意寄存300个Cookie,每一个站点最多寄存20个Cookie,每一个Cookie的巨细限定为4KB,因而Cookie不会塞满你的硬盘,更不会被用作“回绝服务”打击手腕。
9.2Servlet的CookieAPI
要把Cookie发送到客户端,Servlet先要挪用newCookie(name,value)用符合的名字和值创立一个或多个Cookie(2.1节),经由过程cookie.setXXX设置各类属性(2.2节),经由过程response.addCookie(cookie)把cookie到场应对头(2.3节)。
要从客户端读进Cookie,Servlet应当挪用request.getCookies(),getCookies()办法前往一个Cookie对象的数组。在年夜多半情形下,你只必要用轮回会见该数组的各个元素寻觅指命名字的Cookie,然后对该Cookie挪用getValue办法获得与指命名字联系关系的值,这部份内容将在2.4节会商。
9.2.1创立Cookie
挪用Cookie对象的机关函数能够创立Cookie。Cookie对象的机关函数有两个字符串参数:Cookie名字和Cookie值。名字和值都不克不及包括空缺字符和以下字符:
[]()=,"/?@:;
9.2.2读取和设置Cookie属性
把Cookie到场待发送的应对头之前,你能够检察或设置Cookie的各类属性。上面择要先容这些办法:
getComment/setComment
猎取/设置Cookie的正文。
getDomain/setDomain
猎取/设置Cookie合用的域。一样平常地,Cookie只前往授与发送它的服务器名字完整不异的服务器。利用这里的办法能够唆使扫瞄器把Cookie前往给统一域内的其他服务器。注重域必需以点入手下手(比方.sitename.com),非国度类的域(如.com,.edu,.gov)必需包括两个点,国度类的域(如.com.cn,.edu.uk)必需包括三个点。
getMaxAge/setMaxAge
猎取/设置Cookie过时之前的工夫,以秒计。假如不设置该值,则Cookie只在以后会话内无效,即在用户封闭扫瞄器之前无效,并且这些Cookie不会保留到磁盘上。拜见上面有关LongLivedCookie的申明。
getName/setName
猎取/设置Cookie的名字。实质上,名字和值是我们一直体贴的两个部分。因为HttpServletRequest的getCookies办法前往的是一个Cookie对象的数组,因而一般要用轮回来会见这个数组查找特命名字,然后用getValue反省它的值。
getPath/setPath
猎取/设置Cookie合用的路径。假如不指定路径,Cookie将前往给以后页面地点目次及其子目次下的一切页面。这里的办法能够用来设定一些更一样平常的前提。比方,someCookie.setPath("/"),此时服务器上的一切页面都能够吸收到该Cookie。
getSecure/setSecure
猎取/设置一个boolean值,该值暗示是不是Cookie只能经由过程加密的毗连(即SSL)发送。
getValue/setValue
猎取/设置Cookie的值。如前所述,名字和值实践上是我们一直体贴的两个方面。不外也有一些破例情形,好比把名字作为逻辑标志(也就是说,假如名字存在,则暗示true)。
getVersion/setVersion
猎取/设置Cookie所服从的协定版本。默许版本0(服从本来的Netscape标准);版本1服从RFC2109,但还没有失掉普遍的撑持。
9.2.3在应对头中设置Cookie
Cookie能够经由过程HttpServletResponse的addCookie办法到场到Set-Cookie应对头。上面是一个例子:
CookieuserCookie=newCookie("user","uid1234");
response.addCookie(userCookie);
9.2.4读取保留到客户真个Cookie
要把Cookie发送到客户端,先要创立Cookie,然后用addCookie发送一个Set-CookieHTTP应对头。这些内容已在下面的2.1节先容。从客户端读取Cookie时挪用的是HttpServletRequest的getCookies办法。该办法前往一个与HTTP哀求头中的内容对应的Cookie对象数组。失掉这个数组以后,通常为用轮回会见个中的各个元素,挪用getName反省各个Cookie的名字,直至找到方针Cookie。然后对这个方针Cookie挪用getValue,依据取得的了局举行其他处置。
上述处置历程常常会碰到,为便利计上面我们供应一个getCookieValue办法。只需给出Cookie对象数组、Cookie名字和默许值,getCookieValue办法就会前往婚配指命名字的Cookie值,假如找不到指定Cookie,则前往默许值。
9.3几个Cookie工具函数
上面是几个工具函数。这些函数固然复杂,可是,在和Cookie打交道的时分很有效。
9.3.1猎取指命名字的Cookie值
该函数是ServletUtilities.java的一部分。getCookieValue经由过程轮回顺次会见Cookie对象数组的各个元素,寻觅是不是有指命名字的Cookie,如找到,则前往该Cookie的值;不然,前往参数中给出的默许值。getCookieValue可以在必定水平上简化Cookie值的提取。
publicstaticStringgetCookieValue(Cookie[]cookies,
StringcookieName,
StringdefaultValue){
for(inti=0;i<cookies.length;i++){
Cookiecookie=cookies;
if(cookieName.equals(cookie.getName()))
return(cookie.getValue());
}
return(defaultValue);
}
9.3.2主动保留的Cookie
上面是LongLivedCookie类的代码。假如你但愿Cookie可以在扫瞄器加入的时分主动保留上去,则能够用这个LongLivedCookie类来代替尺度的Cookie类。
packagehall;
importjavax.servlet.http.*;
publicclassLongLivedCookieextendsCookie{
publicstaticfinalintSECONDS_PER_YEAR=60*60*24*365;
publicLongLivedCookie(Stringname,Stringvalue){
super(name,value);
setMaxAge(SECONDS_PER_YEAR);
}
}
9.4.实例:定制的搜刮引擎界面
上面也是一个搜刮引擎界面的例子,经由过程修正后面HTTP形态代码的例子失掉。在这个Servlet中,用户界面是静态天生而不是由静态HTML文件供应的。Servlet除卖力读取表双数据并把它们发送给搜刮引擎以外,还要把包括表双数据的Cookie发送给客户端。今后客户再次会见统一表单时,这些Cookie的值将用来事后添补表单,使表单主动显现比来利用过的数据。
SearchEnginesFrontEnd.java
该Servlet机关一个次要由表单组成的用户界面。第一次显现的时分,它和后面用静态HTML页面供应的界面差未几。但是,用户选择的值将被保留到Cookie(本页面将数据发送到CustomizedSearchEnginesServlet,由后者设置Cookie)。用户今后再会见统一页面时,即便扫瞄器是加入以后再启动,表单中也会主动填好上一次搜刮所填写的内容。
注重该Servlet用到了ServletUtilities.java,个中getCookieValue后面已先容过,headWithTitle用于天生HTML页面的一部分。别的,这里也用到了后面已申明的LongLiveCookie类,我们用它来创立取消刻日很长的Cookie。
packagehall;
importjava.io.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
importjava.net.*;
publicclassSearchEnginesFrontEndextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,
HttpServletResponseresponse)
throwsServletException,IOException{
Cookie[]cookies=request.getCookies();
StringsearchString=
ServletUtilities.getCookieValue(cookies,
"searchString",
"JavaProgramming");
StringnumResults=
ServletUtilities.getCookieValue(cookies,
"numResults",
"10");
StringsearchEngine=
ServletUtilities.getCookieValue(cookies,
"searchEngine",
"google");
response.setContentType("text/html");
PrintWriterout=response.getWriter();
Stringtitle="SearchingtheWeb";
out.println(ServletUtilities.headWithTitle(title)+
"<BODYBGCOLOR=\"#FDF5E6\">\n"+
"<H1ALIGN=\"CENTER\">SearchingtheWeb</H1>\n"+
"\n"+
"<FORMACTION=\"/servlet/hall.CustomizedSearchEngines\">\n"+
"<CENTER>\n"+
"SearchString:\n"+
"<INPUTTYPE=\"TEXT\"NAME=\"searchString\"\n"+
"VALUE=\""+searchString+"\"><BR>\n"+
"ResultstoShowPerPage:\n"+
"<INPUTTYPE=\"TEXT\"NAME=\"numResults\"\n"+
"VALUE="+numResults+"SIZE=3><BR>\n"+
"<INPUTTYPE=\"RADIO\"NAME=\"searchEngine\"\n"+
"VALUE=\"google\""+
checked("google",searchEngine)+">\n"+
"Google|\n"+
"<INPUTTYPE=\"RADIO\"NAME=\"searchEngine\"\n"+
"VALUE=\"infoseek\""+
checked("infoseek",searchEngine)+">\n"+
"Infoseek|\n"+
"<INPUTTYPE=\"RADIO\"NAME=\"searchEngine\"\n"+
"VALUE=\"lycos\""+
checked("lycos",searchEngine)+">\n"+
"Lycos|\n"+
"<INPUTTYPE=\"RADIO\"NAME=\"searchEngine\"\n"+
"VALUE=\"hotbot\""+
checked("hotbot",searchEngine)+">\n"+
"HotBot\n"+
"<BR>\n"+
"<INPUTTYPE=\"SUBMIT\"VALUE=\"Search\">\n"+
"</CENTER>\n"+
"</FORM>\n"+
"\n"+
"</BODY>\n"+
"</HTML>\n");
}
privateStringchecked(Stringname1,Stringname2){
if(name1.equals(name2))
return("CHECKED");
else
return("");
}
}
CustomizedSearchEngines.java
后面的SearchEnginesFrontEndServlet把数据发送到CustomizedSearchEnginesServlet。本例在很多方面与后面先容HTTP形态代码时的例子类似,区分在于,本例除要机关一个针对搜刮引擎的URL并向用户发送一个重定向应对以外,还要发送保留用户数据的Cookies。
packagehall;
importjava.io.*;
importjavax.servlet.*;
importjavax.servlet.http.*;
importjava.net.*;
publicclassCustomizedSearchEnginesextendsHttpServlet{
publicvoiddoGet(HttpServletRequestrequest,
HttpServletResponseresponse)
throwsServletException,IOException{
StringsearchString=request.getParameter("searchString");
CookiesearchStringCookie=
newLongLivedCookie("searchString",searchString);
response.addCookie(searchStringCookie);
searchString=URLEncoder.encode(searchString);
StringnumResults=request.getParameter("numResults");
CookienumResultsCookie=
newLongLivedCookie("numResults",numResults);
response.addCookie(numResultsCookie);
StringsearchEngine=request.getParameter("searchEngine");
CookiesearchEngineCookie=
newLongLivedCookie("searchEngine",searchEngine);
response.addCookie(searchEngineCookie);
SearchSpec[]commonSpecs=SearchSpec.getCommonSpecs();
for(inti=0;i<commonSpecs.length;i++){
SearchSpecsearchSpec=commonSpecs;
if(searchSpec.getName().equals(searchEngine)){
Stringurl=
searchSpec.makeURL(searchString,numResults);
response.sendRedirect(url);
return;
}
}
response.sendError(response.SC_NOT_FOUND,
"Norecognizedsearchenginespecified.");
}
publicvoiddoPost(HttpServletRequestrequest,
HttpServletResponseresponse)
throwsServletException,IOException{
doGet(request,response);
}
}
你说是sun公司对她研究的透还是微软?针对自己工具开发的.net性能上肯定会站上风的。 |
|