• Java的登陆验证问题


    java中的登陆验证问题可以有多种方式进行验证,通过拦截器功能完成,可以通过过滤器功能完成,也可以简单的代码在JSP页面中单独完成,其中都 涉及到一个关键的验证步骤,这个验证原理ASP,PHP,JAVA等语言都大致相同,但具体到不同语言实现时有些差别;同时验证还涉及另外一个独立的问题 是验证到什么程度的问题,下面我就以我的认识讲解一下;

    一,验证原理

    下面看看JAVA中的验证关键步骤,一般我们用session变量来保存用户成功登录后的密码,为了防止用户把URL复制下来然后直接在浏览器地址 栏中输入试图登录,即非登录访问,这个时候我们首先需要进行验证工作,主要是检测保存密码 session 是否存在,或者其是否等于预先设定的密码;session 变量时保存在服务器端,可以在前后有关联的跨页面间存在,在 session 不超时的情况下,可通过判断服务器端该变量是否存在来判断是否已经登录,存在则已经登录,不存在则没有登录;

    这里先了解一个辅助问题:null 和空值的问题,这不同语言处理不完全相同;

    (1)Java中,null我这里的指的是没有定义的,即根本就不存在,没有分配内存空间的情况,只是预先知道其数据类型,如 String a=null;

    (2)而空值则是有数据类型的,实际存在的,分配了内存空间的,只不过内容为空而已,如:String a="";

    那Java中如果用户没有成功登陆,那在服务器端指定名称的session变量是不存在的,所以这个时候指定名称的session变量需要跟null比较来进行判断是否已经登录了,

    1. //推荐的验证方式  
    2. Object pwd=session.getAttribute("loginUserPwd");  
    3. if(pwd == null){   
    4.     out.print("你还没有登录");  
    5.     //...other code...  
    6. }else{  
    7.     out.print("你已经登录了");  
    8.     //...other code...  
    9. }  


    能不能跟字符型的空值进行比较判断是否已经登录了呢?不能, 为什么呢?原因是java中当试图查找一个不存在的session变量,返回的null,即不存在,没定义,没有分配内存的,(java中)当强制转换为 String型时,不存在的null变成实际存在的String类型且内容为null的结果,也就不等于String类型的空值,如果设计不为空判定为已 经登录,那因为这个原因,就出现没有登录的也可以访问了,显然不是我们想要的;

    1. //通过空值判断是否已经登录,错误方式  
    2. String pwd=(String)session.getAttribute("loginUserPwd");   
    3. //注意:通过java的String类型强制转换后,不存在的null变成了实际存在String类型的null,  
    4. //即未登陆的也通过验证了,误也  
    5. if(pwd != ""){    
    6.     out.print("你已经登录了");   
    7.     //...other code...  
    8. }else{  
    9.     out.print("你还没有登录");  
    10.     //...other code...  
    11. }  


    那能不能跟字符型的null来进行比较判断是否已经登录了呢?可以,但过程变得麻烦,不推荐使用;
    通过空值方式比较是否登录我们知道,不存在的 session 变量通过String强制转换后变成实际存在的字符型的 null ,那我们可以设计等于字符型的null的判定为未登录,但会出现一个情况就是用户的密码正好为字符型的null时反而不能通过验证了,当然可以做其它的处 理来解决这个问题,但逻辑和代码变复杂了,我不希望这样,简单比较方便;

    1. //通过是否等于字符型的null值来判断是否已经登录,不推荐使用  
    2. String pwd=(String)session.getAttribute("loginUserPwd");   
    3. //注意:通过java的String类型强制转换后,不存在的null变成了实际存在String类型的null,  
    4. //对于密码正好是字符型的null出现验证不通过的情况,需要做其它处理  
    5. if(pwd == "null"){   
    6.     out.print("你还没有登录");   
    7.     //...other code...  
    8. }else{  
    9.     out.print("你已经登录了");  
    10.     //...other code...  
    11. }  

    二,验证的细度

    上面的验证方式,只能判断是否已经登录了,但是很多的站点,是允许多用户的情况,各个不同用户只能对各自自己的资源进行管理,所以进行资源管理时, 首先要登录,登录了还需要进一步区别验证是否是自己本人,即不能出现在同一个站点中,自己登录了,同时可以修改另一个用户的资料的情况;

    通过上面我们知道通过判断服务器端session变量的是否存在可以判定是否登录,但这个对一个站点来说,这仅能判断是否已经登录到了本站点,在多用户用 户的情况下,如果一个用户登录后,使用适当的URL即可访问另一个用户的资料,这个是不希望出现(可能管理员除外),所以这个时候,验证不能是判断否为 空,而是通过session变量是否等于用户本身设置的某个密码,来判断是否是自己本人登录,这就使登录验证细到用户级别,同一个站点的多个用户各自只能 管理自己的资料;

    1. //判断是否已经登录,并且是否是自己本人登录  
    2. Object pwd=session.getAttribute("loginUserPwd");  
    3. String clientPWD = (String)session.getAttribute("loginUserPwd"); //数据来源客户端用户的输入  
    4. String serverPWD = "XXX";  //这个密码来源于服务器端某个文件或DB中,是用户自己事先设置好的  
    5. if(pwd == null || clientPWD != serverPWD ){   
    6.     out.print("你还没有登录,或不是自己本人登录");  
    7.     //...other code...  
    8. }else{  
    9.     out.print("你已经登录了,并且是自己登录");  
    10.     //...other code...  
    11. }  


    可能还有其他的方式来验证,如果有其它的方式,给我留言一下,我参考参考...

    注:转载 http://blog.csdn.net/shenzhennba/article/details/8100853


  • 相关阅读:
    apache的源代码编译安装
    python学习笔记(五) 200行实现2048小游戏
    python学习笔记(四) 思考和准备
    python学习笔记(三)高级特性
    python自学笔记(二)
    python自学笔记(一)
    redis 配置和使用(C++)
    汇编基础最后一篇--机器语言指令
    汇编语言学习笔记(六)
    网络编程学习方法和图书推荐
  • 原文地址:https://www.cnblogs.com/wcyBlog/p/3820403.html
Copyright © 2020-2023  润新知