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

Java的登陆验证问题的更多相关文章

  1. 【Java EE 学习 70 上】【数据采集系统第二天】【数据加密处理】【登陆验证】【登陆拦截器】【新建调查】【查询调查】

    一.数据加密处理 这里使用MD5加密处理,使用java中自带加密工具类MessageDigest. 该类有一个方法digest,该方法输入参数是一个字符串返回值是一个长度为16的字节数组.最关键的是需 ...

  2. 【Java EE 学习 20】【使用过滤器实现登陆验证、权限认证】【观察者模式和监听器(使用监听器实现统计在线IP、登录IP 、踢人功能)】

    一.使用过滤器实现登录验证.权限认证 1.创建5张表 /*使用过滤器实现权限过滤功能*/ /**创建数据库*/ DROP DATABASE day20; CREATE DATABASE day20; ...

  3. 使用JDBC工具类模拟登陆验证-Java(新手)

    模拟登陆验证: package JdbcDome; import java.sql.Connection; import java.sql.PreparedStatement; import java ...

  4. JDBC工具类实现登陆验证-Java(新手)

    JDBC工具类: package cn.chuang.JdbcDome; import java.sql.*; public class JdbcUtilss { private static fin ...

  5. springaop实现登陆验证

    1.首先配置好springmvc和springaop 2.先写好登陆方法,通过注解写代理方法 通过代理获得登陆方法的参数方法名,然后再aop代理方法内进行登陆验证 贴出代码 package com.h ...

  6. Java模拟登陆02【转载】

    在使用java访问URL时,如果该URL需要身份验证,那么就不能够直接访问,因为没有登陆.那么,如何解决这个问题呢?     方法是使用java模拟登陆,登陆后记录下cookie信息,在下次发起请求时 ...

  7. Shrio登陆验证实例详细解读(转)

    摘要:本文采用了Spring+SpringMVC+Mybatis+Shiro+Msql来写了一个登陆验证的实例,下面来看看过程吧!整个工程基于Mavevn来创建,运行环境为JDK1.6+WIN7+to ...

  8. 18.Shiro与Springboot整合下登陆验证UserService未注入的问题

    Shiro与Springboot整合下登陆验证UserService未注入的问题 前言: 刚开始整合的情况下,UserService一执行,就会报空指针异常. 看了网上各位大神的讲解,什么不能用ser ...

  9. ASP.NET MVC 自己实现登陆验证过滤器

    1.首先添加一个过滤器类,并实现接口中对应的方法 public class YLFAuthorizeAttribute : FilterAttribute, IAuthorizationFilter ...

随机推荐

  1. winform:无法引用其他类库,dll,using等个人看法【图】

    在项目类库中已经引用了相关了类库,生成解决方案也没问题,但是到了后置代码,通过using引用其他类库的时候,再生成解决方案或者生成单个类库,就会报“未能找到类型或命名空间“xxx"(是否缺少 ...

  2. 分享:Perl打开与读取文件的方法

    在Perl中可以用open或者sysopen函数来打开文件进行操作,这两个函数都需要通过一个文件句柄(即文件指针)来对文件进行读写定位等操作. Perl打开与读取文件的方法,供大家学习参考.本文转自: ...

  3. smarty安装及例子

    环境: smarty3.1.16 1.在http://www.smarty.net/download下载最新smarty包,window选择zips,linux下选择tar.gz.以windows为例 ...

  4. NavigationBar的简单设置

    http://blog.csdn.net/hufeng825/article/details/7643532#) .Label属性设置 titleLabel = [[UILabel alloc] in ...

  5. unpipc.h&unpipc.c

    unpipc.h #ifndef _UNPIPC_H #define _UNPIPC_H #include <stdio.h> #include <unistd.h> #inc ...

  6. Eclipse中使用javap运行配置详解

    javap是sun提供的对class文件进行反编译的工具 1.配置Run---external tools---external tools configurations 选择Program 新建ja ...

  7. ios自定义选择器ActionSheetPicker改进版

    ios自带的UIDataPicker和UIDatePicker最大的毛病就是没有带确定和取消这两个按钮,而ActionSheetPicker是以上两个选择器的开源封装.但是这个东东也有些小问题,就是没 ...

  8. AVPlayer的基本使用

    2014-5-7 06:46| 发布者: admin| 查看: 437| 评论: 0   摘要: 在iOS开发中,播放视频通常有两种方式,一种是使用MPMoviePlayerController(需要 ...

  9. 【python】网络爬虫抓取图片

    利用python抓取网络图片的步骤: 1.根据给定的网址获取网页源代码 2.利用正则表达式把源代码中的图片地址过滤出来 3.根据过滤出来的图片地址下载网络图片 今天我们用http://www.umei ...

  10. CSS进阶

    盒子模型的边框就是围绕着内容及补白的线,这条线你可以设置它的粗细.样式和颜色(边框三个属性). 1.border-style(边框样式)常见样式有:dashed(虚线)| dotted(点线)| so ...