Servlet中文乱码和回话跟踪.ppt
第二卷Web组件-1(Servlet),Servlet中文乱码和会话跟踪,2,回顾,Servlet 使用户可以在服务器上运行 Java 代码和生成动态内容HTTP Servlet 发送 HTTP 请求和接受 HTTP 响应Servlet 生命周期由三种方法组成,即 init()、service()和 destroy()Servlet API 包含于两个包中,分别为 javax.servlet 和 javax.servlet.httpServlet 继承 GenericServlet 类或 HttpServlet 类。利用Eclipse平台 开发Servlet,3,目标,Servlet中文乱码定义会话跟踪创建会话标识会话跟踪技术,中文乱码,在Servlet中,经常会有这样一行代码 request.setCharacterEncoding(“GBK”);这行代码的作用就是避免Servlet响应页面中出现中文乱码的问题。为什么会产生乱码?不同的组件有自己默认的字符编码集。当编码和解码的字符集不一致,就容易产生乱码问题。中文IE默认的编码格式是“GB2312”Tomcat默认的编码格式“iso-8859-1”weblogic默认的编码格式“UTF-8”JAVA源文件编译为class文件时的字符集,默认为操作系统的字符集,但在IDE中可以改变。,中文乱码解决办法,整个系统从开发到运行使用统一的字符编码集开发应用程序的IDE工具设置。开发所使用的容器的配置文件的设置。请求处理方式的设置响应处理方式的设置存取数据库时的设置最好选择以下其中一种进行统一Iso-8859-1GBK(GB2312)UTF-8(支持所有语言),中文乱码解决办法,IDE 开发环境(MyEclipse)中,设置字符集,中文乱码解决办法,开发中所使用容器的配置文件的设置,例如修改weblogic容器中的weblogic.xml配置文件,在部分加入:compilerSupportsEncodingtrue encoding GBK,中文乱码解决办法,响应处理方式中的设置在Servlet中加入JSP中加入:,中文乱码解决办法,请求处理方式中的设置对于POST请求:request.setCharacterEncoding(“GBK”)对于GET请求:String info=request.getParameter(information);String newinfo=new String(info.getBytes(utf-8),GBK);,中文乱码解决办法,存取数据库时的设置,11,有必要保持同一客户的会话(会话跟踪),会话跟踪,保持客户端状态 Internet 协议两种类型:有状态:Telnet、FTP;无状态:Http(服务器一旦响应完客户的请求之后,断开其之间网络连接,该客户下次请求将重新建立网络连接,服务器判断是否为同一个客户发出请求),12,会话跟踪,请求 1,请求 2,请求 n,.,服务器将唯一的会话 ID 分配给客户端以跟踪用户,13,会话如何工作,beer网上交易平台,客户端A,ServletA,请求Dark beer单价?,请求1,线程A,HttpSessionA,SetAttribute(),线程发现与客户A的会话,把他的选择Darkbeer作为一个属性保存在HttpSessionA会话中,响应15,响应15,请求Expensive,线程B,请求2,线程找到该会话,把Expensive作为一个属性保存会话中,响应15 off8,响应15 off8,客户端B,线程C,请求Polo beer单价?,请求3,HttpSessionB,SetAttribute(),线程为客户B开始一个新会话,并保存Polo beer,响应12,响应12,发现:容器会为每一个客户端维护一个单独的HttpSession对象,ServletA,14,问题,容器怎么知道客户是谁?因为Http协议无状态,对同一客户所发出的每次请求对容器而言都是一个新的客户。答案 客户需要一个唯一的会话ID 即:对客户的第一次请求,容器会生成一个唯一的会话ID,并通过响应把它返回给客户;客户再在以后的每一个请求中发回这个会话ID,容器看到ID后,就会找匹配的会话,并把这个会话与请求关联。,15,会话跟踪,请求1 Darkbeer,请求 2 Blackbeer ID#42,.,Hi,Server,这是我的第一个请求,参数是Darkbeer,我们可以开始一个会话吗?,好,但是我很健忘,可能记不得你,所以给你一个唯一的ID,每次你发送请求时一定把它交还给我,这样我就知道那是你了,ID#42,new SessionID#42,SetAttribute(Darkbeer),响应 ID#42,让我看看,#42哦有你,对了我现在想起来你是谁了,上一次你说你喜欢Darkbeer,SetAttribute(Blackbeer),响应,16,创建会话,创建会话对象HttpSession 若发来的请求中无会话ID,容器创建新会话;若发来的请求中有会话ID,无需创建新会话,找到相关的会话ID。,HttpServletRequest 的 getSession()方法用于获取或创建会话,其语法如下:,public HttpSession getSession();public HttpSession getSession(boolean value);,如果没有与当前请求关联的会话,则 getSession()方法用于创建会话。,如果布尔值为 true 且当前没有与请求关联的会话,则使用 getSession(boolean value)创建会话。如果布尔值为 false,如果没有与当前请求关联的会话,返回null。,17,示例,创建会话对象,要求判断会话是已经存在,还是刚刚创建。,18,运行,重新刷新请求,19,会话跟踪技术,会话跟踪技术,隐藏表单域,URL 重写,Cookie,以下是各种会话跟踪技术:,20,隐藏表单域,将会话信息保存在隐藏域中,但是不会显示在客户端浏览器中,在 GET 和 POST 方法中指定用于存储有关会话消息的名称和值。,21,会话跟踪实例-1,22,运行,23,URL 重写,如果客户不接受cookie,可以把URL重写作为一条后路,即使用HttpServletResponse对象的encodURL方法把服务器端生成的会话ID传到客户端,客户端下次请求时,显示包含会话ID的信息发送到服务器 URL+;jsessionid=会话ID注意:容器一般先会使用cookie来完成会话管理,只有当cookie方法失败时,显示地URL编码才起作用(URL重写自动发生)静态页面不能URL重写,24,会话跟踪实例-2,getContextPath()返回上下文路径,encodeURL()将字符串转换为 URL 路径,25,运行,26,Cookie-1,容器必须以某种方式把会话ID作为响应的一部分交给客户,而客户必须把会话ID作为请求的一部分发回。最常用的方式是通过cookie交换这个会话ID信息。Cookie 用于存储 Web 服务器发送给客户端的信息。服务器通过设置响应标题中的 Set-Cookie 方法来发送 cookie。其语法如下:在响应中发送一个会话cookie(name=value)HttpSession session=request.getSession();该方法不只是创建一个会话,在请求上第一次调用该方法时,会导致响应发 一个cookie;客户端将接收并保存该cookie,客户端每次访问该服务器上的页 时,会将cookie发回到服务器注)cookie与会话的寿命一样长,一旦客户离开浏览器,cookie就会消失,但可以设置cookie在客户端上待得更久一些,甚至在浏览器关闭之后还持久保存,Set-Cookie:Name=VALUE;Comment=COMMENT;Domain=DOMAINNAME;Max-age=SECONDS;Path=PATH;secure;,27,Cookie-2,javax.servlet.http.cookies 包提供由 Cookie 类实现的多种方法,public int getMaxAge();,返回Cookie 的最大保存时间,public void setMaxAge(int age);,设置 cookie 的最大生命周期(以秒表示),28,会话跟踪实例-3,29,总结,中文乱码的处理方法定义会话跟踪创建会话标识会话跟踪技术,