异位或加密方法:

/*
*登陆如果自动登陆加密
*默认是0解密状态,1是加密
*采用的方法是异位或加密
*/
function encrytion($value,$type=0){
$key = md5(C('AUTO_LOGIN_KEY'));
//加密
if($type){
// 64位加密
//return base64_encode($value ^ $key);
// 加密后可能会有等号
return str_replace('=','',base64_encode($value ^ $key));
};
$value = base64_decode($value);
return $value ^ $key;
}

在Config.php文件中设置异位或加密字段及自动登陆有效时间:

<?php
return array(
//'配置项'=>'配置值'
//异位或加密
'AUTO_LOGIN_KEY' => md5('www.ask.com'),
//自动登陆有效时间
'AUTO_LOGIN_TIME' => time() +3600*24*7,
'LV_LOGIN' => 1,
);

如果要自动登陆,设置cookie:保存自动登陆账号的ID,IP,和账号:(login控制器)

// 判断下一次是否自动登陆
if(isset($data['auto'])){
$value = $user['id'].'|'.get_client_ip().'|'.$user['username'];
//echo $value."<hr>"; // 需要保存的信息 1|127.0.0.1|赵子龙
//进行加密
$value = encrytion($value,1);
//echo $value."<br>"; //加密结果
//解密
$val = encrytion($value,0);
//echo $val; // 解密结果
// 设置 COOKIE
@setcookie('auto',$value,C('AUTO_LOGIN_TIME'),'/');
};

判断COOKIE及自动登陆:

class CommonController extends Controller {
Protected function _initialize(){
//if(!C('WEB_STATE')){$this->error('网站正在维护中...');};
//是否自动登陆
//判断是否有COOKIE 且 没有登陆
if(isset($_COOKIE['auto']) && !isset($_SESSION['uid'])){
$value = $_COOKIE['auto'];
$value = encrytion($value,0);
//echo $value; // 1|127.0.0.1|赵子龙
// 拆成数组
$value = explode('|',$value);
if($value[1] == get_client_ip()){
session('uid',$value[0]);
session('username',$value[2]);
}
};
}
}

整个控制器:

<?php
namespace Home\Controller;
use Think\Controller;
class CommonController extends Controller {
Protected function _initialize(){
//if(!C('WEB_STATE')){$this->error('网站正在维护中...');};
//是否自动登陆
//判断是否有COOKIE 且 没有登陆
if(isset($_COOKIE['auto']) && !isset($_SESSION['uid'])){
$value = $_COOKIE['auto'];
$value = encrytion($value,0);
//echo $value; // 1|127.0.0.1|后盾网
// 拆成数组
$value = explode('|',$value);
if($value[1] == get_client_ip()){
session('uid',$value[0]);
session('username',$value[2]);
}
};
}
public function login(){
//if(IS_POST){$this->error('页面不存在');};
$data = I('post.');
//p($data);die;
$dataPad = I('post.pwd','','md5');
$db = M('user');
$where = array('account'=>$data['account']);
$field = array('id','username','password','logintime','lock');
$user = $db->where($where)->field($field)->find();
if(!$user || $user['password'] != $dataPad){
$this->error('账号或密码错误');
};
// 如果正确就继续往下走
// 判断是否锁定
if(!$user['lock']){
$this->error('账号被锁定');
};
// 判断下一次是否自动登陆
if(isset($data['auto'])){
$value = $user['id'].'|'.get_client_ip().'|'.$user['username'];
//echo $value."<hr>"; // 需要保存的信息 1|127.0.0.1|赵子龙
//进行加密
$value = encrytion($value,1);
//echo $value."<br>"; //加密结果
//解密
$val = encrytion($value,0);
//echo $val; // 解密结果
// 设置 COOKIE
@setcookie('auto',$value,C('AUTO_LOGIN_TIME'),'/');
};
//每天登陆增加经验
// 读取它上一次的登陆时间,在和今天的 0点0时0分0秒 对比 如果小就是新登陆
$today = strtotime(date('Y-m-d'));
$where = array('id'=>$user['id']);
if($user['logintime']<$today){
$db->where($where)->setInc('exp',C('LV_LOGIN'));
}
//更新时间
$db->where($where)->save(array('logintime'=>time())); //写入到session
session('uid',$user['id']);
session('username',$user['username']);
//从那个页面来就跳转到那个页面去
redirect($_SERVER['HTTP_REFERER']);
}
//退出登录
Public function logout () {
session_unset();
session_destroy();
redirect(__APP__);
}
}

ThinkPHP做自动登陆及异位或加密COOKIE!的更多相关文章

  1. shiroWeb项目-记住我(自动登陆实现)(十五)

    用户登陆选择“自动登陆”本次登陆成功会向cookie写身份信息,下次登陆从cookie中取出身份信息实现自动登陆. 用户身份实现java.io.Serializable接口便于反序列化 package ...

  2. php 品牌全车零件订购平台( 带采集数据 及 账号自动登陆【已绕过https证书加密】,php源码 ,QQ: 876635409 )

    php捷豹路虎 品牌全车零件订购平台  ( 带采集数据 及 账号自动登陆[已绕过https证书加密],php源码 ,QQ: 876635409 [由于咨询用户太多,请备注:汽车配件]) 一.php+m ...

  3. thinkphp实现自动登录

    网页上经常有一些自动登录的checkbox,勾选后,下次进入该网站,无需登录,即可执行一些需要登录才能执行的操作.上班无事,用thinkphp做了下 1 下面是一个很普通的form表单,有一个chec ...

  4. shell实现SSH自动登陆

    h2:first-child, body>h1:first-child, body>h1:first-child+h2, body>h3:first-child, body>h ...

  5. Vue、Vuex+Cookie 实现自动登陆 。

    概述 1.自动登陆实现思路. 2.vuex + cookie 多标签页状态保持. 自动登陆的需求: 1.登陆时勾选自动登陆,退出登陆或登陆到期后再次登陆后自动填写表单(记住密码)或访问登陆页自动登陆. ...

  6. UWP Jenkins + NuGet + MSBuild 手把手教你做自动UWP Build 和 App store包

    背景 项目上需要做UWP的自动安装包,在以前的公司接触的是TFS来做自动build. 公司要求用Jenkins来做,别笑话我,之前还真不晓得这个东西. 会的同学请看一下指出错误,不会的同学请先自行脑补 ...

  7. 在win10中创建开机自动登陆的网络驱动器

    前提环境: win10系统电脑一台. centos系统电脑一台,在该系统中安装samba,并配置共享. 要解决的问题: 在win10做了网络映射,将centos共享的文件夹设置成本地硬盘.在映射时,也 ...

  8. 使用ssh公钥密钥自动登陆linux服务器

    转自:http://7056824.blog.51cto.com/69854/403669 作为一名 linux 管理员,在多台 Linux 服务器上登陆进行远程操作是每天工作的一部分.但随着服务器的 ...

  9. 让 Putty 保存密码,自动登陆的四种方法

    Putty 基本是我在紧急时候用来登陆 Linux/Unix 终端的不二之先,因其小,开源,界面也非常实用.可是当你要在私有的机器上,经常性的要登陆很多机器的时候就觉得烦琐了,不光打开一堆的窗口,还要 ...

随机推荐

  1. C++ 有用的网站

    C++ 有用的网站C++ Programming Language Tutorials ? C++ 编程语言教程.C++ Programming ? 这本书涵盖了 C++ 语言编程.软件交互设计.C+ ...

  2. 关于解决用tutorial7教程中的代码打造一款自己的播放器中的声音噪音问题

    ////////////////////////////////////////////////////////////////////////////////////////////对于用FFMPE ...

  3. c语言的fopen

    c语言fopen函数 fopen函数用来打开一个文件,其调用的一般形式为: 文件指针名=fopen(文件名,使用文件方式); 其中, “文件指针名”必须是被说明为FILE 类型的指针变量: “文件名” ...

  4. Android获取屏幕高度、标题高度、状态栏高度详解

    Android获取屏幕高度的方法主要由view提供 通过View提供的方法获取高度方式有两种: 1, 当前显示的view中直接获取当前view高宽2,通过Activity的getWindow().fi ...

  5. failed to push some refs to 'git@github.com:*/learngit.git'

    https://jingyan.baidu.com/article/f3e34a12a25bc8f5ea65354a.html 出现错误的主要原因是github中的README.md文件不在本地代码目 ...

  6. dedecms的arclist循环中判断第一个li添加css,否则不加

    dedecms的arclist循环中,判断如果是第一个li,则添加固定的css,否则不加   写法如下: {dede:arclist row=4 flag='p'} <li [field:glo ...

  7. Post方式调用wcf服务

    我们平常在PC端调用WCF服务,只要知道WCF服务的地址,客户端直接添加引用服务就可以使用了,殊不知还有其他方式,其实,我们也可以 通过HTTP POST的方式调用WCF服务,这样就不用添加引用了,在 ...

  8. MongoDB创建表步骤,Mongo常用的数据库操作命令,查询,添加,更新,删除_MongoDB 性能监测

    ->use Admin         (切换到创建用户) ->db.TestDb          (创建数据库) ->db.addUser(“userName”,”Pwd”)   ...

  9. JsonConvert.DeserializeAnonymousType

    string JsApiTicketString = string.Empty; using (StreamReader reader = new StreamReader(response.GetR ...

  10. opencascade读取iges并用vtk离散的一些问题

    近期抽时间在弄iges文件内容读取的工作.然后将其离散化在vtk中能够显示处理以及兴许的一些工作.主要目的是识别CAD文件导出的模型,然后进行离散处理.方便兴许的处理.离散工作比較简单.opencas ...