JavaWeb中编码问题的解决办法(在客户端和服务器之间传入或响应数据后中文乱码; cookie的乱码问题) || Cookie和Session

在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也用不了了

 

posted @ 2021-08-23 16:40  nicholasm4  阅读(333)  评论(0编辑  收藏  举报