网页上经常有一些自动登录的checkbox,勾选后,下次进入该网站,无需登录,即可执行一些需要登录才能执行的操作。上班无事,用thinkphp做了下

1 下面是一个很普通的form表单,有一个checkbox 用来标志是否选择了自动登录。

tpl/Login/index.html

<div class='demo'>
<form action="{:U(dologin)}" method="post">
用户名:<input type="text" name="username"/><br/>
密 码:<input type="password" name="password"/><br/>
<input type="checkbox" name='auto'/>自动登录<br/>
<input type="submit" value='提交'/>
</form>
</div>

2 下面是提交处理方法 Lib/Action/loginAction.class.php

  //处理登陆表单提交
public function dologin() {
if (!$this->isPost()) {
halt('页面不存在');
}
$m = M('user');
//dump($m);
$username = $this->_post('username');
$password = $this->_post('password');
$where = array('username' => $username);
//判断用户名是否存在
if ($m->where($where)->getField('id')) { $where = array('username' => $username, 'password' => $password);
//判断用户名密码是否一致
if ($id = $m->where($where)->getField($id)) {
$_SESSION['uid'] = $id;
//如果勾选了自动登录,则将用户名和ip写入cookie中
if (isset($_POST['auto'])) {
$ip= get_client_ip();
$value=$username."|".$ip; $value=encryption($value);
setcookie('auto',$value,C('AUTO_LOGIN_TIME'),'/');
}
header("content-type:text/html;charset=utf-8");
$this->redirect('/Index/index', array(), 3, '登陆成功,正在跳转'); }
} else {
$this->error('用户名不存在');
}
}

可以看到代码整体基本都是用户名密码的验证,其中isset($_POST['auto'])是勾选自动登录后,写入cookie。其中encryption()函数是一个加密函数

3写一个action基类,CommonAction常用的Action都去继承这个类

class CommonAction extends Action {

    Public function _initialize() {
//如果$_COOKIE['auto']存在,并且用户不在登录状态
if(isset($_COOKIE['auto']) && !$_SESSION['uid']){
$value= explode('|',encryption($_COOKIE['auto'],1));
//查看ip是否一致
if($value[1]= get_client_ip()){
$m=M('user');
$where=array('username'=>$value[0]);
//检查用户名
if($id=$m->where($where)->getField('id')){
$_SESSION['uid']=$id;
}
}
}
if(!isset($_SESSION['uid'])){ redirect(U('login/index'));
}
} }
if(isset($_COOKIE['auto']) && !$_SESSION['uid']){}这个判断用来判断用户的cookie中有auto值,并且没有登录时,假如验证成功,则进一步验证ip与上次ip是否一致,验证用户名是否存在于数据库中,如果验证通过,则写入session,由此实现自动登录。其中encryption($_COOKIE['auto'],1)
是一个解密函数,将加密后的用户名和密码解密出来进行验证。 ps:加密解密函数如下,可以写在common/common.php作为函数进行使用
/**
*
* @param string $value 要加密的值
* @param int $type 0加密 1解密
*/
function encryption($value,$type=0){
$key=md5(C('ENCRYPTION_KEY'));
if($type==0){ $value=$key^$value;
$value= str_replace('=','',base64_encode($value));
return $value;
}else if($type==1){
$value= base64_decode($value);
return $value^$key;
}
}

thinkphp实现自动登录的更多相关文章

  1. Linux开机自动登录(文本模式)

    • Linux系统启动登录过程 以RedHat/CentOS为例,Linux系统Level3模式下从启动到登录的整个过程大致如下: 1> 加载BIOS信息:包含了CPU/显卡/内存/硬盘/网卡等 ...

  2. expect实现自动登录

    自动登录主机(ssh) 建脚本item2login.sh,包含如下内容 #!/usr/bin/expect set timeout 30 spawn ssh -p [lindex $argv 0] [ ...

  3. cookie自动登录的实现

         cookie自动登录是指把用户登录的信息按期限(自定)保存在客户端,当用户请求登录时判断客户端用没有cookie对象,有的话填充值,否则登录界面的输入框为空,不进行填充.      登录界面 ...

  4. windows 2003自动登录的具体步骤

    在win2003系统中,使用最多的可能就是远程操作了,关于远程操作的那些事很多用户还是有些迷茫的.如果win2003系统远程重启后,要重新登录系统十分的麻烦,如何才能实现重启后的自动登录呢?让高手告诉 ...

  5. 如何设置phpMyAdmin自动登录和取消自动登录

    如何设置phpMyAdmin自动登录? 首先在根目录找到config.sample.inc.php复制一份文件名改为config.inc.php(如果已经存在 config.inc.php 文件,则直 ...

  6. 利用activeX控件在网页里自动登录WIN2003远程桌面并实时控制

    首先要自己配置并打开受控端的WEB远程桌面服务,这个在“添加/删除windows组件”里有,我只在windows 2003 server里试过,没试过XP.下面我们在客户端安装微软提供的远程桌面客户端 ...

  7. 简单的行为控制管理方法,自动登录,session定时验证码过期

    代码很简单 实现的方式很多,用cookies 用static 变量 file文件缓存 等等 比如 //简单行为管理,如果请求此方法次数多于5次,就显示验证码 吧当前方法的name传进来,有效时间是5分 ...

  8. QQ模拟自动登录实现

    QQ模拟自动登录实现 本篇文章主要介绍"QQ模拟自动登录实现(带验证码)",主要涉及到java 实现QQ自动登录(带验证码)方面的内容,对于java 实现QQ自动登录(带验证码)感 ...

  9. java 自动登录代码

    javaBean的代码    package bean;    import java.io.Serializable;    public class Admin implements Serial ...

随机推荐

  1. EF中的EntityState几个状态的说明

    之前使用EF,我们都是通过调用SaveChanges方法把增加/修改/删除的数据提交到数据库,但是上下文是如何知道实体对象是增加.修改还是删除呢?答案是通过EntityState枚举来判断的,我们看一 ...

  2. Android - &quot;cause failed to find target android-14&quot; 问题

    "cause failed to find target android-14" 问题 本文地址: http://blog.csdn.net/caroline_wendy Andr ...

  3. Swift构造函数(Initializer)和析构函数(Deinitializer)

    要初始化结构和类和其他类型的实例的属性. 默认的构造函数 struct Fahrenheit { var temperature: Doubleinit(){ temperature = 32.0 } ...

  4. 【Stackoverflow好问题】java在,如何推断阵列Array是否包括指定的值

    问题 java中,怎样推断数组Array是否包括指定的值 精华回答 1. Arrays.asList(...).contains(...) 2. 使用 Apache Commons Lang包中的Ar ...

  5. cocos2d-x 3.0游戏实例学习笔记 《跑酷》第四步--地图循环&amp;主角加入动作

    说明:这里是借鉴:晓风残月前辈的博客,他是将泰然网的跑酷教程,用cocos2d-x 2.X 版本号重写的,眼下我正在学习cocos2d-X3.0 于是就用cocos2d-X 3.0重写,并做相关笔记 ...

  6. 图数据库 Titan 高速入门

    尤其在互联网世界,图计算越来越受到人们的关注,而图计算相关的软件也越来越丰富.本文将高速展示 Titan这个open source 的图数据库. 注:本文的操作主要基于Titan 官方的两篇文档: - ...

  7. CentOs Linux 安装MySql服务失败 安装需要依靠包error:Failed dependencies

    [root@sh158-xen data]#rpm -ivh MySQL-server-5.5.24-1.linux2.6.x86_64.rpm error: Failed dependencies: ...

  8. Installshield获取安装包版本的系统变量是IFX_PRODUCT_VERSION

    原文:Installshield获取安装包版本的系统变量是IFX_PRODUCT_VERSION Installshield获取安装包版本的系统变量为IFX_PRODUCT_VERSION 当笔记记下 ...

  9. Linq to Sql : 三种事务处理方式

    原文:Linq to Sql : 三种事务处理方式 Linq to SQL支持三种事务处理模型:显式本地事务.显式可分发事务.隐式事务.(from  MSDN: 事务 (LINQ to SQL)).M ...

  10. oracle 存储过程的基本语法

    原文:oracle 存储过程的基本语法 1.基本结构 CREATE OR REPLACE PROCEDURE 存储过程名字(    参数1 IN NUMBER,    参数2 IN NUMBER) I ...