[关闭]
@nextleaf 2018-09-28T00:05:08.000000Z 字数 2073 阅读 981

2018-09-26 工作日志

Java JSP 监听器 验证码


监听器

生命周期监听器——监听域对象自身的创建和销毁的事件

ServletContextListener
ServletRequestListener
HttpSessionListener

属性操作监听器——监听ServletContext、HttpSession和ServletRequest这三个域对象中属性的创建、销毁和修改的事件

ServletContextAttributeListener
ServletRequestAttributeListener
HttpSessionAttributeListener

会话属性类监听器——监听绑定到HttpSession域中某个对象状态的事件

HttpSessionBindingListener(这种类型的监听器不用在web.xml中进行声明)
HttpSessionActivationListener

HttpSession中对象的状态有两种:绑定与解除绑定、钝化与活化;
绑定与解除绑定,就是指在HttpSession中将某个对象设置为属性值或者移除某个属性的值。而钝化是指服务器会将不常使用的Session对象暂时序列化到系统文件或数据库中,而活化就是将暂存在系统文件或数据库中的Session对象反序列化到服务器中

验证码

相关链接:[JSP——监听器篇][3]


问题

请求参数中文乱码问题

问题详情

数据库编码及其连接参数为UTF-8。
post提交req.getParameter("username").trim();取值中文时乱码,但req.setAttribute("ms", "中文中文");<%=request.getAttribute("ms")取值正常。

  1. //先解码,再编码
  2. new String(req.getParameter("username").trim().getBytes(StandardCharsets.ISO_8859_1), StandardCharsets.UTF_8);

问题分析

POST传来数据,Tomcat默认以ISO-8859-1编码(ISO-8859-1是不支持中文的)成单字节数据,若没有进行请求编码设置或重新编码操作,那么中文字符会在jsp页面中输出???,出现类似多个?形式的乱码现象

page指令用于定义JSP页面的各种属性

 contentType:文档类型
 pageEncoding:页面编码

  
get请求:
Tomcat8之后,get请求默认编码为utf-8,不需要进行重新编码。
(get请求参数编码受tomcat的URIEncoding参数影响)

meta中
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
当前面pageEncoding和contentType都没有设置的情况下,被解析成的html页面就会采用这种编码方式。

jsp页面中 pageEncoding--->contentType--->meta 默认缺省。pageEncoding写了后面的都可以不用写,默认继承。

response.getWriter().println可以看到这个编码设置的作用,但response编码格式设置对于使用request.setAttribute等传递数据不起作用。(为什么?)

关于request.setCharacterEncoding和response.setCharacterEncoding:

request.setCharacterEncoding("UTF-8")的作用是设置对客户端请求进行重新编码(解码)的编码。
该方法用来指定对浏览器发送来的数据进行重新编码(或者称为解码)时,使用的编码。对post方法有效

如果设置了response.setCharacterEncoding。那么就会按照这个编码格式传送到前端,浏览器并用这种方式(head中的content-type设置成response.setCharacterEncoding定义的编码格式)重新编码(解码);
如果没有显式设置的话,不管request的编码是什么,response的编码就是ISO-8859-1,等到了浏览器,发现response的信息header中没有相关编码设置,就会去取window系统的编码格式,中文系统默认为GBK/GB2312。

对post提交有影响:
response.setCharacterEncoding对post提交有影响,当没有对response.setCharacterEncoding设置的时候,值为null,则默认采用iso-8859-1来进行重新编码(解码)。
浏览器根据自己页面的编码格式作为起始编码格式,把字符进行编码成byte进行传输。如果response.getCharacterEncoding为null,那么默认采用iso-8859-1进行重新编码(解码)成字符,如果设置了,就按照设置的编码格式进行重新编码(解码)字符。

添加新批注
在作者公开此批注前,只有你和作者可见。
回复批注