入门客AI创业平台(我带你入门,你带我飞行)
博文笔记

PHP中Session的使用

创建时间:2017-03-20 投稿人: 浏览次数:133

平时自己也写过一些博客系统或者其他的一些文章、内容的后台管理系统。

这些系统的基础就是需要登陆,但是如何保持登陆状态是一个问题。

如果长久的保持登陆状态,我们会用cookie,如果是短期的状态,我们会用session。

大家如果接触到登陆功能,就一定会了解cookie是保存在本地,而session是保存在服务器中的。我也一直这样理解,也没有多想。(就算存储到服务器,本地应该还会存储一个信息来与服务器上的信息对应)

我是写PHP的,在php中,需要session_start()开启session即可。

PHP原生写法实例

session_start();
if($_POST[submit]) {
    $U_Account = trim($_POST[U_Account]);
    $U_Password = md5(trim($_POST[U_Password]));
    $sql = "select U_ID ,U_State,ROLE_ID,UN_ID from user where U_Account="$U_Account" and U_Password="$U_Password" limit 1";
    $query = $userdb->query($sql);
    $info = $userdb->fetch_array($query);
    if ($info != false and $info["U_State"]==1) {
        //登陆成功
        $_SESSION[U_ID]=$info[U_ID];
        $_SESSION[ROLE_ID]=$info[ROLE_ID];
        $_SESSION[UN_ID]=$info[UN_ID];
        $_SESSION[shell]=md5($U_Account.$U_Password);
        echo "<script language="JavaScript">location.href="u_record.php";</script>";
		//如果开启cookie,则保存cookie。
		
    }
    else if ($info != false and $info["U_State"]==0)
    {
        echo "<script language="JavaScript">alert("请您先激活邮箱,然后重新登录");history.back(-1);</script>";
        session_destroy();
    }
    else {
        echo "<script language="JavaScript">alert("帐号或密码错误");history.back(-1);</script>";
        session_destroy();
    }
	$userdb->close();
}

如果在Laravel框架中,我们则可以这样写

首先要在路由器里面添加一个web中间件,或者在类的_construct()中添加web中间件,

所有的路由必须经过web中间件才可以启用session

Session的具体使用方法

class login extends Controller
{
    public function login()
    {
        $info = Input::get();
        $U_Account = $info["U_Account"];
        $U_Password = md5($info["U_Password"]);
        $state = DB::table("user")->where(["U_Account" => $U_Account, "U_Password" => $U_Password])->first();
        if ($state) {
            Session::put("login", md5($U_Account . $U_Password));//添加一个服务器标识,如果服务器中存在login,则标识登陆
            Session::save();
            return redirect("/");
        } else {
            return view("user.login", ["state" => "登陆错误"]);
        }
    }}

我一直就这样使用,也没有去多想,但是我想给安卓写个客户端,保持登陆状态的时候,我就比较迷茫了,我如何来保持Session状态?服务器上保存了Session,那本地是如何告诉服务器我的浏览器或者安卓客户端是这个Session的主人?

显然,就算Session保存在服务端,本地依然需要保存一个文件,存储一个ID,来与服务器上的Session匹配。

如何存储呢,那又回归到cookie上了。

我们在本地存储一个cookie,存储了对应Session的ID,在我们浏览网页的时候,浏览器会自动地告诉服务器,我们本地有一个cookie,cookie里保存了一个session的ID,这样,我们就可以匹配session了。


同样的,我们在安卓里面要保持登陆状态,也可以采用Session机制。

Session的存储位置

1.文件存储

2.内存存储

3.数据库存储

许多网站在保持长久登陆的时候,采用了cookie的方式,但是用cookie的方式非常容易泄露一些信息,比如账号密码,就算本地保存的密码是md5等方式加密后的,依然带来很大的安全隐患,比如一些cookie存储了account,true,作为用户登陆成功的标志,那么我本地修改cookie,将account改成admin,就可以直接获取管理员的权限。

那么我们就可以采取将session存储到数据库的方法,本地存储一个cookie里面写了Session的ID。

如果用户更改了密码或者做了其他相关的操作,我们会在服务器的字段更改对应的数值,防止黑客的入侵。

在安卓中,我们可以采用Http Client中的cookie来保持临时的登陆状态,也可以将session id写入sharedpreference中,或者写入Sqlite中来保持用户的登陆状态。


声明:该文观点仅代表作者本人,入门客AI创业平台信息发布平台仅提供信息存储空间服务,如有疑问请联系rumenke@qq.com。