JavaWeb基础知识总结. (10)

现在有WEB应用A,向客户端发送了10个Cookie,这就说明客户端无论访问应用A的哪个Servlet都会把这10个Cookie包含在请求中!但是也许只有AServlet需要读取请求中的Cookie,而其他Servlet根本就不会获取请求中的Cookie。这说明客户端浏览器有时发送这些Cookie是多余的!

可以通过设置Cookie的path来指定浏览器,在访问什么样的路径时,包含什么样的Cookie。

3.2 Cookie路径与请求路径的关系

下面我们来看看Cookie路径的作用:

下面是客户端浏览器保存的3个Cookie的路径:

a: /cookietest;

b: /cookietest/servlet;

c: /cookietest/jsp;

下面是浏览器请求的URL:

A: :8080/cookietest/AServlet;

B: :8080/cookietest/servlet/BServlet;

C: :8080/cookietest/jsp/CServlet;

l 请求A时,会在请求中包含a;

l 请求B时,会在请求中包含a、b;

l 请求C时,会在请求中包含a、c;

也就是说,请求路径如果包含了Cookie路径,那么会在请求中包含这个Cookie,否则不会请求中不会包含这个Cookie。

l A请求的URL包含了“/cookietest”,所以会在请求中包含路径为“/cookietest”的Cookie;

l B请求的URL包含了“/cookietest”,以及“/cookietest/servlet”,所以请求中包含路径为“/cookietest”和“/cookietest/servlet”两个Cookie;

l B请求的URL包含了“/cookietest”,以及“/cookietest/jsp”,所以请求中包含路径为“/cookietest”和“/cookietest/jsp”两个Cookie;

3.3 设置Cookie的路径

设置Cookie的路径需要使用setPath()方法,例如:

cookie.setPath(“/cookietest/servlet”);

如果没有设置Cookie的路径,那么Cookie路径的默认值当前访问资源所在路径,例如:

l 访问:8080/cookietest/AServlet时添加的Cookie默认路径为/cookietest;

l 访问:8080/cookietest/servlet/BServlet时添加的Cookie默认路径为/cookietest/servlet;

l 访问:8080/cookietest/jsp/BServlet时添加的Cookie默认路径为/cookietest/jsp;

4 Cookie的domain

Cookie的domain属性可以让网站中二级域共享Cookie,次要!

百度你是了解的对吧!

现在我希望在这些主机之间共享Cookie(例如在中响应的cookie,可以在news.baidu.com请求中包含)。很明显,现在不是路径的问题了,而是主机的问题,即域名的问题。处理这一问题其实很简单,只需要下面两步:

l 设置Cookie的path为“/”:c.setPath(“/”);

l 设置Cookie的domain为“.baidu.com”:c.setDomain(“.baidu.com”)。

当domain为“.baidu.com”时,无论前缀是什么,都会共享Cookie的。但是现在我们需要设置两个虚拟主机:和news.baidu.com。

第一步:设置windows的DNS路径解析

找到C:\WINDOWS\system32\drivers\etc\hosts文件,添加如下内容

127.0.0.1       localhost

127.0.0.1      

127.0.0.1       news.baidu.com

 

第二步:设置Tomcat虚拟主机

找到server.xml文件,添加<Host>元素,内容如下:

<Host  appBase="F:\webapps\www"

unpackWARs="true" autoDeploy="true"

xmlValidation="false" xmlNamespaceAware="false"/>

<Host  appBase="F:\webapps\news"

unpackWARs="true" autoDeploy="true"

xmlValidation="false" xmlNamespaceAware="false"/>

 

第三步:创建A项目,创建AServlet,设置Cookie。

Cookie c = new Cookie("id", "baidu");

c.setPath("http://www.likecs.com/");

c.setDomain(".baidu.com");

c.setMaxAge(60*60);

response.addCookie(c);

response.getWriter().print("OK");

 

把A项目的WebRoot目录复制到F:\webapps\www目录下,并把WebRoot目录的名字修改为ROOT。

第四步:创建B项目,创建BServlet,获取Cookie,并打印出来。

Cookie[] cs = request.getCookies();

if(cs != null) {

for(Cookie c : cs) {

String s = c.getName() + ": " + c.getValue() + "<br/>";

response.getWriter().print(s);

}

}

 

把B项目的WebRoot目录复制到F:\webapps\news目录下,并把WebRoot目录的名字修改为ROOT。

第五步:访问\AServlet,然后再访问news.baidu.com\BServlet。

5 Cookie中保存中文

Cookie的name和value都不能使用中文,如果希望在Cookie中使用中文,那么需要先对中文进行URL编码,然后把编码后的字符串放到Cookie中。

向客户端响应中添加Cookie

String name = URLEncoder.encode("姓名", "UTF-8");

String value = URLEncoder.encode("张三", "UTF-8");

Cookie c = new Cookie(name, value);

c.setMaxAge(3600);

response.addCookie(c);

 

从客户端请求中获取Cookie

response.setContentType("text/html;charset=utf-8");

Cookie[] cs = request.getCookies();

if(cs != null) {

for(Cookie c : cs) {

String name = URLDecoder.decode(c.getName(), "UTF-8");

String value = URLDecoder.decode(c.getValue(), "UTF-8");

String s = name + ": " + value + "<br/>";

response.getWriter().print(s);

}

}

 
显示曾经浏览过的商品

index.jsp

<body>

<h1>商品列表</h1>

<a href=http://www.likecs.com/"/day06_3/GoodServlet?name=ThinkPad">ThinkPad</a><br/>

<a href=http://www.likecs.com/"/day06_3/GoodServlet?name=Lenovo">Lenovo</a><br/>

<a href=http://www.likecs.com/"/day06_3/GoodServlet?name=Apple">Apple</a><br/>

<a href=http://www.likecs.com/"/day06_3/GoodServlet?name=HP">HP</a><br/>

<a href=http://www.likecs.com/"/day06_3/GoodServlet?name=SONY">SONY</a><br/>

<a href=http://www.likecs.com/"/day06_3/GoodServlet?name=ACER">ACER</a><br/>

<a href=http://www.likecs.com/"/day06_3/GoodServlet?name=DELL">DELL</a><br/>

<hr/>

您浏览过的商品:

<%

Cookie[] cs = request.getCookies();

if(cs != null) {

for(Cookie c : cs) {

if(c.getName().equals("goods")) {

out.print(c.getValue());

}

}

}

%>

</body>

 

GoodServlet

public class GoodServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException {

String goodName = request.getParameter("name");

String goods = CookieUtils.getCookValue(request, "goods");

if(goods != null) {

String[] arr = goods.split(", ");

Set<String> goodSet = new LinkedHashSet(Arrays.asList(arr));

goodSet.add(goodName);

goods = goodSet.toString();

goods = goods.substring(1, goods.length() - 1);

else {

goods = goodName;

}

Cookie cookie = new Cookie("goods", goods);

cookie.setMaxAge(1 * 60 * 60 * 24);

response.addCookie(cookie);

response.sendRedirect("/day06_3/index.jsp");

}

}

 

CookieUtils

public class CookieUtils {

public static String getCookValue(HttpServletRequest request, String name) {

Cookie[] cs = request.getCookies();

if(cs == null) {

return null;

}

for(Cookie c : cs) {

if(c.getName().equals(name)) {

return c.getValue();

}

}

return null;

}

}

 
HttpSession HttpSession概述 1.1 什么是HttpSesssion

javax.servlet.http.HttpSession接口表示一个会话,我们可以把一个会话内需要共享的数据保存到HttSession对象中!

1.2 获取HttpSession对象

l HttpSession request.getSesssion():如果当前会话已经有了session对象那么直接返回,如果当前会话还不存在会话,那么创建session并返回;

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/zwzfdw.html