`
qzriso
  • 浏览: 242470 次
  • 性别: Icon_minigender_1
  • 来自: ph
社区版块
存档分类
最新评论

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

    博客分类:
  • php
阅读更多

    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了很久,没找到同类的问题和解决方案,故撰此文,以此志之。

分享到:
评论

相关推荐

    问题共享:修改oracle字符集

    通过对Oracle字符集的修改,我们可以有效解决多语言环境中数据处理的乱码问题,提升系统的国际化能力。然而,需要注意的是,字符集更改是一个较为复杂的过程,涉及到多个组件的一致性调整。因此,在实际操作中务必...

    笔试JSP1.doc

    字符集乱码问题是指在数据传输过程中,字符集的不一致导致的乱码问题。解决方法包括: * 指定字符集 * 使用 Unicode 字符集 * 进行字符集转换 10. doPost 和 doGet doPost 和 doGet 是两种不同的请求方式: * ...

    Net内置对象Session,Application等的用法和区别

    - **功能描述**:Session对象用于存储特定用户的会话数据,每个用户都有独立的数据集。当用户访问网站时,服务器为该用户创建一个唯一的SessionID,并将该ID通过Cookie发送到客户端,客户端在每次请求时都会附带这个...

    Application session cookies用法

    它可以存储大量数据,但也会显著增加页面大小,影响加载速度。因此,对于不需要在回发中保留状态的控件,应关闭ViewState以优化性能。例如,关闭整个页面的ViewState可以通过在 @Page 指令中设置 `EnableViewState=...

    使用dwr2.0实现服务器推客户端

    1. **字符编码过滤器**:通过`&lt;filter&gt;`元素定义了`SetCharacterEncodingFilter`,确保所有请求都使用UTF-8编码,避免字符集问题。 2. **ActionContextCleanUp Filter**:这是Struts2框架的一部分,用于清理...

    JSP页面语法

    charset=UTF-8"`:指定输出内容的MIME类型和字符集。 **四、脚本元素** 1. **脚本let**:`&lt;%= expression %&gt;`,将Java表达式的值输出到页面。 2. **声明**:`! declaration %&gt;`,声明变量或方法。 3. **表达式**:`...

    第5章 ASP.NET内置对象.ppt

    `Request.ApplicationPath` 返回虚拟应用程序的根路径,`Request.Browser` 提供关于用户浏览器的详细信息,而`Request.ContentEncoding` 揭示了页面的字符集。`Request.Url` 属性则包含了完整的请求 URL。`Request....

    页面显示验证码

    3. 安全性优化:可以考虑使用更复杂的验证码生成算法,增加字符集,调整字体、颜色和背景,甚至使用更安全的滑动或点击验证码。 总之,这个简单的验证码实现是一个基础的起点,展示了JSP和Servlet在Web开发中的基本...

    JSP页面简介

    - **contentType**:定义页面输出的内容类型和字符集编码,如`text/html;charset=utf-8`。 - **session**:指示是否为每个HTTP请求创建一个新的`HttpSession`实例。 - **buffer**:设置`out`对象的缓冲区大小。 -...

    JSP内置对象之域对象和JSP指令

    1. **`&lt;%@ page %&gt;`**: 用于定义整个JSP页面的属性,如语言类型、内容类型、字符集等。 - `language`: 指定JSP页面使用的脚本语言,默认是Java。 - `contentType`: 指定JSP页面的响应类型,如"text/html;charset=...

    实例详解JSP内置对象

    - pageContext对象是整个JSP页面的上下文,提供对所有其他JSP对象的访问,如request、response、session和application。它还允许在不同作用域(page、request、session和application)之间存储和检索数据。 8. **...

    ASP.Net内置对象的用法与区别

    Session对象的核心优势在于它能够为每个用户提供独立的存储空间,这样即使不同的用户访问同一个页面,他们各自的Session数据也是完全隔离的。这使得开发者可以在不同页面间保存用户输入的数据,而不必担心数据丢失或...

    JSP登录验证页面(doc)

    - 设置页面类型为`image/jpeg`,字符集为`gb2312`,以便正确显示中文和图片格式。 - 导入必要的Java库,包括绘图相关的库以及随机数生成库。 2. **生成随机颜色的方法`getRandColor`**: - 参数解释:`int fc`为...

    Asp验证码[6位验证字符长度](带示例演示)

    - `GenerateCode()`函数:这个函数需要生成6位的随机字符串,可以通过遍历字符集(如ASCII码)并选择一定数量的字符来实现。 - 图像生成:生成验证码的图像通常需要使用GDI+或第三方库,将随机字符串转化为像素并...

    ASP.NET7大内置对象

    - **Charset**: 获取或设置输出流的 HTTP 字符集。此属性用于指定响应的字符编码方式,比如 UTF-8 或 GB2312。 - **IsClientConnected**: 获取一个布尔值,指示客户端是否仍然与服务器保持连接状态。如果客户端已经...

    php练手小项目

    1. 字符集:理解ASCII、UTF-8、GBK等字符集的区别,以及它们对多语言支持的影响。 2. 编码转换:学习使用PHP的iconv或mb_convert_encoding函数进行编码转换。 3. HTTP头设置:通过header函数设置Content-Type来指定...

    jsp试题答案(很好哦)

    * jsp的内置对象request的主要作用是获取用户传入的参数,response对象的主要作用是设置客户端输出信息的字符集、重定向客户端的请求添加Cookie等。 二、jsp编程基础 * jsp中的动态INCLUDE和静态INCLUDE的区别:...

    简单的登陆代码

    字符集设置 在JSP页面的开头,使用`;charset=gb2312" %&gt; `设置页面的字符编码为GB2312。这有助于确保中文字符能够正确显示。 综上所述,这段代码展示了如何在JSP中实现基本的用户登录功能,包括使用session进行...

    JSP面试题--基础

    - **pageEncoding**:指定 JSP 页面编码,用于编译 JSP 时的字符集。 - **contentType**:指定 JSP 页面生成的内容类型及字符编码,用于 HTTP 响应头。 #### 13. JSP 内置对象及其作用 JSP 提供了以下内置对象: -...

Global site tag (gtag.js) - Google Analytics