1、设置php.ini中的session.use_trans_sid = 1或者编译时打开打开了--enable-trans-sid选项,让PHP自动跨页传递session id。当session.use_trans_sid为有效时,ession.use_only_cookies一定要设置为无效0。
2、手动通过URL传值、隐藏表单传递session id。
3、用文件、数据库等形式保存session_id,在跨页过程中手动调用。
PHP也提供一个函数:
复制代码 代码如下:
output_add_rewrite_var ( string $name , string $value ) # 变量名 变量值
说明:此函数给URL重写机制添加名/值对。 这种名值对将被添加到URL(以GET参数的形式)和表单(以input隐藏域的形式),当透明URL重写用 session.use_trans_sid 开启时同样可以添加到session ID。 要注意,绝对URL()不能被重写。此函数的行为由url_rewriter.tags php.ini 参数控制。
复制代码 代码如下:
<?
session_start();
output_add_rewrite_var('PHPSESSID',session_id ());
echo '<a href="https://www.jb51.net/demo2.php">demo</a>';
?>
这样sessionID会跟在URL后面而且from中会出现sessionID的hidden值。
改变session客户端ID保存方式:
session.use_cookies //控制客户端保存SessionID时使用哪一种方式,当它为“1”时,就说明启动了session cookie(初始值为1)
可以使用上面我们提到的函数来查询得到目前的session id:echo $_COOKIE["PHPSESSID"];
但是,如果client的浏览器不支持cookie的话,即使session.use_cookies这个参数的值等于“1”,用上述的查询也只会得到null。
php.ini中两个和该选项相关的配置参数:
复制代码 代码如下:
session.use_cookies = 1 //是否使用cookies(默认值为1)
session.use_only_cookies=1 //为1时只使用cookie;为0时可使用cookie和其它方式,这时如果客户端cookie可用,则session还是默认用cookie(默认值为1)
注意:如果客户的浏览器是支持cookie的,强烈推荐“session.use_only_cookies = 1”,当session.use_only_cookies为有效时,即使想通过URL来传递session id也会被认为无效,这样可以减少通过sessionid被攻击的可能性。上面两个配置,在php代码页面中设置方式:
复制代码 代码如下:
ini_set('session.use_cookies','1');
ini_set('session.use_only_cookies','1');
IE下丢失session,每次刷新页面,都会生成新的sessionID(Firefox浏览器都正常)
如果你的服务器或站点出现这种问题,请正确配置session.cookie_path网站域,如果配置错误可能会引起以下常见故障:
(1)客户端的每个PHPSESSID在服务器端都会一对一的对应生成一个独立的session记录存储在服务器端,故服务器端session文件冗余将会增多(GC回收机制异常时、站点访问量较大时)
(2)使用session记录相关信息的站点可能在除Firefox(Chrome未测试)之外的浏览器下访问出现问题,例如:购物车无法记录选购项目、站点登录失败等
复制代码 代码如下:
session.cookie_path 是指 session 生效的网站域;
session.save_path 是指存储 session 临时文件的路径。
例如:session.cookie_path= / //cookie的有效路径
补充:如果所有浏览器访问刷新产生新sessionID,请检查客户端是否禁用了cookie。
session简单实例
使用session防止表单重复提交:
复制代码 代码如下:
<?php
session_start();
$_SESSION["num"] = 0;
if(isset($_POST["action"] && $_POST["action"]=="post")){
if($_SESSION["num"] == 0){
echo "提交成功!";
$_SESSION["num"] = 1;
}else{
echo "请勿重复提交!";
}
}
?>
使用session方式的登录验证实例代码:
复制代码 代码如下:
<?php
session_start();//启动session,必须放在第一句,否则会出错。
if($_GET['out']){
unset($_SESSION['id']);
unset($_SESSION['pass']);
}
if($_POST['name']&&$_POST['password']){
<span><span>//用于设置session</span></span>
$_SESSION['id']=$_POST['name'];
$_SESSION['pass']=$_POST['password'];
}
if($_SESSION['id']&&$_SESSION['pass']){
echo "登录成功!
用户ID:".$_SESSION['id']."<br />用户密码:".$_SESSION['pass'];
echo "<br />";
echo "<a href='login.php?out=out'>注销session</a>";
}
?>
<form action="login.php" method="post">
用户ID:<input type="text" />
密码:<input type="password" />
<br />
<input type="submit">
</form>
使用cookie方式的登录验证实例代码:
复制代码 代码如下: