转自:http://blog.csdn.net/looksunli/article/details/9799395
不管是游戏,还是网站,最基本的功能,就是用户注册登录。
或许,我们做过多次用户的登陆注册的功能,但我们是否想过,为什么要实现用户的登录。用户怎样做才算登录成功。
对用户而言,登录后,就有了他的一片“天地”,例如,登录CSDN后,就可以管理自己的博客,否则,你没有权利管理。关于是否登录成功的问题,在用户看来,如果用户名和密码输入成功,就算登入成功,否则,登录不成功。
但这一切,在程序中是怎样实现的呢?在程序中,怎样判定这个用户处于登录状态,怎样判断用户是否有权利访问某个URL,例如管理自己的博客。
为了搞清楚上面的问题,需要我们了解的一个知识点是,HTTP协议实际上是无状态的,非持久连接。也就是说,你第二次通过某个浏览器访问WEB应用,他其实不知道你已经来过一次了。
这里,有一个问题就是,我们的需求是需要知道用户“是否登录”了,即当这个用户登录后,第二次访问的服务器的时候,服务器需要知道请求是来自同一个用户,可是,由于HTTP协议是无状态的,服务器无法知道两次访问是不是来自同一个人。
这里就使用到COOKIE技术了,使用COOKIE可以解决以上问题,让服务器知道用户是否登录。
cookie是什么?
cookie是一个文本文件,保存在客户端硬盘中(如果设置了cookie的过期时间),或者在用户的浏览器内存中(如果cookie是临时的)。这个文件对用户来说,是透明的,你可以通过浏览器工具来查看当前的cookie,可能不止一个。
cookie是什么时候被保存在浏览器中的?
这个问题很重要,浏览器的cookie值不会凭空产生。它是服务器端通知客户端的产生的。如果用户浏览器支持COOKIE,使用下面一段代码就可以创建COOKIE。
- setcookie($name, $value, $expire, $path, $domain, $secure)
$path: 千万不要把这个路径理解为cookie的保存路径,如果不设置,则路径为目录,服务器中的所有脚本都可以访问到,The path on the server in which the cookie will be available on. If set to '/', the cookie will be available within the entire domain
$domain: 表示这个cookie所属的域,cookie是不能跨域访问的。
例如:
- setcookie('xxx', 'yyyyyyyyyyyyy');
当用户第一次访问这段程序的时候,setcookie函数会生成cookie文件,并保存在浏览器的response Header,注意,这个时候,如果访问服务器中的全局数据$_COOKIE,会发现这个数组为空。此时,客户端还没有把cookie信息传到服务器端。
浏览器还没有保存这个cookie
当第二次访问这个页面的时候,这个时候,浏览器会自动把cookie信息传到服务器端(如果这个cookie没有过期的话)。这样,服务器才保存了这个cookie。
服务器中,如果获取到这个cookie值?
在PHP中,任何从客户端传过来的cookie都可以保存在$_COOKIE这样的全局函数中。在服务器端,可以通过这个数组来访问cookie的信息。记住,第一次读取它的信息的时候,并不会生效。原因就是我上面说的。
那么我们怎么利用cookie实现用户登陆呢?
流程图:
使用COOKIE保存用户的TOKEN值。这样,服务器会读取保存在$_COOKIE数组里面的信息判断用户是否登陆。
代码展示:
登陆时,当用户输入正确的用户名和密码后,需要调用下面的代码:
- /**
- * 刷新 userToken
- *
- * @param int $uid
- * @param string $userToken
- * @param int $expires
- * @throws Core_Exception_Logic
- * @return void
- */
- private function _refreshUserToken($uid, $userToken = null, $expires = null)
- {
- // 生成新的TOKEN值
- if (! $userToken) {
- $userToken = self::genUserToken($uid);
- }
- // 更新玩家的TOKEN
- if (! Dao('Share_UserIndex')->updateUserToken($uid, $userToken)) {
- throws(_('登陆失败,请稍候再试'));
- }
- // 设置用户凭证到 cookie
- $this->_setUserCookie($userToken, $expires);
- }
为什么登陆成功后,都要更新用户的TOKEN值呢?
防止,如果用户A的token值一直都更新,被用户B窃取,这样,用户B伪造COOKIE,如使用浏览器直接添加一个COOKIE,这样可以直接登陆用户A的账号,绕过了用户名和密码的验证。
第二,就是保证一个账号只能是一个用户登陆。
在控制器的入口处检查用户是否登陆:
- abstract class Controller_Abstract extends Core_Controller_Web
- {
- /**
- * 构造函数
- */
- public function init()
- {
- // 获取当前已登录用户 userIndex
- if (! $this->_userIndex = $this->_auth->getUserByToken()) {
- $this->_checkAuth && $this->vRedirect('/auth/login');
- }
- // 如果已登录
- if ($this->_userIndex) {
- // 实例化一个玩家实例
- $this->_user = new Model_User($this->_uid);
- }
- }
- }
其中 getUserByToken()函数就是根据保存在COOKIE里面的token值来查找用户,如果查找到,说明这个用户已经登陆,否则未登陆。
- /**
- * 获取当前已登录用户信息
- *
- * @return false/array
- */
- public function getUserByToken()
- {
- // 获取用户的标识符
- if (! $userToken = F('Cookie')->get(self::$cookieName)) {
- return false;
- }
- // 根据相应的userToken 查找用户
- return Dao('Share_UserIndex')->getUserByToken($userToken);
- }
注意一点:在登陆的时候,除了使用cookie保存以外,还可以使用session,但是,为什么我们还少使用session做登陆注册呢,因为session的值是保存在服务器中的,在一些大型的应用中,服务器可能不止一台,所以,无法知道,用户注册的session保存在哪台服务器上。
但是,记住一点就是,session可以保存在memcached中。这里需要修改PHP.INI配置文件。
相关推荐
在提供的压缩包“jq-cookie.7z”中,包含的就是这个插件的源码以及使用说明文档。解压后,我们可以找到主要的文件“jq-cookie”,这通常是JavaScript文件,包含了插件的所有功能。 接下来,我们来看看jq-cookie的...
这样,即使在小程序页面跳转或关闭后,通过3rd_session仍能保持用户登录状态。 在微信小程序的登录流程中,加密数据的解码也是一个关键步骤。由于网络传输可能对数据进行编码,例如将`+`号转换为空格,因此在接收到...
- 用户登录涉及验证用户名和密码,需要从数据库查询匹配的记录,然后使用`password_verify()`检查密码是否正确。 2. **表单处理** - PHP处理HTTP请求,尤其是POST方法,用于接收用户提交的表单数据。`$_POST`超级...
2. 登录Z-Blog后台,选择“外观”或“模板”设置,将新模板设为当前使用模板。 3. 更新模板配置,如设置网站标题、描述、关键词等。 4. 根据需要调整模板的CSS样式和JavaScript文件,实现个性化定制。 5. 预览并发布...
购物车状态的保存通常通过Session或Cookie实现,确保用户购物体验。 4. 订单模块:订单创建、支付、发货、退款等流程。涉及到与第三方支付平台的接口对接,如支付宝、微信支付。 5. 后台管理系统:管理员对商品...
4. 用户认证与权限管理:为了保护网站安全,用户登录和权限管理是必不可少的。PHP可以通过session或cookie来实现用户状态的跟踪,结合数据库实现用户身份验证,同时设置不同角色的权限,确保数据的安全访问。 5. ...
4. session和cookie:用于保持用户登录状态,确保操作安全性。 四、学习价值 对于初学者,这个项目是一个理想的实践平台,可以从以下几个方面提升技能: 1. JSP基础:理解JSP语法,学习如何在JSP页面中嵌入Java代码...
- **Cookie管理**:允许用户选择保留哪些网站的Cookie,以保持登录状态,同时清理其他不必要的Cookie。 3. **软件管理**: - **卸载工具**:提供一个更方便的方式来卸载不需要的程序,避免留下残留文件。 - **...
一种方法是使用Cookie来持久化Session ID,并在每次请求时用`session_id()`函数设置: ```php session_start(); $_SESSION['count']; // 注册Session变量 if (isset($PHPSESSID)) { session_id($PHPSESSID); } $_...
- **安全存储**:生成的验证码应安全地存储,通常推荐使用`Session`而不是`Cookie`,因为`Cookie`可能会被客户端禁用或篡改,而`Session`存储在服务器端,相对更安全。 - **验证过程**:在用户提交表单时,服务器...
4. **数据修改**:在数据传输过程中,Fiddler2 允许用户修改请求或响应的内容,如修改请求参数、替换响应中的HTML文本,甚至修改Cookie值,以测试不同场景下的应用行为。 5. **解密HTTPS**:通过配置,Fiddler2 ...
【标题】: "Java爬虫技术详解" 在编程领域,爬虫是一种自动化程序,用于从互联网上抓取大量数据。本教程聚焦于使用Java语言构建爬虫,旨在为初学者提供一个入门指南。Java作为一门广泛应用的编程语言,拥有丰富的库...
1. 用户认证与授权:使用session和cookie进行用户登录状态的管理,实现权限控制,确保只有登录用户才能进行发帖、回帖等操作。 2. 数据验证:在用户提交表单时,对输入数据进行验证,防止SQL注入和其他安全风险。 3....
4. **Web浏览器设置**:用户的Web浏览器必须启用Cookies,因为服务器生成的认证令牌是通过Cookie传回用户浏览器的。 5. **WebSphere版本兼容性**:WebSphere单点登录功能仅在基于NT系统的WebSphere 3.5上进行过测试...
3. controllers目录:处理业务逻辑,如用户登录、图书添加等操作。 4. routes目录:定义HTTP请求的路由,将请求分发到对应的控制器函数。 5. middleware目录:存放自定义中间件,如用户认证、错误处理等。 6. views...
在用户成功登录后,服务器使用`jsonwebtoken`生成JWT,通常将其发送到客户端作为响应的一部分。 2. **验证令牌(Token Validation)** 当客户端在后续请求中提供JWT时,服务器会使用相同的密钥和算法验证令牌的...
《WebMagic爬虫技术详解》 在信息技术领域,网络爬虫是数据挖掘的重要工具,它自动遍历互联网上的网页,提取所需信息。WebMagic是一个Java编写的轻量级且高度可定制的网络爬虫框架,它以其简洁的API设计和强大的...