request請求引數校驗(十二)
一、 資料的非空校驗
在得到請求引數後,需要對資料進行校驗,這是伺服器端校驗,通過java程式碼實現。在實際開發中,客戶端校驗(JavaScript實現),和伺服器端校驗都要有。
拿到的都是字串,做非空校驗:String.trim().length()>0,trim去除左右兩邊空格,一定要記住,實際開發中,得到資料一定要trim
規則校驗:正則進行規則校驗。
二、處理中文亂碼
1. 亂碼出現的原因:漢字在各個編碼表中的碼值不一樣。
2. 程式出現亂碼的原因。在Tomcat8以前,頁面使用utf-8編碼方式和Tomcat使用的ISO8859-1解碼方式不一致,request獲取的資訊就是亂碼。
編解碼過程程式碼如下:
package com.it.test; import java.io.UnsupportedEncodingException; import java.net.URLDecoder; import java.net.URLEncoder; public class Demo { public static void main(String[] args) throws UnsupportedEncodingException { /*使用URL進行編解碼*/ System.out.println("========URL實現編解碼=========="); String s = "中國"; String code = URLEncoder.encode(s, "utf-8"); //tomcat進行了如下操作 String result = URLDecoder.decode(code, "iso8859-1");//解碼 //得到正確資訊 //1.使用iso8859-1進行編碼 String code2 = URLEncoder.encode(result, "iso8859-1"); String right = URLDecoder.decode(code2, "utf-8"); System.out.println(right); System.out.println("=========string類內中實現編解碼============"); fun1(); } //在string類中就可以直接進行編碼解碼 public static void fun1() throws UnsupportedEncodingException { String origin = "北京"; byte[] code = origin.getBytes("utf-8"); String wrongMsg = new String(code, "iso8859-1"); String rightMsg = new String(wrongMsg.getBytes("iso8859-1"),"utf-8"); System.out.println(rightMsg); } }
3.解決方案:
post和get請求都可以的方式:
將得到的資訊使用ISO8859-1進行編碼 msg.getBytes("iso8859-1");
在使用utf-8進行解碼 new String(msg.getBytes("iso8859-1"),"utf-8");
//獲得使用者名稱: String username = request.getParameter("username");//引數要與JSP中的name值對應。 //在Tomcat7及其以下的版本,中文會出現亂碼,解決方案如下: //String right = new String(username.getBytes("iso8859-1"),"utf-8");
只有post請求可以使用的方式如下:
如果請求方式是post,我們可以通過request.setCharacterEncoding(String charsetname);
//post請求
request.setCharacterEncoding("utf-8");
//獲得使用者名稱:
String username = request.getParameter("username");//引數要與JSP中的name值對應。
//在Tomcat7及其以下的版本,中文會出現亂碼,解決方案如下:
//String right = new String(username.getBytes("iso8859-1"),"utf-8");
System.out.println(username);
三、處理中文亂碼所有方案總結
1、對Tomcat和eclipse配置檔案進行配置
第一步:對Tomcat_HOME/conf/server.xml檔案進行配置
核心程式碼如下(其中最後一句是自己加的):
<Connector executor="tomcatThreadPool"
port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
URIEncoding="UTF-8" />
-->
第二步:
將
<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
修改為:
<Connector URIEncoding="UTF-8" connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
或
<Connector URIEncoding="UTF-8" allowTrace="false" connectionTimeout="2000" maxKeepAliveRequests="1" maxThreads="200" port="8080" protocol="org.apache.coyote.http11.Http11NioProtocol" redirectPort="8443"/>
加上 URIEncoding="UTF-8"
這種方式一般不建議使用,因為它修改的是Tomcat平臺的編碼,如果人為修改會影響其他專案的執行。
2、逆向編碼解碼還原法
之所以會出現亂碼,是因為瀏覽器將中文以utf-8的編碼格式傳給tomcat時,tomcat以預設的iso8859-1方式對其解碼,而編解碼格式不一致,故而出現亂碼。根據這個原理可逆向還原。
如:
byte buf[] = request.getParameter("name").getBytes("iso8859-1");
String name = new String(buf,"GBK");
這樣得到的name便是前臺傳來的正確的中文引數了
這種方式比較偏向底層,而且有一個弊端,就是當瀏覽器傳送的中文引數很多時,需要一個個設定,比較羅嗦,不利於節省時間。
3、將瀏覽器的表單的提交方式設為post方式,同時在servlet裡在接受引數前將request的編碼設定為GBK或者UTF-8。
前臺形如:
<form action="login.jsp" method="post">
使用者名稱:<input type="text" name="name"><br/><br/>
密 碼:<input type="text" name="pwd"><br/><br/>
<input type="submit" value="登入">
</form>
後臺形如:
request.setCharacterEncoding("utf-8");
String name = request.getParameter("name");
這樣也能正確地接受中文引數了。當然,這種方式也存在弊端,試想下當專案釋出後,如果需要修改編碼為GBK,則要修改原始碼,而對客戶而言,這需要反編譯等步驟直接修改程式碼,有點困難。
4、通過web專案的WebRoot/WEB-INF/web.xml檔案進行配置引數,同時可在servlet中進行讀取。
web.xml的示例核心程式碼如下:
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>cn.hncu.servlets.LoginServlet</servlet-class>
<init-param>
<param-name>character</param-name>
<param-value>utf-8</param-value>
</init-param>
</servlet>
servlet示例核心程式碼如下:
public void init(ServletConfig config) throws ServletException {
String charset = config.getInitParameter("character");
System.out.println(charset);
}
這種方法彌補了方法3的缺陷,方便後期維護和修改,使用者修改時不需要改原始碼,只需修改web.xml即可。
參考資料: