session的使用原则

来源:互联网 发布:java if hour 2 编辑:程序博客网 时间:2024/05/10 08:39
在什么时候传递session?

    Session 的作用相当大,它的最主要作用就是可以针对某一个用户的特殊的连接,建立一个私人的变量,并且这个变量可以在不同的页面之间进行传递。除非用户在20分钟(或由用服务器设定的时间)内没有点击任何页面,否则这个变量会一直保留下去。这是一个很有用的功能,同时也是一个很占用服务器资源的功能。
    很有用体现在:1)它可以自动的进行页面间的参数传递。不需要表单传递、不需要超链接传递,只需要在后台传递。2)而且设了一次session之后,就可以在每一个页面使用,非常方便。
    很麻烦体现在:1)如果网站很大,一不小心设了两个同名的session,就会造成错误,尤其是象session(“id”)这类变量,很容易出错。2)session会占用系统资源,而且在20分钟内没有连接的情况下才会自动消失。所以一旦大量使用,将会对系统造成严重影响。

如何使用session?
    1)对于会员登陆如何使用session?
    在会员登陆中,一定需要用到session来判断这个会员的状态:未登陆还是已经登陆?虽然我们可以在数据库中设置一个字段,用来存储是否登陆的信息,然后在登陆的每一个界面中读取数据库,从而分别针对已登陆和未登陆两种情况做出判断,进行不同得显示。但这种方法效率太低,要经常调用数据库,耗用大量资源,不建议采用。
使用session就不同了。只要会员一经登陆,就设立一个session变量,记录这个用户的id号,即:session(“id”)。在其他页面中通过对session(“id”)是否为空进行判断,从而决定用户是否登陆。
    但这种方法需要注意一个问题,那就是:session变量用得越少越好。用很多session当然会很方便,但同时占用系统资源。我建议,只设置session(“user_id”),如果有权限的要求,最好加上一个session(“user_auth”)。其他不用设置。有的人喜欢设置 session(“password”),这并不是一个很好的习惯。为什么?因为,一般的会员系统,都会允许会员对密码进行修改,如果会员改了密码,那么session(“password”)中的密码就会存在问题。而且对于密码这些敏感性的数据,最好放在数据库中最安全。

    2)对于购物车的商品如何使用session?
    购物车的特点,就是需要可以增加、修改、删除购物车中的商品。所以最好的方法就是,利用数据库进行操作。似乎在这里只需要数据库就可以了,不需要session来帮忙了?
说得好!我们只需要利用数据库就可以了!!不需要使用session了。但需要注意一个问题:一个用户登陆进入之后,他可以连续进行两次购买,生成两次订单。而每次订单都可以购买数种商品。而在两次购物的过程中,这个用户的session(“id”)是一直存在的。如何区分两次购物呢?
    这需要我们在数据库设计中加以考虑:要设计两张表,一张表是 order_list,其中的id号代表订单号,纪录了订单号和订货人id。另一张表是order_item,其中的id号代表订单中的货物号,记录了货物号和相关订单号。

    3)对于权限分级登陆中如何使用session?
    权限分级中涉及一个问题,如何在每个页面中判断出这个用户是否拥有这项权限?如何针对不同的权限,进行不同的显示?而且这一切都是很有效率的?举个例子,如果在每个页面中都采用调用数据库的方法判断权限,就会造成消耗系统资源的问题。
我自己比较推荐的方法,是写一个check_auth.asp的小程序(本身是一个子程序),在每一个需要验证权限的页面中插入这个子程序。子程序的写法如下:

sub check_auth(session_str,arg1)
statement;
end sub

    这个子程序实现的功能是什么呢?
    1、读入session_str的值。session_str是一个存储权限字符串的session。举一个例子:如果阿猫的权限是:留言版只读(1),CEO在线读写(3),我的部门读写改(7),投诉信箱读写改删(15)。那么session_str=session(auth_str)=”1,3,7,15”
    2、将session_str的值根据arg1参数进行分解提取,获得权限具体的值。比如我需要知道在CEO在线中的权限。只需调用:check_auth(session(auth_str),”CEO”)即可。

    程序具体的写法参见具体的程序模块。

    4)管理员界面中如何使用session?
    管理员界面中使用session的方式和会员登陆的情况一样。同样只需要将id和权限字符串设成session。

    5)session和安全设置
    当一个用户建立了第一个session,他不仅仅将一个变量存储到了不同的页面中,更重要的是:他建立了一个“会话”。会话的作用非常大,他是一个连接用户和服务器的通道。在这条通道中,不仅存在着一个session指定的变量,还有其他的一些属性,比如:session.id,session.id是一个标记session唯一性的id号,它是一个很长的数字,基本上没有重复的可能。
但如果某个黑客可以伪造session.id,他就可以伪造成某一个登陆的用户,从而进行非法活动。或是,一个用户登陆进入后,利用id号的改变,对平级的其他用户进行越权访问,为了防止这种情况,需要注意:登陆者的id号永远不要作为传递的参数,否则会造成安全问题。唯一可以使用的方法是使用session,共享变量,而不是传递变量。因为任何变量在页面的传递中都会有可能被改动!!!

    6)session和分页显示
    分页显示涉及很多传递参数的问题。比如传递page_id,传递升序还是降序,传递排序的依据等等问题。以前很喜欢用session,但现在不推荐使用,因为会占用大量的内存,而且在页面非正常切换的时候会出错!!还是使用普通的表单传递的方式比较好!
(作者email: guangzhou@chancestudio.com)

文章地址:http://www.szchance.com/gb/coretech/article_show.asp?ID=17
 
原创粉丝点击