在JavaWeb中,解决中文编码这个问题总结下来一共有有两处
1.在Get或者Post请求中, 携带有中文的时候可能会造成乱码问题
在Tomcat中,对于POST和GET请求,都默认才有的ISO-8859-1的编码方式.而该ISO-8859-1不支持中文,所以乱码. -------------------------------------------------------------------- 解决方案: 1:按照ISO-8859-1把乱码恢复成二进制形式 byte[] data=username.getBytes("ISO-8859-1"); 2:再把二进制形式的数据使用UTF-8重新编码 String username = new String(data,"UTF-8"); -------------------------------------------------------------------- 但是同样上述代码也有一个问题, 获取一个参数的时候需要使用两行代码来转码,如果现在需要获取N个参数,那么就需要转N次,出现了代码重复的严重问题. 解决方案: 针对于POST请求方式: request.setCharacterEncoding("UTF-8"); 注意:1:只对POST有效,2:必须放在获取任意参数之前.
针对于GET请求方式: 修改Tocmcat中的server.xml配置文件中修改端口的元素,对GET方式的默认编码.在开发中, 我们很少会用到并且不建议去修改Tomcat服务器的server.xml配置文件, 因为我们很少会用Get方式传递中文
2.对Cookie的操作的时候,我们常常也会遇到中文乱码的问题
下面是对Cookie常用操作的复习与回顾, 按照这个思路来说明下中文乱码的问题
我们常见的Cookie的操作: 1:创建Cookie对象. Cookie cookie = new Cookie(String name,String value); 参数: name: 该当前Cookie取一个唯一的名字. value: 存储在Cookie的共享数据,只能是String类型. Cookie cookie = new Cookie("currentName","will"); 2:把Cookie放入响应中,响应给浏览器,把共享的数据存储在浏览器中. response.addCookie(cookie); 3:获取Cookie以及获取Cookie中的数据. 因为Cookie是客户端技术,并且每一次请求都会携带,因此是存放在请求头中,所以应该通过request去获取. Cookie[] cs = req.getCookies(); 获取当前Cookie的名字: String name = cookie对象.getName(); 获取当前Cookie的值: String value= cookie对象.getValue(); 4:Cookie的中文问题. 在Cookie中属性名和属性值都不能使用中文.
5:修改Cookie中指定属性名的属性值.
需求:修改Cookie cookie = new Cookie("currentName","will");
方式1:创建一个同名的新的Cookie.
Cookie c = new Cookie("currentName","Lucy");
方式2:获取该Cookie对象,通过setValue方法,重新设置新的value值.
Cookie对象.setValue("新的值");
注意:别忘了,重新把该Cookie放入响应中:resp.addCookie(c);
6:Cookie的分类(会话Cookie和持久化Cookie):
会话Cookie: 关闭浏览器之后,Cookie就销毁了. 缺省情况.
持久化Cookie: Cookie可以保存指定的时间段(3天,一周,一个月).
设置Cookie的最大存活时间: cookie对象.setMaxAge(int seconds);
seconds == 0: 删除Cookie.
seconds < 0: 会话Cookie.
seconds > 0: 存储指定的秒数
7:删除Cookie: cookie对象.setMaxAge(0);
附:对session的复习
上面提到Cookie的使用, 可以得知Cookie的问题和需要改进的地方
Cookie的缺陷: 1):多个人使用同一台电脑的时候,可以查看浏览器的Cookie,不安全. 2):Cookie存储中文比较麻烦(得编码,再解码). 3):Cookie的value是String类型,一个Cookie就只能存储一个数据,如果需要存储多个数据,就得死还有N个Cookie. 4):一个站点对Cookie有限制: Cookie大小限制在4KB之内; 一台服务器在一个客户端最多保存20个Cookie; 一个浏览器最多可以保存300个Cookie; 5):在设计上就有问题,考虑生活中问题. Cookie是浏览器和服务器之间数据交互的凭证. 在生活中,我们是把识别数据存储到服务端. -------------------------->Session.
因此, 引出了session的技术, 值得注意的是:
Session是服务器端技术,利用这个技术,服务器在运行时可以为每一个用户的浏览器创建一个其独享的session对象,
由于session为用户浏览器独享,所以用户在访问服务器的web资源时,可以把各自的数据放在各自的session中,当用户再去访问服务器中的其它web资源时,
其它web资源再从用户各自的session中取出数据为用户服务
注意: Session其本质就是一个会话Cookie(浏览器关闭之后,Session就失效了).
对比下两种技术的原理图, 就可以看出他们其中的差异
该图为Cookie的原理图
==============================================================================================================================
该图为Session的原理图
Session的操作: 1:创建和获取Session对象. HttpSession session = request.getSession(true);如果当前请求中存在一个Session对象,就直接返回,如果不存在Session对象,就先创建一个再返回. HttpSession session = request.getSession(false);如果当前请求中存在一个Session对象,就直接返回,如果不存在Session对象,就返回null. HttpSession session = request.getSession();等价于HttpSession session = request.getSession(true); 2:往Session中存储数据. session对象.setAttribute(String name,Object value); 3:从Session中取出数据. Object value = session对象.getAttribute(String key); 4:删除Session(用户注销登陆). 1):删除Session中指定属性名的值. session对象.removeAttrbute("currentName"); 2):销毁Session对象(Session中所有的属性都不存在). session对象.invalidate(); 5.Session的超时管理 在超时时间之内,如果客户端和服务端没有交互(用户的两次操作之间不能超过该时间),则自动的销毁Session. session对象.setMaxInactiveInterval(60 * 10);//超过10分钟,销毁Session. Tomcat服务器的默认超时时间为:30分钟,Tomcat一般在20多分钟就销毁了. 6.URL重写. Session是一种特殊的Cookie,而浏览器可以禁用Cookie. 此时,需要在每一个资源之后,手动的携带session的ID: /session/list;jsessionid=872870F9466CE7B3A11FD3B768FDD684 但是我们手动来拼接session的ID的话,一个可以,要是每一个资源都需要拼接这一段的话, 属实是是一个没有技术含量的活,因此在 response 里面有一个方法用于拼接jsessionid的。 String url = response.encodeURL("/session/list");自动的在资源之后拼接;jsessionid=872870F9466CE7B3A11FD3B768FDD684 注意:开发中都不会取消接受Cookie的. Session的细节: 1:一般的,我们存储到Session中的属性名称,要唯一,我们习惯XXX_IN_SESSION: session对象.setAttribute("USER_IN_SESSION","will"); 2:若需要把多个数据存放到Session中,就得调用setAttribute方法N次,可以的. 一般的,我们把需要存储的数据,封装成一个对象,然后在存储到Session中. 把用户的信息,封装到user对象. session对象.setAttribute("USER_IN_SESSION",user对象); 3:如果多台服务器之间需要共享Session,此时Session中的对象,必须实现java.io.Serializable(才能在网络上传输). 序 列 化: 把对象信息存储为二进制. 反序列化: 把二进制信息恢复成对象. public class User implements java.io.Serializable{....} 注: 如果浏览器禁用Cookie的话, 那么Session也用不了了