《黑马程序员javaweb教程:Tomcat中编码问题》由会员分享,可在线阅读,更多相关《黑马程序员javaweb教程:Tomcat中编码问题(8页珍藏版)》请在金锄头文库上搜索。
1、持皆摘喜甥下 高苗IT教育品牌Tomcat中编码问题1 Tomcat 中编码问题总结编码问题会出现在:页面中的乱码; POST参数乱码; GET 参数乱码;2 页面中编码处理页面中的中文编码处理方式: 把项目编码设置为 UTF-8 ;在页面中设置 或者 。无论是 ,还是 。都会在响应页面时,给客户端浏览器发送contentType响应头信息,告诉客户端浏览器 当前页面使用的是UTF-8编码。只要你的页面使用的编码,与发送给浏览器的contentType中的编码一致,那么就不会 出现页面乱码问题。客户端浏览器会使用contentType中给定的编码来显示页面!3 POST 参数编码处理POST编
2、码问题!我们知道,请求信息中,只有POST存在正文,所谓POST参数编码就是就是请求正文 的编码。默认情况下,使用getParameter()获取POST请求参数时,使用的是ISO-8859-1编码。String name = request.getParameter(name);name = new String(name.getBytes(ISO-8859-1),UTF-8);System.out .println(name);因为在获取参数时已经被错误的编码了,但因为我们知道,乱码的两个原因:本来是使 用UTF-8编码的,还错误的使用了 ISO-8859-1编码。所以我们可以先使用ISO
3、-8859-1获取字 节数组,然后再使用正确的UTF-8编码得到字符串,这样就没问题了。request的setCharacterEncodng()可以设置编码,当然这必须在调用所有的getParameter() 方法之前调用request的setCharacterEncodng()方法来设置编码,这样,就不会使用ISO解读 字节串了,而是使用你给定的编码来解读。request.setCharacterEncoding(UTF-8);传胃n客期下 鬲筑IT教育品幌String name = request.getParameter(name);System.out.println(name);对
4、于每个请求,只需要调用request的setCharacterEncodng() 次,然后所有 getParameter()都会使用这个编码来解读参数。但要注意,只对请求正文有效,即POST参数。4 GET 参数编码GET参数不在请求正文中,而是在URL中。所以不能使用request的setCharacterEncodng() 来设置GET参数的编码。处理GET参数编码可以有两种方式:第一种是设置Connector元素的URIEncoding属性 的值为 UTF-8。即 confserver.xml 中的Connector元素的 URIEncoding 属性。Connec七口匸 port=rr
5、0O FF pro七口心口丄二HTTF/J. 丄”connecnTiirLeout= rr20000 rr redirectP rt= rr0443 rr UR工UTFB ” /一旦设置了这个属性,那么对于GET参数就直接是UTF-8编码的了。但是,Connector 元素来说,对整个 Tomcat 都是有效的!也许将来你的项目与其他人的项目使用同一个 Tomcat,而其他人的项目不想使用UTF-8编码,那么就不方便了。所以这种处理GET参数编 码的方式是不可取的。那么另一种方式就是自己来把编码还原了。这种方式也是我们今后处理的方式。String name = request.getParam
6、eter(name);name = new String(name.getBytes(ISO-8859-1),UTF-8);System.out.println(name);5 浏览器地址栏编码如果你直接通过IE地址栏中给出URL,而不是通过超链接方法服务器。而且在URL中 给出了请求参数,那么这个参数是GBK编码的。空 http:/ / localhost/ encoding/ EncodingServlet ?name=三你好吗-Windows Internet Explorer目ht三你好吗这个地址栏中的URL是我直接输入的,而不是通过点击超链接访问的,这个参数的编 码就是 OS 默认编
7、码 GBK 。没有办法处理这问题,因为在页面中使用的是UTF-8编码,那么Servlet需要使用UTF-8 来解码。但如果用户在地址栏中直接输入URL,那么就是GBK。这时我们的Servlet真是不 知道使用什么编码才好了。但直接在地址栏中根本就不应该直接输入带有参数的URL。注意,这里说的是地址栏中直接输入URL,而不是点击超链接。因为超链接中的URL 是受页面的编码控制的。6 垃圾的 IE6 对 UTF-8 不友好IE6对UTF-8不是很友好!它会把两个字节当成一个中文来处理,当字节数为奇数时, 那么就最后一个字节就会丢失。例如我们的GET参数是“大家好”对于UTF-8编码而言,鶴胃摘喜鎭
8、下 高超IT數育品牌它就是9个字节,因为中文在UTF-8编码中3个字节,三个汉字对应9个字节。IE6认为2 个字节是一个汉字,那么最后一个字节不会发送到服务器端,IE6很不安全。7 JavaScript对超链接做URL编码处理这个问题的办法是把GET请求中的参数使用JavaScript做URL编码,URL编码后的 内容就不再是中文了,这样IE6也就不会丢失字节了。Encoding function _go()location.href = encodeURI(EncodingServlet?name=大家好); http:/localhost/encoding/EncodingServlet?
9、name=%E5%A4%A7%E5%AE%B6%E5%A5%BD在使用URL编码后,大家好已经变成了E5%A4%A7%E5%AE%B6%E5%A5%BD。这样就 不会再丢失字节了。生成验证码1 验证码有啥用在我们注册时,如果没有验证码的话,我们可以使用URLConnection来写一段代码发出 注册请求。甚至可以使用while(true)来测试!那么服务器就废了!验证码可以去识别发出请求的是人还是程序!当然,如果聪明的程序可以去分析验证码 图片!但分析图片也不是一件容易的事,因为一般验证码图片都会带有干扰线,人都看不清, 那么程序一定分析不出来。2 使用 Java 生成图片BufferedIm
10、age image = new BufferedImage(60, 30, BufferedImage.TYPE_INT_RGB);Graphics g = image.getGraphics();String s = hello;g.drawString(s, 0, 30);FileOutputStream out = new FileOutputStream(F:a.jpg);ImageIO.write(image, JPEG, out);Ihnlln背景默认是黑色的,前景默认是白色的,字号太小等等吧,反正这不是我们想要的。但是我们已经可以画图片了!3分析验证码的要求 验证码的内容是随机的
11、,通常在26个字母(包含大小写)和数据(09); 每个字符的颜色是随机的(这个还真有点难,万一颜色与背景相同呢?) 每个字符的字体是随机的(需要给出枚举列表); 每个字符的字号是随机的(需要给出大小的范围,不能小到看不见吧!); 每个字符的样式是随机的(样式只有4种); 需要添加一些干扰线。4 我们写个类吧这个类会创建70 * 35的图片; 背景色为(240, 240, 240),不要太白了! 可以随机生成字符,但在给定的字符范围之内; 可以随机生成字体名,但在给定的字体名范围之内; 可以随机生成字号,大小也在范围之内,例如(24 27)之间 可以随机生成颜色;可以随机画干扰线。public
12、class VerifyCode private int w = 70;private int h = 35;private Random r = new Random();private String fontNames = 宋体,华文楷体,黑体,华文新魏,华文隶 书,微软雅黑,楷体_GB2312;private String codes =012 34 5 67 8 9abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ;private Color bgColor = new Color(240, 240, 240);private St
13、ring text;private Color randomColor() return null;private Font randomFont() return null;private void drawLine(BufferedImage image) private char randomChar() return 0;private Bufferedlmage createImage() return null;public Bufferedlmage getImage() Bufferedlmage image = createImage();Graphics2D g2 = (G
14、raphics2D)image.getGraphics();StringBuilder sb = new StringBuilder();/向图片中画4个字符for(int i = 0; i 4; i+)String s = randomChar() + ;sb.append(s);float x = i * 1.0F * w / 4;g2.setFont(randomFont();g2.setColor(randomColor(); g2.drawString(s, x, h);this.text = sb.toString();drawLine(image);return image;public String getText()return text;上面代码只是一个框架,其中很多方法都没有完成,你想想,你能完成几个方法呢? private Bufferedlmage createlmage(:创建图片,并设置背景色;private BufferedImage createImage() BufferedImage image = new BufferedImage