JSP之间传值

本文详细介绍了JSP中四种页面间数据传递方法:URL传值、表单传值、Cookie方法和Session方法,分析了各自优缺点及应用场景,并探讨了session的安全因素与防范措施。
摘要由CSDN通过智能技术生成

在HTTP协议中一共有4种方法来完成这件事情:

  1. URL传值
  2. 表单传值
  3. Cookie方法
  4. Session方法

1.URL传值

product.jsp->addClassification.jsp

product.jsp:

layer.open({
    type: 2,
    title: '创建产品分类',
    maxmin: true,
    shadeClose: true, //点击遮罩关闭层
    area : ['458px' , '158px'],
    content: 'addClassification.jsp?classificationFather='+classificationFather
    //url传值,将参数放在url中
});

addClassification.jsp:

接收参数:
<%
    String classificationFatherName1 = request.getParameter("classificationFather");
    int classificationFather = Integer.parseInt(classificationFatherName1);
    System.out.println("JSP_int_classificationFather:"+classificationFather);
%>

使用参数:
<input type="hidden" name="classificationFather" class="layui-input" value=<%=classificationFather%>>

优点:

简单性和平台支持的多样性(没有浏览器不支持URL)。

缺点:

  • 传输的数据只能是字符串,对数据类型具有一定的限制;
  • 传输数据的值会在浏览器地址栏里面被看到,从保密的角度讲,这是不安全的。特别是秘密性要求比较严格的数据,比如说密码。

2.表单传值

方法一中通过URL传的值会被看到,为了避免这个问题,我们可以使用表单将页面1中的变量传给页面2。

index.jsp->get_index.jsp

index.jsp:

<%  
    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>   

get_index.jsp:

<%  
//获得number  
   String str=request.getParameter("number");  
   int number=Integer.parseInt(str);  
%>  
该数字的立方为:<%=number*number*number %> <hr>  

该方法的问题:

  • 和URL方法类似,该方法传输的数据,也只能是字符串,对数据类型具有一定的限制。
  • 传输数据的值虽然可以保证在浏览器地址栏里不被看到,但是在客户端源代码里面也会被看到,从保密的角度讲,这是不安全的。对于是秘密性要求比较严格的数据,比如说密码来说还是不建议用表单来进行传输。

3.Cookie方法

为了解决以上问题,在页面之间进行数据传递的过程中,Cookie是一种常见的方法。

Cookie是一个小的文本数据,由服务器端生成,发送给客户端浏览器,客户端浏览器如果设置为启用 cookie,则会将这个小文本数据保存到其目录下的文本文件内。

客户端下次登录同一网站,浏览器则会自动将 Cookie 读入之后,传给服务器端。服务器端可以对该 Cookie 进行读取并验证(当然也可以不读取)。

一般情况下,Cookie 中的值是以key-value的形式进行表达的。基于这个原理,上面的例子可以用 Cookie来进行。即:在第一个页面中,将要共享的变量值保存在客户端 Cookie 文件内,在客户端访问第二个页面时,由于浏览器自动将 Cookie读入之后,传给服务器端,因此只需要第二个页面中,由服务器端页面读取这个 Cookie 值即可。

cookie.jsp:

<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);  
     %>  

get_cookie.jsp:

<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 %> 

4.Session方法

与前三种方法的区别:

前几种方法在传递数据时,有一个共同的问题就是内容保存在客户端里。因此,具有泄露的危险性。如果在不考虑服务器负载的情况下,将数据保存在服务端里,是一个比较好的方法,这就是session方法。

通过session.setAttribute("num",str);将str存到session中。

通过session.getAttribute("num");从session中获取num。

服务器怎么知道要分配给它的是同一个 session 对象呢?

实际上,在客户进行第一次访问时,服务器端就给 session 分配了一个 sessionId,并且让客户端记住了这个 sessionId,客户端访问下一个页面时,又将 sessionId 传送给服务器端,服务器端根据这个 sessionId 来找到前一个页面用的 session,由此保证为同一个客户服务的 session 对象是同一个。

session 分配的具体过程为:

1)客户端访问服务器,服务器使用 session,首先检查这个客户端的请求里是否已包含了 sessionId;

2)如果有,服务器就在内存中检索相应 Id 的 session 来用;

3)否则服务器为该客户端创建一个 session 并且生成一个相应的 sessionId,并且在该次响应中返回给客户端保存。

具体的应用:

session 经常用于保存用户登录状态。比如用户登录成功之后要访问好几个页面,但是每个页面都需要知道是哪个用户在登录,此时就可以将用户的用户名保存在 session 内。

login.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>  
欢迎登录邮箱  
<form action="login.jsp" method="post">  
    请您输入账号:<input name="account" type="text"><BR>  
    请您输入密码:<input name="password" type="password"><BR>  
    <input type="submit" value="登录">  
</form>  
<%  
    //获取账号密码  
    String account = request.getParameter("account");  
    String password = request.getParameter("password");  
    if(account!=null)  
    {  
        //验证账号密码,假如账号密码相同表示登录成功  
        if(account.equals(password))  
        {  
            //放入 session,跳转到下一个页面  
            session.setAttribute("account",account);  
            response.sendRedirect("loginResult.jsp");  
        }  
        else  
        {  
            out.println("登录不成功");  
        }  
    }  
%> 

loginResult.jsp:

<%@ page language="java" import="java.util.*" pageEncoding="utf-8"%>  
<%  
    if(session.getAttribute("account")==null)  
    {  
        response.sendRedirect("login.jsp");  
    }  
%>  
欢迎<%=session.getAttribute("account") %>来到邮箱!

提示:在大项目中有许多页面可能会用到session检查。针对这个问题,可以用两种方法解决。

1)将session代码检查写成一个文件。

2)利用过滤器

session 的不安全因素

session 机制最大的不安全因素是 sessionId 可以被攻击者截获,如果攻击者通过一些手段知道了 sessionId,由于 sessionId 是客户端寻找服务器端 session 对象的唯一标识,攻击者就有可能根据 sesionId 来访问服务器端的 session 对象,得知 session 中的内容,从而实施攻击。

在 session 机制中,很多人认为:只要浏览器关闭,会话结束,session 就消失了。其实不然,浏览器关闭,会话结束,对于客户端来说,已经无法直接再访问原来的那个 session,但并不代表 session 在服务器端会马上消失。除非程序通知服务器删除一个 session,否则服务器会一直保留这个 session 对象,直到 session 超时失效,被垃圾收集机制收集掉。但是令人遗憾的是,客户在关闭浏览器时,一般不会通知服务器。由于关闭浏览器不会导致 session 被删除,因此,客户端关闭之后,session 还未失效的情况下,就给了攻击者以机会来获取 session 中的内容。

虽然 sessionId 是随机的长字符串,通常比较难被猜测到,这在某种程度上可以加强其安全性,但是一旦被攻击者获得,就可以进行一些攻击活动,如:攻击者获取客户 sessionId,然后攻击者自行伪造一个相同的 sessionId,访问服务器,实际上等价于伪装成该用户进行操作。

防止以上因为 sessionId 泄露而造成的安全问题

1)在服务器端,可以在客户端登陆系统时,尽量不要使用单一的 sessionId 对用户登陆进行验证。可以通过一定的手段,不时地变更用户的 sessionId;

2)在客户端,应该在浏览器关闭时删除服务器端的 session,也就是说在关闭时必须通知服务器端。最简单的方法,可以用 Javascript 实现。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值