客户端页面字符集对session的影响

    session是使用在服务端的,跟客户端的页面字符集怎么会扯上关系呢?这多少会让人有些困惑。不过若从session的工作原理来理解的话,就容易明白了。关于session的工作原理,请参考http://wen5566.blog.51cto.com/1040211/563107

    假设用户从页面A输入用户名和密码,然后提交到页面B对用户名和密码进行验证,如果通过验证,则把用户名存入session中,然后再重定向到页面C。页面C需要判断用户是否已经登录,如果没有,则拒绝访问。在我开发的一个网站中,页面B的代码如下:

  print "<meta http-equiv='Content-Type' content='text/html; charset=gb2312'>";

  ......

  session_start();
  $_SESSION['username']=$username;
  print "<script>window.location='course.php'</script>";

为什么有print "<meta http-equiv='Content-Type' content='text/html; charset=gb2312'>";这句呢,主要是为了避免给国外的用户访问时会出现乱码。页面C检测用户是否登录的代码如下:
session_start();
if($_SESSION['username']=="")
{
   print "<script><meta http-equiv='Content-Type' content='text/html; charset=gb2312'>;alert('Please log in first, thank you!');window.location='../index.php'</script>"; 
   exit;
}

这样用户每次都得登录两次才能登录成功,是什么问题会造成这种情况呢?排查了一个上午,终于发现了问题所在,就是<meta http-equiv='Content-Type' content='text/html; charset=gb2312'>这个搞的鬼,造成页面B保存session和页面C读取session不一致,最根本的原因就是<meta http-equiv='Content-Type' content='text/html; charset=gb2312'>会对保存在客户端cookie中的PHPSESSID编码产生影响。解决方案就是每个页面写入读取session前客户端页面编码也要一致。对于我这边,只要把页面C的代码调整为如下即可:

print "<meta http-equiv='Content-Type' content='text/html; charset=gb2312'>";
session_start();
if($_SESSION['username']=="")
{
   print "<script>alert('Please log in first, thank you!');window.location='../index.php'</script>"; 
   exit;
}

    问题特殊,google了很久,没找到同类的问题和解决方案,故撰此文,以此志之。

展开阅读全文

tomcat的配置和对session影响的问题

10-09

遇到一个很奇怪的问题(本人初学者,请大虾们指导)rn1、最开始发现session失效了:我在index.jsp中设置了session值,[code=Java]session.setAttribute("user","test");[/code]rn然后再后面的login_confirm。.jsp页面中可以取得user的值为test。但是从login_confirm.jsp跳转到另一个文件夹下的下一个页面main\main.jsp时所取得的user的值为空,并且由session.getId()得到session的id的值也发生了变化。rn2、上面的第一个页面我是这么进入的:index.jsp是在我在tomcat中设置的一个虚拟主机的根目录下,所以直接在地址栏中输入虚拟主机的名称(www.reuse.con)打开的index.jsp。就出现了上面的问题。rn随后我做了一个测试,在虚拟主机www.reuse.com的根目录下面新建了一个目录ex,然后把上面三个页面index.jsp,login_confirm.jsp和main\main.jsp复制到了虚拟目录所对应的真实目录下面,在地址栏中输入:www.***.com/ex/index.jsp 打开index.jsp后,进行1中的操作,就没有出现session为空的问题,就算是跳转到第四个页面(测试的第四个页面包含frameset和iframe)也没的问题。rntomcat中conf/server.xml中的配置如下:rn[code=XML]rnrn rn rn rn rn rn[/code]rnindex.jsprn[code=Java]rn<%@ page contentType="text/html; charset=gb2312" language="java" import="java.util.*,java.io.*,java.lang.*" errorPage="" %>rnrnrnrn rnrnrn<%rn session.setAttribute("user","test");rn%>rn<%rn String sstr = (String)session.getAttribute("user");rn out.print(" ");rn sstr = (String)session.getId();rn out.print(" ");rn%>rn进入login_confirm.jsprnrn[/code]rnlogin_confirm.jsprn[code=Java]rn<%@ page language="java" import="java.util.*" import="java.io.*" pageEncoding="gb2312"%>rn rn rn rn rn<%rn String sstr = (String)session.getAttribute("user");rn out.print(" ");rn sstr = (String)session.getId();rn out.print(" ");rn%>rn进入main.jsprn rn rn[/code]rnmain.jsprn[code=Java]rn<%@ page language="java" import="java.util.*" import="java.io.*" pageEncoding="gb2312"%>rn rn rn rn rn<%rn String sstr = (String)session.getAttribute("user");rn out.print(" ");rn sstr = (String)session.getId();rn out.print(" ");rn%>rn进入main.jsprn rn rn[/code] 论坛

没有更多推荐了,返回首页