JSP页面之间传值的4种方法总结
程序员文章站
2022-07-05 23:28:57
b/s页面间通信
http是无状态的协议。web页面本身无法向下一个页面传递信息,如果需要让下一个页面得知该页面中的值,除非通过服务器。因此,web页面保持状态并传递给其它页面,是一个重要的技术。...
b/s页面间通信
http是无状态的协议。web页面本身无法向下一个页面传递信息,如果需要让下一个页面得知该页面中的值,除非通过服务器。因此,web页面保持状态并传递给其它页面,是一个重要的技术。
web页面之间传递数据,是web程序的重要功能
在http协议中一共有4种方法来完成这件事情:
1)url传值; 2)表单传值; 该数的平方为:<%=number*number %> <hr> <a href="get_index.?number=<%=number %>">到达get_index</a> </body> </html>
2. get_index.jsp页面
<%@ page language="java" import="java.util.*" pageencoding="utf-8"%> <!doctype html public "-//w3c//dtd html 4.01 transitional//en"> <html> <head> <title>my jsp 'get_index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> </head> <body> <% //获得number string str=request.getparameter("number"); int number=integer.parseint(str); %> 该数字的立方为:<%=number*number*number %> <hr> </body> </html>
页面显示结果:
优点: 简单性和平台支持的多样性(没有不支持url)。 缺点: 1)传输的数据只能是字符串,对数据类型具有一定的限制; 2)传输数据的值会在浏览器地址栏里面被看到,从保密的角度讲,这是不安全的。特别是秘密性要求比较严格的数据,比如说密码。
二、表单传值
方法一中通过url传的值会被看到,为了避免这个问题,我们可以使用表单将页面1中的变量传给页面2。
1. index.jsp:
<%@ page language="java" import="java.util.*" pageencoding="utf-8"%> <!doctype html public "-//w3c//dtd html 4.01 transitional//en"> <html> <head> <title>my jsp 'index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> </head> <body> <% string str="10"; int number=integer.parseint(str); %> 该数的平方为:<%=number*number %> <hr> <form action="get_index.jsp" method="post"> <input type="text" name="number" value="<%=number %>"> <input type="submit" value="到达get_index"> </form> </body> </html>
2. get_index.jsp:
<%@ page language="java" import="java.util.*" pageencoding="utf-8"%> <!doctype html public "-//w3c//dtd html 4.01 transitional//en"> <html> <head> <title>my jsp 'get_index.jsp' starting page</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> </head> <body> <% //获得number string str=request.getparameter("number"); int number=integer.parseint(str); %> 该数字的立方为:<%=number*number*number %> <hr> </body> </html>
页面显示结果:
该方法顺利的进行了值传递,并且无法看到传递的信息,在文本框中如果想要隐藏,将type=“text”改为type=“hidden”即可实现隐藏。 该方法的问题: 1)和url方法类似,该方法传输的数据,也只能是字符串,对数据类型具有一定的限制; 2)传输数据的值虽然可以保证在浏览器地址栏里不被看到,但是在客户端源代码里面也会被看到,从保密的角度讲,这是不安全的。对于是秘密性要求比较严格的数据,比如说密码来说还是不建议用表单来进行传输。
三、cookie方法
为了解决以上问题,在页面之间进行数据传递的过程中,cookie是一种常见的方法。cookie是一个小的文本数据,由服务器端生成,发送给客户端浏览器,客户端浏览器如果设置为启用 cookie,则会将这个小文本数据保存到其目录下的文本文件内。
客户端下次登录同一网站,浏览器则会自动将 cookie 读入之后,传给服务器端。服务器端可以对该 cookie 进行读取并验证(当然也可以不读取)。
一般情况下,cookie 中的值是以key-value的形式进行表达的。基于这个原理,上面的例子可以用 cookie来进行。即:在第一个页面中,将要共享的变量值保存在客户端 cookie 文件内,在客户端访问第二个页面时,由于浏览器自动将 cookie读入之后,传给服务器端,因此只需要第二个页面中,由服务器端页面读取这个 cookie 值即可。
1. cookie.jsp:
<%@ page language="java" import="java.util.*" pageencoding="utf-8"%> <!doctype html public "-//w3c//dtd html 4.01 transitional//en"> <html> <head> <title>cookie</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> </head> <body> <h3>登陆成功</h3> <h3>欢迎访问鲁东大学信息与电气工程学院</h3> <% string uri = request.getrequesturi();//返回请求行中的资源名称 string url = request.getrequesturl().tostring();//获得客户端发送请求的完整url string ip = request.getremoteaddr();//返回发出请求的ip地址 string params = request.getquerystring();//返回请求行中的参数部分 string host=request.getremotehost();//返回发出请求的客户机的主机名 int port =request.getremoteport();//返回发出请求的客户机的端口号。 %> <% cookie c=new cookie("get_ip",ip); c.setmaxage(600); response.addcookie(c); %> </body> </html>
2. get_cookie.jsp:
<%@ page language="java" import="java.util.*" pageencoding="utf-8"%> <!doctype html public "-//w3c//dtd html 4.01 transitional//en"> <html> <head> <title>get_cookie</title> <meta http-equiv="pragma" content="no-cache"> <meta http-equiv="cache-control" content="no-cache"> <meta http-equiv="expires" content="0"> <meta http-equiv="keywords" content="keyword1,keyword2,keyword3"> <meta http-equiv="description" content="this is my page"> </head> <body> <h3>从cookie.jsp页面中获取的信息</h3> <% string ip=null; cookie[] cookies=request.getcookies(); for(int i=0;i<cookies.length;i++) { if(cookies[i].getname().equals("get_ip")) { ip=cookies[i].getvalue(); break; } } %> ip:<%=ip %> </body> </html>
显示结果:
1.该方法总结: 在客户端的浏览器上,我们看不到任何的和传递的值相关的信息,说明在客户端浏览器中,cookie 中的数据是安全的。
但是就此也不能说 cookie 是完全安全的。因为 cookie 是以文件形式保存在客户端的,客户端存储的 cookie 文件就可能敌方获知。如果将用户名、密码等敏感信息保存在cookie内,在用户离开客户机时不注意清空,这些信息容易泄露,因此cookie在保存敏感信息方面具有潜在危险。可以很清楚地看到。
cookie的危险性来源于cookie的被盗取。目前盗取的方法有多种:
a)利用跨站脚本技术(有关跨站脚本技术,后面的篇幅将会有介绍),将信息发给目标服务器;为了隐藏跨站脚本的 url,甚至可以结合 ajax(异步javas
cript 和 xml技术)在后台窃取 cookie;
b)通过某些软件,窃取硬盘下的 cookie。如前所述,当用户访问完某站点后,cookie文件会存在机器的某个文件夹(如 c:\documents and settings\用户名\cookies)下,因此可以通过某些盗取和分析软件来盗取 cookie。
具体步骤如下:
(1)利用盗取软件分析中的 cookie,列出用户访问过的网站;
(2)在这些网站中寻找攻击者感兴趣的网站;
(3)从该网站的 cookie 中获取相应的信息。不同的软件有不同的实现方法,有兴趣的读者可以在网上搜索相应的软件;
c)利用客户端脚本盗取 cookie。在 javascript 中有很多 api 可以读取客户端 cookie,可以将这些代码隐藏在一个程序(如画图片)中,很
隐秘地得到 cookie 的值,不过,这也是跨站脚本的一种实现方式。
以上的问题并不能代表cookie就没有任何用处,cookie在web中应用的几个方面:
a)cookie 的值能够持久化,即使客户端机器关闭,下次打开还是可以得到里面的值。因此 cookie 可以用来减轻用户一些验证工作的输入负担,比如用
户名和密码的输入,就可以在第一次登录成功之后,将用户名和密码保存在客户端 cookie,下次不用输入。当然,这不安全,但是,对于一些安全要求不高的网站,cookie 还是大有用武之地。
b)cookie可以帮助服务器端保存多个状态信息,但是不用服务器端专门分配存储资源,减轻了服务器端的负担。比如网上商店中的购物车,必须将物品和
具体客户名称绑定,但是放在服务器端又需要占据大量资源的情况下,可以用 cookie 来实现,将每个物品和客户的内容作为 cookie 来保存在客户端。
c)cookie可以持久保持一些和客户相关的信息。如很多网站上,客户可以自主设计自己的个性化主页,其作用是避免用户每次都需要自己去找自己喜爱的内容,设计好之后,下次打开该网址,主页上显示的是客户设置好的界面。这些设置信息保存在服务器端的话,消耗服务器端的资源,因此,可以将客户的个性化设计保存在 cookie 内,每一次访问该主页,客户端将 cookie 发送给服务器端,服务器根据 cookie 的值来决定显示给客户端什么样的界面。
2.解决cookie安全的方法有很多,常见的有以下几种:
a)替代cookie。将数据保存在服务器端,可选的是session方案;
b)及时删除cookie。要删除一个已经存在的cookie,有以下几种方法:
b_1:给一个cookie赋以空置;
b_2:设置 cookie 的失效时间为当前时间,让该 cookie 在当前页面的浏览完之后就被删除了;通过浏览器删除cookie。如在ie中,可以选择“工具”——“internet选项”——常规”,在里面点击“删除cookies”,就可以删除文件夹中的cookie。