黑马程序员javaweb教程:Tomcat中编码问题

上传人:m**** 文档编号:178380440 上传时间:2022-12-28 格式:DOCX 页数:8 大小:37.54KB
收藏 版权申诉 举报 下载
黑马程序员javaweb教程:Tomcat中编码问题_第1页
第1页 / 共8页
黑马程序员javaweb教程:Tomcat中编码问题_第2页
第2页 / 共8页
黑马程序员javaweb教程:Tomcat中编码问题_第3页
第3页 / 共8页
资源描述:

《黑马程序员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;pu

15、blic String getText()return text;上面代码只是一个框架,其中很多方法都没有完成,你想想,你能完成几个方法呢? private Bufferedlmage createlmage(:创建图片,并设置背景色;private BufferedImage createImage() BufferedImage image = new BufferedImage(w, h, BufferedImage.TYPE_INT_RGB );Graphics2D g2 = (Graphics2D)image.getGraphics();g2.setColor(this.bgColo

16、r); g2.fillRect(0, 0, w, h);return image; private Color randomColor():生成随机颜色; private Color randomColor() int red = r.nextInt(256); int green = r.nextInt( 256); int blue = r.nextInt(256); return new Color(red, green, blue); private Font randomFont():生成随机字体;private Font randomFont() int index = r.nex

17、 tintfont Names.leng th); String fontName = fontNamesindex;int style = r.nextInt(4);int size = r.nextInt(5) + 24; return new Fontfont Name, sty le, size); private char randomChar():生成随机字符;private char randomChar() int index = r.nextInt(codes.length(); return codes.charAt(index); private void drawLin

18、e(Bufferedlmage image: 画干扰线。private void drawLine(BufferedImage image) int num = 5;Graphics2D g2 = (Graphics2D)image.getGraphics(); for(int i = 0; i 元素的src指向Servlet注册表单form action= method= post用户名: 验证码: input type= submit=4使用JavaScript处理“看不清,换一张”问题当用户看不清时,需要换一张验证码。我们这里使用JavaScript来完成这个工作。注册表单用户名: 验证

19、码: 看不清,换一张 input type= submit=function _chage() var imgEle = document.getElementById(verifyCode); imgEle.src = VerifyCodeServlet;5 浏览器缓存问题如果你的浏览器是IE8,那么你会很郁闷。因为IE8总是使用缓存,不会去真的发出请求。那么VerifyCodeServlet就不会被调用。6 时间戳浏览器一般都会去缓存图片!因为每次请求的图片都是VerifyCodeServlet,浏览器就会 认为这张图片在上次请求时我已经下载到本地了,就不用再去请求服务器获取相同的图片 了

20、,我还是用上次的那张图片吧!就是因为浏览器的自作聪明,我们点击“看不清,换一张”无效了。为了让浏览器能够向服务器请求,那么我们必须保证每次做的请求不相同!这可以作用参数来完成。imgEle.src = VerifyCodeServlet?name=zhangSan,但是如果参数不发生变化,那么浏览 器还是会使用缓存的。所以我们需要让参数每次都不相同!注意,这个参数不是用来给服 务器获取的,只是用来欺骗浏览器的!处理这个问题我们问题使用时间戳来完成。function _chage() var imgEle = document.getElementById(verifyCode); imgEle.src = VerifyCodeServlet? + new Date().getTime();如果 IE 还是那么的可爱,可以把 替换成

展开阅读全文
温馨提示:
1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
2: 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
3.本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
关于我们 - 网站声明 - 网站地图 - 资源地图 - 友情链接 - 网站客服 - 联系我们

copyright@ 2023-2025  zhuangpeitu.com 装配图网版权所有   联系电话:18123376007

备案号:ICP2024067431-1 川公网安备51140202000466号


本站为文档C2C交易模式,即用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。装配图网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知装配图网,我们立即给予删除!