一、tomcat7中cookie寫入中文引發的異常問題及解決
問題:
Cookie cookie = new Cookie("cookieName", "Cookie值");
resp.addCookie(cookie);
目標URL訪問此方法時,會拋出異常:
java.lang.IllegalArgumentException: Control character in cookie value or attribute
描述:
環境:tomcat7,Java7
具體問題:cookie寫入中文會引發異常。所以這樣看來Cookie默認支持的編碼方式是ASCII碼。不能對中文進行編碼和解碼。
解決方式:
創建Cookie的時候:
Cookie cookie = new Cookie(name, URLEncoder.encode(value, "UTF-8"));
讀取Cookie的時候:
String value = URLDecoder.decode(cookie.getValue(), "UTF-8");
二、跳轉到iframe的父窗口
在iframe子窗體跳到父窗口:
window.parent.location.href = "parent.jsp";
使用的是window的parent屬性。
三、a標簽disabled效果
對a標簽添加 disabled="disabled" 發現不起作用。
用以下這兩種方式:
1.
<a href="link.html" class="not-active">Link</a> .not-active { pointer-events: none; cursor: default; }
2.
$('a.current-page').click(function() { return false; });
四、表單標簽傳值問題
若為表單標簽添加 disabled 屬性,則該表單標簽的值不會傳到後台。可以使用 readonly 屬性來替代 。
五、form表單中的 button 按鈕
在 form 中的 button 按鈕,默認 type 為 submit 類型,submit()方法為 jQuery 表單提交方法。
六、數據庫:set 某個字段為 null
1.該column 不存在 not null約束,可以直接設置為null
2.該column 存在 not null約束,設置為null的時候,會設置為 對應類型的默認值。
七、css:z-index
.zIndex( zIndex ) == .css( "zIndex", zIndex )
八、引入script標簽出錯
錯誤標簽:
<script src="${ctx}/static/js/module/project/personal_center.js" type="text/javascript" charset="utf-8"/>
使用自動提示工具,補全了script標簽,但是發現這樣的書寫是不正確的。
正確使用:
<script src="${ctx}/static/js/module/project/personal_center.js" type="text/javascript" charset="utf-8"></script>
script標簽結束是以</script>作為閉合標簽的。
九、get/post請求中文亂碼問題
出現的問題:
通過get請求向服務器發送請求時,如果請求參數為中文時,服務器端接受到的參數為亂碼。
亂碼原因分析及解決辦法:
1.關於解碼和編碼
編碼:'中'→1110001
解碼:1110001→'中'
亂碼:編碼和解碼過程中使用了不同的字符集
2.Web應用中字符編碼解碼的問題
(1)請求過程:
<1>GET請求
浏覽器端是以UTF-8進行編碼,所以在服務器端也應該以UTF-8進行解碼
由於GET請求參數附著在URL地址後面,所以要統一的URL地址的解碼字符集。
解決辦法:
在tomcat配置文件server.xml中找到第一個connector加入如下屬性 URIEncoding=UTF-8
<2>POST請求
在獲取請求參數前執行:request.setCharacterEncoding("UTF-8");
(2)響應過程
(1)指定響應數據的編碼字符集
(2)告訴浏覽器響應數據應該使用什麼字符集進行解碼
<1>Tomcat服務器會自動根據“解碼字符集”設置“編碼字符集”
<2>設置編碼字符集:告訴浏覽器當前響應數據的內容類型:response.setContentType("text/html;charset=UTF-8");需要注意的是,需要在response.getWriter();之前設置,否則無效。
建議:
所有的過濾器都只對POST請求起作用,在jsp頁面中設置字符編碼方式,都只是對表單提交時的POST請求起作用,對GET請求不能起到設置其字符編碼的作用,
在GET請求中使用的是默認的編碼方式,所以對GET請求,需要在server.xml文件中設置URIEncoding="UTF-8"然後重啟TOMCAT便可以實現解決中文亂碼問題,
但是不建議在href超鏈接請求中傳達中文參數,也不建議在GET請求中傳遞中文參數。
另外對傳遞的部分中文實現傳遞和接收時的統一的編碼方法在傳達參數時使用"reply.jsp?title="+java.net.URLEncoder.encode(keywords)
然後在接收參數頁面使用keywords=new String(request.getParameter("keywords").getBytes("8859_1"));這種方式雖然暫時解決了中文亂碼問題,
但是在後期的維護和部署到其他的服務器時可以仍會會出現中文亂碼了問題,所以不建議使用。
對於Post請求,只需在Servlet或者jsp中寫入如下代碼就可以把解決從表單中傳入的中文亂碼問題
request.setCharacterEncoding("utf-8");
了解:
而對於Get請求,因為請求參數會被附加到地址欄的URL之後,所以不能用上面的處理方法。應該這樣:
String str=request.getQueryString(); //使用URLDecoder解碼字符串 String str1=java.net.URLDecoder.decode(str,"utf-8"); String[] paraStrings=str1.split("&"); //paraStrings[0]就是第一個參數,依次類推... for(String paraString : paraStrings){
String[] nameValue=paraString.split("=");//nameValue[0]就是表單的name,nameValue[1]就是表單name對應的值 }
還有一種方法就是獲取請求參數之後對請求參數值重新編碼,也就是先將其轉換成字節數組,再將字節數組重新解碼成字符串。
String str=request.getParameter("name"); byte[] bytes=str.getBytes("ISO-8859-1"); String name=new String(bytes,"utf-8");
結論:傳遞中文參數時,最好使用POST請求來提交。不同服務器設置編碼方式可能不同,不同操作系統設置編碼方式也可能不同。