• 关于Tomcat的URIEncoding以及GET乱码


    最近在维护着Linux上的服务器,当然,开发和前期测试是在windows上执行的。

    在做意见反馈的时候,出现了windows上正常,Linux下却是乱码的问题。

    先排查了web服务器与mysql的连接,确认问题处在前端页面和web之间的乱码交互。

    前端的代码如下:是jQuery的跨域提交。

    $(function(){
    	//
    	var $btn_green = $(".btn_green");
    	var $content = $(":input[name=content]");
    	var $nickname = $(":input[name=nickname]");
    	var $linktel = $(":input[name=linktel]");
    	//
    	$btn_green.click(function(){
    		//
    		var content = $content.val();
    		var nickname = $nickname.val();
    		var linktel = $linktel.val();
    		//
    		if(!content){
    			show("亲,请填写内容哦!");
    			$content.focus();
    			return false;
    		}
    		//
    		var url = "http://dev3.mywebsite.com:80/api/feedback?";
    		url += "content="+encodeURIComponent(content);
    		url += "&nickname="+encodeURIComponent(nickname);
    		url += "&linktel="+encodeURIComponent(linktel);
    		try{
    			$.getScript(url);
    		} catch(e){
    			//
    		}
    		close_feedback();
    		$content.val("");
    		//
    		show("感谢您的建议与反馈!");
    	});
    	//
    	function show(message){
    		if(message){
    			alert(message);
    		}
    	};
    });


    页面编码是UTF-8。 提交以后,在servlet里面:

    // 请求的编码
    request.setCharacterEncoding("UTF-8");
    
    String content = request.getParameter("content");
    String clientIp = request.getRemoteAddr();
    String nickName = request.getParameter("nickname");
    String linkTel = request.getParameter("linktel");
    // 打印其中一个内容
    System.out.println("content="+content);

    发现在windows上是正常的,而linux服务器里面就是乱码。

    于是在Servlet加上转码,linux好了,而windows又出现乱码了。

    		String srcChar = "ISO8859-1";
    		String dstChar = "UTF-8";
    		title = new String(title.getBytes(srcChar),dstChar);
    		content = new String(content.getBytes(srcChar),dstChar);
    		nickName = new String(nickName.getBytes(srcChar),dstChar);
    		linkAddress = new String(linkAddress.getBytes(srcChar),dstChar);
    		//

    确定问题应该处在Tomcat的配置上,于是翻开两个conf/server.xml 对比,发现:

        <!-- windows  -->
    <Service name="Catalina">
        <Connector port="8080" protocol="HTTP/1.1" 
                   connectionTimeout="20000" 
                   redirectPort="8443" URIEncoding="UTF-8" />
    
        <Connector port="8099" protocol="AJP/1.3" redirectPort="8443" URIEncoding="UTF-8" />
    

    而Linux 的配置缺少了URIEncoding的配置项,那么默认应该是"ISO8859-1",所以如果没有配置,则需要转码一次。

      <!-- Linux 上Tomcat-->
      <Service name="Catalina">
        <Executor name="tomcatThreadPool" namePrefix="catalina-exec-"  maxThreads="250" minSpareThreads="20"/>
        <Connector port="80" protocol="HTTP/1.1"
                   connectionTimeout="20000"  redirectPort="8443"  compression="on" compressionMinSize="2048" noCompressionUserAgents="gozilla,traviata"
    	compressableMimeType="text/html,text/xml,text/javascript,text/css,text/plain,application/json,application/javascript,application/x-javascript"
    				/>
        <Connector port="8009" protocol="AJP/1.3" redirectPort="8443" executor="tomcatThreadPool"/>

    同理,如果在Linux上的Tomcat 加上URIEncoding="UTF-8" 就好了。

    结论: 约定很重要,网站一般采用UTF-8作为默认编码。如果不是特殊需求,不要变换成其他编码。

  • 相关阅读:
    SQL Server Alwayson架构下 服务器 各虚拟IP漂移监控告警的功能实现 -2(虚拟IP视角)
    Android LitePal
    Android SQLite
    汇编语言知识点总结
    三层架构
    将博客搬至CSDN
    回溯(二)
    Android持久化技术
    Android广播时间——实现强制下线功能
    Android广播机制(2)
  • 原文地址:https://www.cnblogs.com/lanzhi/p/6467097.html
Copyright © 2020-2023  润新知