0x01 前言
今天在对daloRADIUS的登录页和逻辑进行梳理,深深感到PHP的伟大与快捷。虽然我喜欢的是Python,但也被PHP深深地吸引住了。
其实今天我主要解决两个问题一个是选择列表(<select> 标签)的跳转与传值,另一个是session的写入问题。很多时间我都用来梳理愿编写者所写的逻辑,其实上述问题一点都不难!
0x02 选择列表的跳转与传值
0x02.1 构建列表
代码很简单,这是一个语言选择列表,如下:
<select class="form-control"> <option value="en_US"> English (United States) </option> <option value="zh_CN"> Chinese (PRC) </option> </select>
0x02.2 传值
因为需要将用户选择的语言写入到session,所欲需要跟随用户名和密码一起传送到下一步,HTML代码如下:
/* action 指定提交表单后对提交内容进行处理的脚本位置 method 指定数据提交的方式 name 规定表单的名称,如果你需要传值,通过PHP或其他语言获取内容,就需要定义name value 传送到处理脚本的值 */ <form action="dologin.php" method="post"> <select name="locale"> <option value="en_US"> English (United States) </option> <option value="zh_CN"> Chinese (PRC) </option> </select> <button type="submit"> Sign in </button> </form>
有了前端HTML用来给用户选取,还需要后端的PHP脚本来处理用户提交的内容,脚本如下:
//获取值,可能是en_US,也有可能是zh_CN。 $_POST["locale"] //将值赋予变量$locale,方便后续使用 $locale = $_POST["locale"];
0x02.3 跳转
其实传值是基础的一步,然而默认语言是英语,用户首次打开页面时还没对语言作出选择,也没有语言记录的session信息,一般用户会选择自己熟悉的语言(若需要的语言存在)。选择之后的文字并不会自动更新,需要自动或手动刷新。既然要刷新,为什么不自动刷新呢?
我并不熟悉JS,经过一个下午的摸索,终于明白了其中的奥妙,代码如下:
<script type="text/javascript"> //定义函数名 function gotolocale() { /* 定义变量locale document 接口对 DOM Document 接口进行了扩展,定义 HTML 专用的属性和方法; .getElementById 是 document 对象方法; value 是对象的值. */ //下面这句的意思是:获取第一个id名为locale对象的值,并将值赋予locale var locale = document.getElementById("locale").value; /* window 对象表示一个浏览器窗口或一个框架; location 是 window 对象方法; href 是 location 的属性 "?locale=" 是一段字符串,双引号内的内容将完整输出 + 将前后两段内容接合 locale 是上面所定义的变量locale */ //下面这句的意思是:将浏览器窗口(当前的)重定向至 ?locale=[变量locale] //地址可能是: foo.com/index.php?locale=zh_CN window.location.href = "?locale=" + locale; } </script> /* id 给列表赋予一个id,方便JS调用 onChange 监测列表的更改,一旦更改则调用gotolocale()函数 */ <form action="dologin.php" method="post"> <select name="locale" id="locale" onChange="gotolocale()"> <option value="en_US"> English (United States) </option> <option value="zh_CN"> Chinese (PRC) </option> </select> <button type="submit"> Sign in </button> </form>
这真的是很奇妙,当用户选择非默认的语言时,onChange 会监测到选项的改变而调用gotolocale() 函数。
gotolocale()函数是JavaScript,通过调用JS的一系列对象与属性,自动获取列表中的值,并通过编写好的格式构造链接,然后自动刷新浏览器当前的窗口。
真是太奇妙了!
其实JS和其他很多语言都类似,例如:window.location.href,window是一个函数,而location是他的一个实现方式或属性,同样的href也是location的一个实现方式或属性。
而这和Python太像了!
0x03 PHP session 的写入
其实将一个值写入session并不复杂,难得是怎样建立一个独一无二的session,代码如下:
//获取用户的IP地址 $REMOTE_ADDR = $_SERVER['REMOTE_ADDR']; //产生一个1到9的随机整数,包括1和9 $rand = rand(1, 9); //substr是获得字符串的子串, // substr(md5($REMOTE_ADDR), 0, 11 + $rand)的意思是: // 将远程用户的IP地址进行MD5计算,并截取从第一个字符开始到[11+$rand]这一段字符串 // 例如:$rand = 8, 用户IP是:1.1.1.1 ,那么IP的MD5是:e086aa137fa19f67d27b39d0eca18610, // 那么下面的substr就是截取上面MD5的第1位字符到第20位字符的内容,注意第一位字符是0! //下面这一整句的意思是:随机数与substr所截取的字符串相结合并赋予变量session_id $session_id = $rand . substr(md5($REMOTE_ADDR), 0, 11 + $rand); //session_id()不但可以获取当前的session id,还可以将值赋予session_id session_id($session_id); //启动新会话或者重用现有会话 session_start(); //从上面所提交的内容里获取语言,zh_CN 或en_US $locale = $_POST["locale"]; //在当前session建立一个名为locale的区域,并将语言的值赋予session的locale $_SESSION['locale'] = $locale;
0x04 结语
这一切都很有趣,无论是写代码还是探索的过程,都能让你进步。有问题给我留言,我会尽可能为你解答。