dede cookie.helper.php,织梦中cookie和session的应用

2023-11-25 16:20

本文主要是介绍dede cookie.helper.php,织梦中cookie和session的应用,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

织梦中用到了cookie和session,在织梦后台用的是session,在会员系统首页用的是cookie,前台和后台用到的验证码是通过session来实现验证的,我们先从织梦后台开始分析,织梦系统中的session的应用。

当我们打开后台,通过抓取头文件,如下图所示。

a52699017073990ee6ec359cc402dfd0.png

通过上图我们可以看到,已经创建了一个session 文件。我们分析一下织梦从打开后缀到登录,程序都执行了哪些操作。

当我们打开后台http://localhost/dede后,系统找到index.php文件,然后,在这个文件中引入后台配置文件config.php,在这个配置文件里引入了“管理员登陆类”,这个类里面的第一句就session_start(),并且在配置文件里接着

包含了common.inc.php文件,直接把验证码类也引入,同时,验证码初始化,我们打开验证码类看一下,你会发现在验证码初始化后,同时把验证码存入cookie中,这就是为什么在这个类中经常看到session_start()的影子。接着在配置

文件中运行里面的程序,当运行到下面的代码:

$cuserLogin = new userLogin();

if($cuserLogin->getUserID()==-1)

{

header("location:login.php?gotopage=".urlencode($dedeNowurl));

exit();

}

这句是用来判断用户是不是已经登录了,如果没有登录,则转到location里面的路径。我们打开类文件userlogin.class.php,可以找到方法getUserID(),这个方法是用来判断用户id是不是存在,若存在,则返回这个id,否则返回-1。

因为没有登录,所以,程序会自动路出config.php,并转到http://localhost/dede/login.php?gotopage=%2Fdedecms%2Fdede%2F这里,即后台登录界面,程序也就转到了login.php文件,这个文件正是处理用户提交的用户名和密码,还有验证码的。

这个login.php对应的模板文件是login.htm,就是我们看到的界面,当我们写上用户名、密码和验证码后,点提交,这些数据将被提交到login.php文件,在62行我们看到代码if($dopost=='login'),用来处理当提交了后,难证用户名、密码和验证码的。

要注意的是:我们在做这样的类似的用户验证功能时,最好先验证一下验证码,因为验证码是通过cookie来实现验证的,而用户名和密码则要查询数据库,如果验证码不正确,白白查询数据库,浪费资源。织梦也是这样做的,先通过函数GetCkVdValue()来验证,然后,再通过checkUser($userid,$pwd)方法进行验证。

其中GetCkVdValue()在“系统核心函数存放文件”common.inc.php里面,在这个文件的最后,我们就可以找到。checkUser($userid,$pwd)方法在“管理员登陆类”类文件userlogin.class.php里面约240行,如果用户名和密码正确,则返回1,否则返回-1。

若用户名正确,则执行下面的这段代码:

//success

if($res==1)

{

$cuserLogin->keepUser();

if(!empty($gotopage))

{

ShowMsg('成功登录,正在转向管理管理主页!',$gotopage);

exit();

}

else

{

ShowMsg('成功登录,正在转向管理管理主页!',"index.php");

exit();

}

}

这段代码非常重要,特别是$cuserLogin->keepUser();这个方法的调用,这方法是为了“保持用户的会话状态”,也是把用户的信息,写到cookie里面的重要方法,只有执行了这个方法,才能使在我们再打开浏览器一个选项卡,再打开后台,可以不用登录直接进行网站后台。

这也是下一次打开后台路径后,在config.php里面进行判断用户是不是已经登录,也就是getUserID()是不是等于-1,即if($cuserLogin->getUserID()==-1)的重要依据。

回过头来我们再看一下,上面这段代码中的$cuserLogin->keepUser();这句是如何实现把cookie写入到session文件中的。$cuserLogin->keepUser()这个方法在文件类userlogin.class.php里面的第281行开始处。要读懂这个文件,还要打开common.inc.php打到如下代码。

1418aa19ac615f773774fafd342bbaf7.png

这里在大于php5.4以上的版本的前提下定义了三个函数,分别是创建session值的函数session_register(),判断是否已经设置了session值的函数session_is_registered()和销毁session的函数,session_unregister()。这样无论你的php版本无论是哪一个,都可以用函数session_register()了,织梦帮我们想的非常周到!

回到函数keepUser()里面,在函数里面不仅创建了很多session,例如$_SESSION[$this->keepUserIDTag] = $this->userID;还创建了cookie,

PutCookie('DedeUserID', $this->userID, 3600 * 24, '/');

PutCookie('DedeLoginTime', time(), 3600 * 24, '/');

通过这二个函数创建了cookie,这二个函数在cookie小助手cookie.helper.php里面定义的。

当登录成功,程序直接调用模板index2.htm,进入后台后,我们刚进入后台看到的界面就是这个模板文件。

总结:当我们在地址栏输入http://localhost/dede/按回车后,程序会打开http://localhost/dede/index.php文件,程序会从这个index.php首先进入到config.php里面,当执行代码,执行到

$cuserLogin = new userLogin();

if($cuserLogin->getUserID()==-1)

若你没有登录过,则转到login.php?gotopage=%2Fdedecms%2Fdede%2F界面,这时程序已经跳出config.php,而且此时,程序并没有回到index.php文件里,因为,通过exit()跳到了login.php文件里了。当输入的用户名、密码和验证码通过验证后,程序又跳转到index.php界面,即进入了后台。

若已经登录,又打开浏览器标签,程序依然会进入到index.php里面,然后,进入到config.php里面,此时getUserID()的值不是-1,这是因为刚登录后,程序已经通过session保存在服务器里了,所以,就不会跳转到login.php页面了,而是直接向下运行,装载模板index2.htm,进入后台首页。

其它登录验证跟这个后台的验证类似,只是不像织梦这么复杂而已。

这篇关于dede cookie.helper.php,织梦中cookie和session的应用的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/424107

相关文章

利用Python操作Word文档页码的实际应用

《利用Python操作Word文档页码的实际应用》在撰写长篇文档时,经常需要将文档分成多个节,每个节都需要单独的页码,下面:本文主要介绍利用Python操作Word文档页码的相关资料,文中通过代码... 目录需求:文档详情:要求:该程序的功能是:总结需求:一次性处理24个文档的页码。文档详情:1、每个

Java中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例解析

《Java中的分布式系统开发基于Zookeeper与Dubbo的应用案例解析》本文将通过实际案例,带你走进基于Zookeeper与Dubbo的分布式系统开发,本文通过实例代码给大家介绍的非常详... 目录Java 中的分布式系统开发基于 Zookeeper 与 Dubbo 的应用案例一、分布式系统中的挑战二

Java 缓存框架 Caffeine 应用场景解析

《Java缓存框架Caffeine应用场景解析》文章介绍Caffeine作为高性能Java本地缓存框架,基于W-TinyLFU算法,支持异步加载、灵活过期策略、内存安全机制及统计监控,重点解析其... 目录一、Caffeine 简介1. 框架概述1.1 Caffeine的核心优势二、Caffeine 基础2

使用Node.js和PostgreSQL构建数据库应用

《使用Node.js和PostgreSQL构建数据库应用》PostgreSQL是一个功能强大的开源关系型数据库,而Node.js是构建高效网络应用的理想平台,结合这两个技术,我们可以创建出色的数据驱动... 目录初始化项目与安装依赖建立数据库连接执行CRUD操作查询数据插入数据更新数据删除数据完整示例与最佳

PHP轻松处理千万行数据的方法详解

《PHP轻松处理千万行数据的方法详解》说到处理大数据集,PHP通常不是第一个想到的语言,但如果你曾经需要处理数百万行数据而不让服务器崩溃或内存耗尽,你就会知道PHP用对了工具有多强大,下面小编就... 目录问题的本质php 中的数据流处理:为什么必不可少生成器:内存高效的迭代方式流量控制:避免系统过载一次性

PHP应用中处理限流和API节流的最佳实践

《PHP应用中处理限流和API节流的最佳实践》限流和API节流对于确保Web应用程序的可靠性、安全性和可扩展性至关重要,本文将详细介绍PHP应用中处理限流和API节流的最佳实践,下面就来和小编一起学习... 目录限流的重要性在 php 中实施限流的最佳实践使用集中式存储进行状态管理(如 Redis)采用滑动

深入浅出Spring中的@Autowired自动注入的工作原理及实践应用

《深入浅出Spring中的@Autowired自动注入的工作原理及实践应用》在Spring框架的学习旅程中,@Autowired无疑是一个高频出现却又让初学者头疼的注解,它看似简单,却蕴含着Sprin... 目录深入浅出Spring中的@Autowired:自动注入的奥秘什么是依赖注入?@Autowired

PostgreSQL简介及实战应用

《PostgreSQL简介及实战应用》PostgreSQL是一种功能强大的开源关系型数据库管理系统,以其稳定性、高性能、扩展性和复杂查询能力在众多项目中得到广泛应用,本文将从基础概念讲起,逐步深入到高... 目录前言1. PostgreSQL基础1.1 PostgreSQL简介1.2 基础语法1.3 数据库

Python中的filter() 函数的工作原理及应用技巧

《Python中的filter()函数的工作原理及应用技巧》Python的filter()函数用于筛选序列元素,返回迭代器,适合函数式编程,相比列表推导式,内存更优,尤其适用于大数据集,结合lamb... 目录前言一、基本概念基本语法二、使用方式1. 使用 lambda 函数2. 使用普通函数3. 使用 N

Python中yield的用法和实际应用示例

《Python中yield的用法和实际应用示例》在Python中,yield关键字主要用于生成器函数(generatorfunctions)中,其目的是使函数能够像迭代器一样工作,即可以被遍历,但不会... 目录python中yield的用法详解一、引言二、yield的基本用法1、yield与生成器2、yi