1. 程式人生 > >request請求引數校驗(十二)

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即可。

參考資料: