java 验证登陆_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比较来进行判断是否已经登录了,
//推荐的验证方式
Object pwd=session.getAttribute("loginUserPwd");
if(pwd == null){
out.print("你还没有登录");
//...other code...
}else{
out.print("你已经登录了");
//...other code...
}
能不能跟字符型的空值进行比较判断是否已经登录了呢?不能,
为什么呢?原因是java中当试图查找一个不存在的session变量,返回的null,即不存在,没定义,没有分配内存的,(java中)当强制转换为
String型时,不存在的null变成实际存在的String类型且内容为null的结果,也就不等于String类型的空值,如果设计不为空判定为已
经登录,那因为这个原因,就出现没有登录的也可以访问了,显然不是我们想要的;
//通过空值判断是否已经登录,错误方式
String pwd=(String)session.getAttribute("loginUserPwd");
//注意:通过java的String类型强制转换后,不存在的null变成了实际存在String类型的null,
//即未登陆的也通过验证了,误也
if(pwd != ""){
out.print("你已经登录了");
//...other code...
}else{
out.print("你还没有登录");
//...other code...
}
那能不能跟字符型的null来进行比较判断是否已经登录了呢?可以,但过程变得麻烦,不推荐使用;
通过空值方式比较是否登录我们知道,不存在的 session 变量通过String强制转换后变成实际存在的字符型的 null
,那我们可以设计等于字符型的null的判定为未登录,但会出现一个情况就是用户的密码正好为字符型的null时反而不能通过验证了,当然可以做其它的处
理来解决这个问题,但逻辑和代码变复杂了,我不希望这样,简单比较方便;
//通过是否等于字符型的null值来判断是否已经登录,不推荐使用
String pwd=(String)session.getAttribute("loginUserPwd");
//注意:通过java的String类型强制转换后,不存在的null变成了实际存在String类型的null,
//对于密码正好是字符型的null出现验证不通过的情况,需要做其它处理
if(pwd == "null"){
out.print("你还没有登录");
//...other code...
}else{
out.print("你已经登录了");
//...other code...
}
二,验证的细度
上面的验证方式,只能判断是否已经登录了,但是很多的站点,是允许多用户的情况,各个不同用户只能对各自自己的资源进行管理,所以进行资源管理时,
首先要登录,登录了还需要进一步区别验证是否是自己本人,即不能出现在同一个站点中,自己登录了,同时可以修改另一个用户的资料的情况;
通过上面我们知道通过判断服务器端session变量的是否存在可以判定是否登录,但这个对一个站点来说,这仅能判断是否已经登录到了本站点,在多用户用
户的情况下,如果一个用户登录后,使用适当的URL即可访问另一个用户的资料,这个是不希望出现(可能管理员除外),所以这个时候,验证不能是判断否为
空,而是通过session变量是否等于用户本身设置的某个密码,来判断是否是自己本人登录,这就使登录验证细到用户级别,同一个站点的多个用户各自只能
管理自己的资料;
//判断是否已经登录,并且是否是自己本人登录
Object pwd=session.getAttribute("loginUserPwd");
String clientPWD = (String)session.getAttribute("loginUserPwd"); //数据来源客户端用户的输入
String serverPWD = "XXX"; //这个密码来源于服务器端某个文件或DB中,是用户自己事先设置好的
if(pwd == null || clientPWD != serverPWD ){
out.print("你还没有登录,或不是自己本人登录");
//...other code...
}else{
out.print("你已经登录了,并且是自己登录");
//...other code...
}
可能还有其他的方式来验证,如果有其它的方式,给我留言一下,我参考参考...
注:转载 http://blog.csdn.net/shenzhennba/article/details/8100853
java 验证登陆_Java的登陆验证问题相关推荐
- java登录界面_java实现登陆页面
登录页面: import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.util.Even ...
- java 字符过滤器_Java Web---登录验证和字符编码过滤器
什么是过滤器? 在Java Web中,过滤器即Filter.Servlet API中提供了一个Filter接口(javax.servlet.Filter).开发web应用时,假设编写的Java类实现了 ...
- java 验证手机号_Java使用正则表达式验证手机号和电话号码的方法
一个朋友需要,所以写了这两个,话不多说,看代码 中国电信号段 133.149.153.173.177.180.181.189.199 中国联通号段 130.131.132.145.155.156.16 ...
- java 正则表达式 电话_Java使用正则表达式验证手机号和电话号码的方法
一个朋友需要,所以写了这两个,话不多说,看代码 中国电信号段 133.149.153.173.177.180.181.189.199 中国联通号段 130.131.132.145.155.156.16 ...
- 手机端java编辑器验证正确_java – 使用编辑器验证表的单元格
我的JTable有一个密码字段编辑器.我想在用户单击编辑另一个字段时,如果文本长度小于8位,则显示错误消息.我尝试过焦点听众.但它不起作用.请帮帮我,因为我刚刚开始使用 java swing. cla ...
- java ipv6校验_java - IPv6地址验证和规范化[关闭] - 堆栈内存溢出
我只是通过adhoc方法来检查IPV4和IPV6两种寻址方案的有效性:这是我的代码......我的代码总是欢迎更正. 如果我的解决方案有误,请原谅我. #include #include #inclu ...
- 如何用java的程序 计算验证条形码_java 案例之验证商品条形码
package lifubo.barCodeChecking; //验证码条码(共13位),代表了一件商品编码,前12位("692116851128") //有具体代表含义,第13 ...
- Sign in with Apple(苹果授权登陆)服务端验证-测试通过版
Sign in with Apple(苹果授权登陆)服务端验证-测试通过版 1.先引用2个jwt用到的jar包 2.算法的工具类 三方登录调用验证工具类 苹果登录方式有2种,这里介绍基于JWT算法验证 ...
- wegame每次登陆都要滑动验证_Vue项目中实现用户登录及token验证
在前后端完全分离的情况下,Vue项目中实现token验证大致思路如下: 1.第一次登录的时候,前端调后端的登陆接口,发送用户名和密码 2.后端收到请求,验证用户名和密码,验证成功,就给前端返回一个to ...
最新文章
- 你与ACM MM的距离只差一场算法比赛
- TensorFlow介绍之TF数据流图
- java编程pig编码_Pig编程指南.pdf
- python 状态机教程_python 实用工具状态机transitions
- anaconda python命令_Anaconda常用命令
- Django 3.2.5博客开发教程:实现网站首页
- Kubernetes环境下的各种调试方法
- dll 重新加密打包的问题
- 贺:MSN-.NET 技术交流群荣登群首页
- ios中数据存储方式
- 霍夫斯特拉大学计算机科学专业排名,美国霍夫斯特拉大学的最新排名
- Mac命令行 显示隐藏文件夹 不显示隐藏文件夹
- Linux和Windows的区别
- Python读取docx表格中的合并单元格信息
- AIX7.1 VMO 参数默认设置
- 计算机程序设计表单,表单模板和表单简介
- CSS实现间隔线|(竖线)
- burp如何设置微信小程序代理
- SK海力士将继续投资建设英特尔大连芯片厂
- C语言:typedef用法简介
热门文章
- 匕首线切割图纸下载_使用Robolectric测试带有匕首注入依赖性的类
- html中ct一般指什么颜色,第七章 CT试题(录入)
- 智能软件的编程语言A语言 之2 --序言:使aaas成为可能的根据
- Dxoygen语法规范
- “云上管车”联合钉钉连接器,助力企业数据与系统互动互联
- jmeter—PPT讲解——基础(测试木头人)
- 【调剂】2022年赣南师范大学数学与计算机科学学院计算成像课题组招生硕士研究生...
- Blob分析---board.hdev(漏焊检测)
- 5号字对应的数字字号_五号字体多大?
- ibm3850服务器cpu开启虚拟化,IBM内建虚拟化X4服务器3850 M2一季度正式推出