`
playfish
  • 浏览: 289548 次
  • 性别: Icon_minigender_1
  • 来自: 福州
社区版块
存档分类
最新评论

搞定struts中cookie

    博客分类:
  • Java
阅读更多
今天碰到的一个问题:配置页提交一个信息到struts的action中,action将这个信息保存到cookie以及action result中。用户如果以后登陆的话,从cookie中读出上次的配置信息。

检查过所有读写cookie的代码,没错,但是诡异的是,JSP上面就是无法获得在action中设置的cookie的值。

思想向后,查找了下cookie的规范,看看cookie是如何读写,如何跟随,如何判断作用域的。规范没找到多少,但是至少明白了一点,只有同一个域下面才可以读取cookie。

后来想到,到C:\Documents and Settings\fangyuqiang\Cookies 这里面找到本机上保存的所有cookie文件,按时间排序选一下最近生成的cookie,打开一看:
sourceType
163
localhost/mod/stock/
1024
1134027776
29974744
1271499136
29968709
*
stockCodesStr
"000001,600222"
localhost/mod/stock/
1024
1134027776
29974744
1271499136
29968709
*


这个cookie允许的读取域是localhost/mod/stock/,而jsp页的地址确是localhost/mod/pages/stock/view.jsp。终于明白,原来是struts的action中写cookie造成了这样的问题。

在struts的action中写cookie,它会将作用域设置成action的路径,如果action的路径跟实际的jsp地址有出入,不在同一个域下,例如这里的localhost/mod/stock/跟localhost/mod/pages/stock/,这样在localhost/mod/pages/stock/这里的jsp就读取不到这个cookie,对此,你只要修改下struts的路径,将cookie的路径保持跟你jsp的路径相一致就可以了。此外,cookie应该是可以手动的设置路径的,我想这个也能解决问题,不过我没做尝试。

顺便便宜放送下cookie读写的代码:
cookie生成与添加,这段代码可以放在struts的action里面或者servlet里面
			//保存信息到cookie中
			Cookie sourceTypeCookie = new Cookie("sourceType", sourceType);
			Cookie stockCodesStrCookie = new Cookie("stockCodesStr", stockCodesStr);

			// 生命周期
			sourceTypeCookie.setMaxAge(60 * 60 * 24 * 30); // 保存30天
			stockCodesStrCookie.setMaxAge(60 * 60 * 24 * 30); // 保存30天

			response.addCookie(sourceTypeCookie);
			response.addCookie(stockCodesStrCookie);

jsp页面读取cookie
		//判断cookie中是否存在参数
		Cookie[] cookies = request.getCookies();
		if (cookies != null) {
			for (int i = 0; i < cookies.length; i++) {
				Cookie c = cookies[i];
				System.out.println(c.getName()+"="+c.getValue());
				if (c.getName().equalsIgnoreCase("sourceType")) {
					sourceType = c.getValue();
				} 
				if (c.getName().equalsIgnoreCase("stockCodesStr")) {
					stockCodesStr = c.getValue();
					stockCodes = stockCodesStr.split(",");
				}
			}
		}

一些cookie资料的补充

什么是Cookies?


你会问,什么是cookies呢? cookie 是浏览器保存在用户计算机上的少量数据。它与特定的WEB页或WEB站点关联起来,自动地在WEB浏览器和WEB服务器之间传递。

比如,如果你运行的是Windows操作系统,使用Internet Explorer上网,那么你会发现在你的“Windows”目录下面有一个子目录,叫做“Temporary Internet Files”。如果你有空看看这个目录,就会发现里面有一些文件,文件名称看起来就象电子邮件地址。比如在我机器上的这个目录里,就有 “jim@support.microsoft.com”这样的文件。这是一个cookie 文件,这个文件从哪来呢?猜一猜,它来自微软的支持站点。顺便说一句,这不是我的电子邮件地址,特此澄清。

对于管理细小的、不重要的、不想保存在中央数据库里的细节信息,Cookies 是个很不错的方案。(这不是说大家的名字不重要。)比如,目前网站上不断增长的自定义服务,可以为每个用户定制他们要看的内容。如果你设计的就是这样一个站点,那么你怎么来管理这样的信息:一个用户喜欢绿色的菜单条,而另一个喜欢红色的。确实是个累人的问题。不过,这样的信息,可以很安全地记录到 cookie,并保存在用户的计算机上,而你自己的数据库空间可以留给更长久更有意义的数据。

FYI: Cookies 对于安全用途,通常很有用。我不想在此就这一问题过于深入,只是提供一个示例,可以看到如何使用在一段时间之后过期的cookies来保证站点安全:

使用用户名和口令,通过 SSL 登录。
在服务器的数据库里检查用户名和口令。如果登录成功,建立一个当前时间标签的消息摘要 (比如 MD5) ,并把它保存在cookie和服务器数据库里。把用户的登录时间保存在服务器数据库里面的用户记录里。
在进行每个安全事务时(用户处于登录状态的任何事务),把cookie的消息摘要和保存在服务器数据库里的摘要进行比较,如果比较失败,就把用户引导到登录界面。
如果第3步检查通过,那么检查当前时间和登录时间之音经过的时间是否超过允许的时间长度。如果用户已经超时,那么就把用户引到登录界面。
如果第3步和第4步都通过了,那么把登录时间重新设置成当前时间,允许事务发生。那些需要你登录的安全站点,可能多数使用的都是和这里介绍的类似的方法。
Cookie的构成

Cookies 最初设计时,是为了CGI编程。但是,我们也可以使用Javascript脚本来操纵cookies。在本文里,我们将演示如何使用Javascript 脚本来操纵cookies。(如果有需求,我可能会在以后的文章里介绍如何使用Perl进行cookie管理。但是如果实在等不得,那么我现在就教你一手:仔细看看CGI.pm。在这个CGI包里有一个cookie()函数,可以用它建立cookie。但是,还是让我们先来介绍cookies的本质。

在Javascript脚本里,一个cookie 实际就是一个字符串属性。当你读取cookie的值时,就得到一个字符串,里面当前WEB页使用的所有cookies的名称和值。每个cookie除了 name名称和value值这两个属性以外,还有四个属性。这些属性是: expires过期时间、 path路径、 domain域、以及 secure安全。

Expires – 过期时间。指定cookie的生命期。具体是值是过期日期。如果想让cookie的存在期限超过当前浏览器会话时间,就必须使用这个属性。当过了到期日期时,浏览器就可以删除cookie文件,没有任何影响。

Path – 路径。指定与cookie关联的WEB页。值可以是一个目录,或者是一个路径。如果http://www.zdnet.com/devhead /index.html 建立了一个cookie,那么在http://www.zdnet.com/devhead/目录里的所有页面,以及该目录下面任何子目录里的页面都可以访问这个cookie。这就是说,在http://www.zdnet.com/devhead/stories/articles 里的任何页面都可以访问http://www.zdnet.com/devhead/index.html建立的cookie。但是,如果http: //www.zdnet.com/zdnn/ 需要访问http://www.zdnet.com/devhead/index.html设置的cookes,该怎么办?这时,我们要把cookies 的path属性设置成“/”。在指定路径的时候,凡是来自同一服务器,URL里有相同路径的所有WEB页面都可以共享cookies。现在看另一个例子:如果想让 http://www.zdnet.com/devhead/filters/ 和http://www.zdnet.com/devhead/stories/共享cookies,就要把path设成“/devhead”。

Domain – 域。指定关联的WEB服务器或域。值是域名,比如zdnet.com。这是对path路径属性的一个延伸。如果我们想让 catalog.mycompany.com 能够访问shoppingcart.mycompany.com设置的cookies,该怎么办? 我们可以把domain属性设置成“mycompany.com”,并把path属性设置成“/”。FYI:不能把cookies域属性设置成与设置它的服务器的所在域不同的值。

Secure – 安全。指定cookie的值通过网络如何在用户和WEB服务器之间传递。这个属性的值或者是“secure”,或者为空。缺省情况下,该属性为空,也就是使用不安全的HTTP连接传递数据。如果一个 cookie 标记为secure,那么,它与WEB服务器之间就通过HTTPS或者其它安全协议传递数据。不过,设置了secure属性不代表其他人不能看到你机器本地保存的cookie。换句话说,把cookie设置为secure,只保证cookie与WEB服务器之间的数据传输过程加密,而保存在本地的 cookie文件并不加密。如果想让本地cookie也加密,得自己加密数据。

操纵Cookies

请记住,cookie 就是文档的一个字符串属性。要保存cookie,只要建立一个字符串,格式是name=<value>(名称=值),然后把文档的 document.cookie 设置成与它相等即可。比如,假设想保存表单接收到的用户名,那么代码看起来就象这样:

document.cookie = "username" + escape(form.username.value); 在这里,使用 escape() 函数非常重要,因为cookie值里可能包含分号、逗号或者空格。这就是说,在读取cookie值时,必须使用对应的unescape()函数给值解码。

我们当然还得介绍cookie的四个属性。这些属性用下面的格式加到字符串值后面:

name=<value>[; expires=<date>][; domain=<domain>][; path=<path>][; secure]

名称=<值>[; expires=<日期>][; domain=<域>][; path=<路径>][; 安全]


<value>,
的.toGMTString() 方法得到这一GMT格式的日期值。方括号代表这项是可选的。比如在 [; secure]两边的方括号代表要想把cookie设置成安全的,就需要把"; secure" 加到cookie字符串值的后面。如果"; secure" 没有加到cookie字符串后面,那么这个cookie就是不安全的。不要把尖括号<> 和方括号[] 加到cookie里(除非它们是某些值的内容)。设置属性时,不限属性,可以用任何顺序设置。

下面是一个例子,在这个例子里,cookie "username" 被设置成在15分钟之后过期,可以被服务器上的所有目录访问,可以被"mydomain.com"域里的所有服务器访问,安全状态为安全。

// Date() 的构造器设置以毫秒为单位
// .getTime() 方法返回时间,单位为毫秒
// 所以要设置15分钟到期,要用60000毫秒乘15分钟
var expiration = new Date((new Date()).getTime() + 15 * 60000);
document.cookie = "username=" + escape(form.username.value)+ "; expires ="
+ expiration.toGMTString() + "; path=" + "/" + "; _
domain=" + "mydomain.com" + "; secure"; 读取cookies值有点象个小把戏,因为你一次就得到了属于当前文档的所有cookies。

// 下面这个语句读取了属于当前文档的所有cookies
var allcookies = document.cookie; 现在,我们得解析allcookies变量里的不同cookies,找到感兴趣的指定cookie。这个工作很简单,因为我们可以利用Javascript语言提供的扩展字符串支持。

如果我们对前面分配的cookie "username" 感兴趣,可以用下面的脚本来读取它的值。

// 我们定义一个函数,用来读取特定的cookie值。
function getCookie(cookie_name)
{
var allcookies = document.cookie;
var cookie_pos = allcookies.indexOf(cookie_name);

  // 如果找到了索引,就代表cookie存在,
// 反之,就说明不存在。
if (cookie_pos != -1)
{
  // 把cookie_pos放在值的开始,只要给值加1即可。
  cookie_pos += cookie_name.length + 1;
  var cookie_end = allcookies.indexOf(";", cookie_pos);

  if (cookie_end == -1)
  {
   cookie_end = allcookies.length;
  }

  var value = unescape(allcookies.substring(cookie_pos, cookie_end));
}

return value;
}

// 调用函数
var cookie_val = getCookie("username");上面例程里的 cookie_val 变量可以用来生成动态内容,或者发送给服务器端CGI脚本进行处理。现在你知道了使用Javascript脚本操纵cookies的基本方法。但是,如果你跟我一样,那么我们要做的第一件事,就是建立一些接口函数,把cookies处理上的麻烦隐藏起来。不过,在你开始编程之前,稍候片刻。这些工作,早就有人替你做好了。你要做的,只是到哪去找这些接口函数而已。

比如,在David Flangan的Javascript: The Definitive Guide 3rd Ed.这本书里,可以找到很好的cookie应用类。你也可以在Oreilly的WEB站点上找到这本书里的例子。本文最后的链接列表里,有一些访问这些 cookie示例的直接链接。

Cookies 怪兽

因为某些原因Cookies 的名声很不好。许多人利用cookies做一些卑鄙的事情,比如流量分析、点击跟踪。Cookies 也不是非常安全,特别是没有secure属性的cookies。不过,即使你用了安全的cookies,如果你和别人共用计算机,比如在网吧,那么别人就可以窥探计算机硬盘上未加密保存的cookie文件,也就有可能窃取你的敏感信息。所以,如果你是一个WEB开发人员,那么你要认真考虑这些问题。不要滥用cookies。不要把用户可能认为是敏感的数据保存在cookies里。如果把用户的社会保险号、信用卡号等保存在cookie里,等于把这些敏感信息放在窗户纸下,无异于把用户投到极大危险之中。一个好的原则是,如果你不想陌生人了解你的这些信息,那就不要把它们保存在cookies里。

另外,cookies还有一些实际的限制。Cookies保留在计算机上,不跟着用户走。如果用户想换计算机,那么新计算机无法得到原来的cookie。甚至用户在同一台计算机上使用不同浏览器,也得不到原来的cookie:Netscape 不能读取Internet Explorer 的cookies。

还有,用户也不愿意接受cookies。所以不要以为所有的浏览器都能接受你发出的cookies。如果浏览器不接受cookies,你要保证自己的WEB站点不致因此而崩溃或中断。

另外WEB 浏览器能保留的cookies不一定能超过300个。也没有标准规定浏览器什么时候、怎么样作废cookies。所以达到限制时,浏览器能够有效地随机删除cookies。浏览器保留的来自一个WEB服务器上的cookies,不超过20个,每个cookie的数据(包括名称和值),不超过4K字节。(不过,本文里的cookie尺寸没问题,它只占了12 K字节,保存在3个3 cookies里。)

简而言之,注意保持cookie简单。不要依赖cookies的存在,不要在每个cookie里保存太多信息。不要保存太多的cookes。但是,抛除这些限制,在技巧高超的WEB管理员手里,cookie的概念是一个有用的工具。
分享到:
评论

相关推荐

    struts2用cookie实现自动登录中用过滤器执行读取上下文方法

    这个过程涉及到几个关键步骤,包括登录处理、Cookie的创建与设置、过滤器的配置以及在请求处理之前读取Cookie中的信息来恢复上下文。 首先,当用户成功登录后,服务器端会创建一个包含用户身份信息的Cookie。这个...

    struts2与cookie实现自动登录

    自动登录的核心思想是:当用户首次登录成功后,将认证信息(如加密后的用户名和密码或一个唯一标识Token)存储在Cookie中,然后在用户下次访问时通过检查这个Cookie来实现自动登录。以下是实现这一功能的具体步骤: ...

    搞定J2EE:STRUTS+SPRING+HIBERNATE整合详解与典型案例 (1)

    6.3.6 在代码中使用Log4j 6.4 改进Log4j 6.5 小结 第七章 Ant使用指南 7.1 Ant介绍 7.1.1 Ant简介 7.1.2 为什么要使用Ant 7.2 建立Ant的开发环境 7.2.1 下载Ant 7.2.2 配置Ant 7.3 Ant的使用方法 7.3.1 Ant能完成的...

    struts2 Https 配置

    这可以通过在`struts.xml`配置文件中使用`&lt;constant&gt;`标签设置`struts.action.excludePattern`属性来实现。 ```xml &lt;constant name="struts.action.excludePattern" value="^http://.*"/&gt; ``` 3. **过滤器配置*...

    Struts2+cookie实现的购物车

    Struts2+cookie实现的购物车

    struts2.0中文教程

    05 转换器(Converter)——Struts 2.0中的魔术师 06 在Struts 2.0中实现表单数据校验(Validation) 07 Struts 2的基石——拦截器(Interceptor) 08 在Struts 2中实现IoC 09 在Struts 2中实现文件上传 10 在Struts...

    通过xml配置搞定Struts重复提交问题

    Struts框架是Java Web开发中常用的MVC框架之一,它为开发者提供了强大的控制层解决方案。然而,Struts框架在处理HTTP请求时,如果没有适当的防护措施,可能会遇到重复提交的问题,这可能导致数据不一致或者服务器...

    STRUTS中文文档

    STRUTS中文文档,内容比较丰富 struts安装 Struts原理、开发及项目实施 Struts中的应用 Struts中的翻页实例 strtus整体架构及核心标签库的介 struts框架详细介绍 Struts的体系结构

    struts标签 struts标签 struts标签

    Struts标签是Apache Jakarta Struts框架中的一部分,用于简化Java Web应用程序开发中的视图层构建。Struts标签库提供了一组预定义的JSP标签,这些标签有助于开发者更有效地处理常见的Web开发任务,如表单处理、数据...

    Struts2.0视频教程+struts2.0中文教程

    Struts2.0是Java Web开发中的一个强大框架,它基于Model-View-Controller(MVC)设计模式,为开发者提供了构建可维护性高、结构清晰的Web应用程序的工具。这个"Struts2.0视频教程+struts2.0中文教程"包含的资源旨在...

    Struts中文手册

    ### Struts框架中文手册知识点概览 #### 一、Struts框架概述 - **Struts框架**:一种基于Java的Web应用框架,采用MVC(Model-...无论是初学者还是有经验的开发者,都可以从Struts框架中受益,提高开发效率和代码质量。

    在Eclipse中配置Struts2项目(html)手把手教会你 +struts2 标签库介绍(html) + STRUTS2学习文档.pdf + Struts2―表单验证validate(html) + struts2和struts的比较 + struts教程(html)

    在Eclipse中配置Struts2项目(html)手把手教会你 如何在Eclipse中配置Struts2。 struts2 标签库介绍(html)对Struts2的标签做了详细的介绍让你轻松掌握Struts2的标签。 STRUTS2学习文档.pdf 对Struts2的一些配置...

    struts1标签库详解

    * bean:struts:将一个 Struts 的 acción 绑定到 page 作用域中,以便其它标签可以使用该值。 * bean:write:将一个 bean 的值写到页面上。 HTML Tags HTML Tags 是 Struts 中的 HTML 标签库,包含的标签可以用来...

    Struts升级到Struts2.3.35

    北京时间8月22日13时,Apache官方发布通告公布了Struts2中一个远程代码执行漏洞(cve-2018-11776)。该漏洞可能在两种情况下被触发,第一,当没有为底层xml配置中定义的结果设置namespace 值,并且其上层动作集配置...

    struts2.0整合Struts 1

    在《Struts 2权威指南--基于WebWork核心的MVC开发》这本书中,作者李纲深入浅出地介绍了Struts 2的核心概念和实践技巧。这本书不仅适合初学者,也对有Struts 1背景的开发者提供了宝贵的指导。书中通过实例演示了如何...

    struts中常见错误的解决方法

    本文档中详细的描述了struts中常见的几种错误,以及解决这些错误的方法

    如何解决struts2中烦人乱码

    在struts2中解决页面中出现的乱码问题,写在web.xml中

    SSO单点登入,使用cookie实习(Struts2)

    2. **Cookie管理**:在用户成功登录后,我们在服务器端生成一个唯一的Session ID,并将其存储在Cookie中。这个Cookie将在用户每次访问系统时发送到服务器,以便识别用户的身份。 3. **Ticket验证**:当用户尝试访问...

    留言板留言板struts2留言板struts2

    下面将详细介绍Struts2框架以及在该项目中可能涉及的关键知识点。 1. **Struts2框架概述**:Struts2是Apache软件基金会下的开源项目,它继承了Struts1的优点,并融合了WebWork框架的许多特性。Struts2的主要目标是...

    Struts2-API+Struts2中文帮助文档

    文档中还会讲解如何使用Struts2的异常处理机制,以及如何调试和解决常见的运行时问题。 总的来说,这个压缩包对于想深入理解并熟练掌握Struts2框架的开发者来说是宝贵的资源。通过API文档可以了解框架的底层机制,...

Global site tag (gtag.js) - Google Analytics