1. 程式人生 > >http請求與Request常用方法

http請求與Request常用方法

一、http請求

HTTP請求報文由3部分組成(請求行+請求頭+請求體):

①是請求方法,GET和POST是最常見的HTTP方法,除此以外還包括DELETE、HEAD、OPTIONS、PUT、TRACE。不過,當前的大多數瀏覽器只支援GET和POST,Spring 3.0提供了一個HiddenHttpMethodFilter,允許你通過“_method”的表單引數指定這些特殊的HTTP方法(實際上還是通過POST提交表單)。服務端配置了HiddenHttpMethodFilter後,Spring會根據_method引數指定的值模擬出相應的HTTP方法,這樣,就可以使用這些HTTP方法對處理方法進行映射了。 
②為請求對應的URL地址,它和報文頭的Host屬性組成完整的請求URL,③是協議名稱及版本號。 
④是HTTP的報文頭,報文頭包含若干個屬性,格式為“屬性名:屬性值”,服務端據此獲取客戶端的資訊。 
⑤是報文體,它將一個頁面表單中的元件值通過param1=value1&param2=value2的鍵值對形式編碼成一個格式化串,它承載多個請求引數的資料。不但報文體可以傳遞請求引數,請求URL也可以通過類似於“/chapter15/user.html? param1=value1&param2=value2”的方式傳遞請求引數。 
對照上面的請求報文,我們把它進一步分解,你可以看到一幅更詳細的結構圖:  --------------------- 本文來自 咚浸暖的過去 的CSDN 部落格 ,全文地址請點選:https://blog.csdn.net/u010256388/article/details/68491509?utm_source=copy

響應報文結構 

HTTP的響應報文也由三部分組成(響應行+響應頭+響應體): 

①報文協議及版本; 
②狀態碼及狀態描述; 
③響應報文頭,也是由多個屬性組成; 
④響應報文體,即我們真正要的“乾貨”。 

請求對映

http請求資訊包含六部分資訊:

①請求方法,如GET或POST,表示提交的方式;

②URL,請求的地址資訊;

③協議及版本;

④請求頭資訊(包括Cookie資訊);

⑤回車換行(CRLF);

⑥請求內容區(即請求的內容或資料),如表單提交時的引數資料、URL請求引數(?abc=123 ?後邊的)等。

此處我們可以看到有①、②、④、⑥一般是可變的,因此我們可以這些資訊進行請求到處理器的功能處理方法的對映,因此請求的對映分為如下幾種:

URL路徑對映:使用URL對映請求到處理器的功能處理方法;

請求方法對映限定:如限定功能處理方法只處理GET請求;

請求引數對映限定:如限定只處理包含“abc”請求引數的請求;

請求頭對映限定:如限定只處理“Accept=application/json”的請求。

二、Request

  HttpServletRequest物件代表客戶端的請求,當客戶端通過HTTP協議訪問伺服器時,HTTP請求頭中的所有資訊都封裝在這個物件中,通過這個物件提供的方法,可以獲得客戶端請求的所有資訊。

獲得客戶機資訊

  getRequestURL方法返回客戶端發出請求時的完整URL。
  getRequestURI方法返回請求行中的資源名部分。
  getQueryString 方法返回請求行中的引數部分。
  getPathInfo方法返回請求URL中的額外路徑資訊。額外路徑資訊是請求URL中的位於Servlet的路徑之後和查詢引數之前的內容,它以“/”開頭。
  getRemoteAddr方法返回發出請求的客戶機的IP地址。
  getRemoteHost方法返回發出請求的客戶機的完整主機名。
  getRemotePort方法返回客戶機所使用的網路埠號。
  getLocalAddr方法返回WEB伺服器的IP地址。
  getLocalName方法返回WEB伺服器的主機名。

獲得客戶機請求頭

  getHeader(string name)方法:String 
  getHeaders(String name)方法:Enumeration 
  getHeaderNames()方法

獲得客戶機請求引數(客戶端提交的資料)

  • getParameter(String)方法(常用)
  • getParameterValues(String name)方法(常用)
  • getParameterNames()方法(不常用)
  • getParameterMap()方法(編寫框架時常用)

在伺服器端使用getParameter方法和getParameterValues方法接收表單引數

import java.io.BufferedReader;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.security.Principal;
import java.util.Enumeration;
import java.util.Locale;
import java.util.Map;

import javax.servlet.RequestDispatcher;
import javax.servlet.ServletInputStream;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;


/**
 * 代理執行緒中的HttpServletRequest變數,使程式碼中可以通過靜態方法訪問request
 * @version $Revision: 9961 $
 */
public class Request {
	/**
	 * 輸入引數
	 */
	public enum In {
		/** */
		RECORD {
			/** {@inheritDoc} */
			public String toString() {
				return "record";
			}
		}
	}

	/**
	 * 獲取Request例項
	 *
	 * @return Request例項物件
	 */
	public static HttpServletRequest getInst() {
		return (HttpServletRequest) AppMgr.threadVar("request");
	}

	/**
	 * TODO$
	 *
	 * @param request
	 *            void
	 */
	public static void setInst(HttpServletRequest request) {
		AppMgr.setThreadVar("request", request);
	}

	/**
	 * 獲取當前使用者
	 *
	 * @return 使用者資訊
	 */
	public static User curUser() {
		try {
			return (User) getSession(true).getAttribute(User.KEY_SESSION_USER);
		} catch (Exception e) {
			// 沒有使用者用guest處理
			IBean guest = new Bean();
			guest.set("USER_CODE", "guest");
			guest.set("USER_NAME", "guest");
			return new User(guest);
		}
	}

	/**
	 * 返回這個請求使用的HTTP方法(例如:GET、POST、PUT)。
	 *
	 * @return 方法名稱
	 */
	public static String getMethod() {
		return getInst().getMethod();
	}

	/**
	 * 返回請求URL中訪問路徑。 如果有查詢字串存在,將不包括在返回值當中。 例如:
	 * 請求URL為http://localhost:8080/web/main/list.do?id=1,將返回/web/main/list.do
	 *
	 * @return URI
	 */
	public static String getRequestURI() {
		return getInst().getRequestURI();
	}

	/**
	 * 返回請求的URL。包含協議(例如http和https)和埠,但不包含查詢字串。
	 *
	 * @return 包含URL的StringBuffer
	 */
	public static StringBuffer getRequestURL() {
		return getInst().getRequestURL();
	}

	/**
	 * 返回web應用名稱路徑,如為根目錄,則返回""。 例如:
	 * web應用名稱是web,請求URL為http://localhost:8080/web/main/list.do?id=1,將返回/web
	 *
	 * @return Context Path
	 */
	public static String getContextPath() {
		return getInst().getContextPath();
	}

	/**
	 * 返回servlet路徑。 例如:
	 * web應用名稱是web,請求URL為http://localhost:8080/web/main/list.do?
	 * id=1,將返回/main/list.do
	 *
	 * @return Servlet Path
	 */
	public static String getServletPath() {
		return getInst().getServletPath();
	}

	/**
	 * 返回這個URL請求的Servlet路徑之後的額外路徑資訊。 例如:
	 * 請求URL為http://localhost:8080/web/main/list/product1/,
	 * 其中Servlet的url-pattern為/main/list/* 則返回/product1/
	 *
	 * @return Path Info
	 */
	public static String getPathInfo() {
		return getInst().getPathInfo();
	}

	/**
	 * 這個方法獲得這個請求的URL的Servlet路徑之後的額外的路徑資訊,並將它轉換成一個真實的路徑。
	 *
	 * @return path
	 */
	public static String getPathTranslated() {
		return getInst().getPathTranslated();
	}

	/**
	 * 返回請求URL所包含的查詢字串。
	 *
	 * @return 查詢字串
	 */
	public static String getQueryString() {
		return getInst().getQueryString();
	}

	/**
	 * 返回一個請求頭域的值。 如果這個請求頭域不存在,這個方法返回null。
	 *
	 * @param name
	 *            頭域名稱
	 * @return 頭域值
	 */
	public static String getHeader(String name) {
		return getInst().getHeader(name);
	}

	/**
	 * 返回一個請求頭域的值列表。
	 *
	 * @param name
	 *            頭域名
	 * @return 包含頭域值的Enumeration物件
	 */
	public static Enumeration getHeaders(String name) {
		return getInst().getHeaders(name);
	}

	/**
	 * 返回請求的所有頭域名。
	 *
	 * @return 包含所有頭域名的Enumeration物件
	 */
	public static Enumeration getHeaderNames() {
		return getInst().getHeaderNames();
	}

	/**
	 * 返回指定的請求頭域的值,這個值被轉換成一個整數。
	 *
	 * @param name
	 *            頭域名
	 * @return 值為整數的頭域值
	 */
	public static int getIntHeader(String name) {
		return getInst().getIntHeader(name);
	}

	/**
	 * 返回指定的請求頭域的值,這個值被轉換成一個自1970-1-1日(GMT)以來的精確到毫秒的長整數。
	 *
	 * @param name
	 *            頭域名
	 * @return 值為長整數的頭域值
	 */
	public static long getDateHeader(String name) {
		return getInst().getDateHeader(name);
	}

	/**
	 * 返回一個Cookie陣列,該陣列包含這個請求中當前的所有Cookie。 如果這個請求中沒有Cookie,返回一個空陣列。
	 *
	 * @return Cookie陣列
	 */
	public static Cookie[] getCookies() {
		return getInst().getCookies();
	}

	/**
	 * 返回當前請求的Session
	 *
	 * @param create
	 *            沒有有效的Session時,是否建立新Session,不建立返回null
	 * @return Session
	 */
	public static HttpSession getSession(boolean create) {
		return getInst().getSession(create);
	}

	/**
	 * 返回當前請求的Session
	 *
	 * @return Session
	 */
	public static HttpSession getSession() {
		return getInst().getSession();
	}

	/**
	 * 返回當前請求的Session Id
	 *
	 * @return Session Id
	 */
	public static String getRequestedSessionId() {
		return getInst().getRequestedSessionId();
	}

	/**
	 * 檢查當前請求的Session是否可用。
	 *
	 * @return boolean值,是否可用
	 */
	public static boolean isRequestedSessionIdValid() {
		return getInst().isRequestedSessionIdValid();
	}

	/**
	 * 判斷請求的Session Id是否是通過客戶端的一個cookie提供的。
	 *
	 * @return boolean值,是否是cookie提供
	 */
	public static boolean isRequestedSessionIdFromCookie() {
		return getInst().isRequestedSessionIdFromCookie();
	}

	/**
	 * 如果這個請求的Session Id是通過客戶端的URL的一部分提供的,該方法返回真,否則返回假。
	 *
	 * @return boolean值,Session Id是否來自URL
	 */
	public static boolean isRequestedSessionIdFromURL() {
		return getInst().isRequestedSessionIdFromURL();
	}

	/**
	 * 返回這個請求的身份驗證模式。
	 *
	 * @return 如BASIC_AUTH, FORM_AUTH, CLIENT_CERT_AUTH, DIGEST_AUTH(suitable
	 *         for == comparison) 或者其他模式 如果請求沒有驗證, 則返回null
	 */
	public static String getAuthType() {
		return getInst().getAuthType();
	}

	/**
	 * 返回作了驗證請求的使用者名稱。 如果在請求中沒有使用者名稱資訊,這個方法返回null。
	 *
	 * @return 使用者名稱
	 */
	public static String getRemoteUser() {
		return getInst().getRemoteUser();
	}

	/**
	 * 判斷驗證使用者是否包含在一個角色中。
	 *
	 * @param role
	 *            角色名稱
	 * @return 是否包含在角色中
	 */
	public static boolean isUserInRole(String role) {
		return getInst().isUserInRole(role);
	}

	/**
	 * 返回一個java.security.Principal物件,此物件包含了驗證用的名稱。 如果沒有驗證使用者,則返回null。
	 *
	 * @return Principal物件
	 */
	public static Principal getUserPrincipal() {
		return getInst().getUserPrincipal();
	}

	/**
	 * 返回這個請求所用的協議,其形式是協議/主版本號.次版本號。例如對於一個HTTP1.0的請求,該方法返回HTTP/1.0。
	 *
	 * @return 請求協議
	 */
	public static String getProtocol() {
		return getInst().getProtocol();
	}

	/**
	 * 返回請求URL所使用的Scheme。 例如: http、https或者ftp等。
	 *
	 * @return Scheme名稱
	 */
	public static String getScheme() {
		return getInst().getScheme();
	}

	/**
	 * 返回接收請求的伺服器的主機名。
	 *
	 * @return 主機名
	 */
	public static String getServerName() {
		return getInst().getServerName();
	}

	/**
	 * 返回接收請求的埠號。
	 *
	 * @return 埠號
	 */
	public static int getServerPort() {
		return getInst().getServerPort();
	}

	/**
	 * 返回請求者的IP地址。
	 *
	 * @return IP地址
	 */
	public static String getRemoteAddr() {
		return getInst().getRemoteAddr();
	}

	/**
	 * 返回請求者的主機名稱。不能或者選擇不解析主機名,將會直接返回IP地址。
	 *
	 * @return 主機名稱
	 */
	public static String getRemoteHost() {
		return getInst().getRemoteHost();
	}

	/**
	 * 返回請求者的埠號。
	 *
	 * @return 埠號
	 */
	public static int getRemotePort() {
		return getInst().getRemotePort();
	}

	/**
	 * 獲得本地IP。
	 *
	 * @return IP地址
	 */
	public static String getLocalAddr() {
		return getInst().getLocalAddr();
	}

	/**
	 * 獲得本地主機名。
	 *
	 * @return 主機名
	 */
	public static String getLocalName() {
		return getInst().getLocalName();
	}

	/**
	 * 獲得本地埠號
	 *
	 * @return 埠號
	 */
	public static int getLocalPort() {
		return getInst().getLocalPort();
	}

	/**
	 * 重新設定請求的字元編碼。 這個方法必需在讀取請求引數或流之前呼叫。
	 *
	 * @param env
	 *            字元編碼名稱
	 * @throws UnsupportedEncodingException
	 *             如果字元編碼不可用
	 */
	public static void setCharacterEncoding(String env)
			throws UnsupportedEncodingException {
		getInst().setCharacterEncoding(env);
	}

	/**
	 * 返回指定請求引數的值,如果這個引數不存在返回null。
	 *
	 * @param name
	 *            引數名稱
	 * @return 引數值
	 */
	public static String getParameter(String name) {
		return getInst().getParameter(name);
	}

	/**
	 * 返回指定請求引數的值(String陣列),如果這個引數不存在返回null。
	 *
	 * @param name
	 *            引數名稱
	 * @return 引數值陣列
	 */
	public static String[] getParameterValues(String name) {
		return getInst().getParameterValues(name);
	}

	/**
	 * 返回所有引數名的列表。
	 *
	 * @return 包含所有引數名的Enumeration物件
	 */
	public static Enumeration getParameterNames() {
		return getInst().getParameterNames();
	}

	/**
	 * 返回請求引數的Map物件
	 *
	 * @return Map物件
	 */
	public static Map getParameterMap() {
		return getInst().getParameterMap();
	}

	/**
	 * 返回一個輸入流。
	 *
	 * @return 輸入流物件ServletInputStream
	 * @throws IOException
	 *             IO異常
	 */
	public static ServletInputStream getInputStream() throws IOException {
		return getInst().getInputStream();
	}

	/**
	 * 返回讀取請求的BufferedReader。
	 *
	 * @return BufferedReader
	 * @throws IOException
	 *             IO異常
	 * @throws IllegalStateException
	 *             如果這個請求的輸入流已經被getInputStream呼叫獲得
	 */
	public static BufferedReader getReader() throws IOException,
			IllegalStateException {
		return getInst().getReader();
	}

	/**
	 * 返回請求的字元編碼。
	 *
	 * @return 字元編碼
	 */
	public static String getCharacterEncoding() {
		return getInst().getCharacterEncoding();
	}

	/**
	 * 請求內容的長度,如果長度未知就返回-1。
	 *
	 * @return 長度整數
	 */
	public static int getContentLength() {
		return getInst().getContentLength();
	}

	/**
	 * 返回請求的MIME型別,如果型別未知返回null。
	 *
	 * @return MIME型別
	 */
	public static String getContentType() {
		return getInst().getContentType();
	}

	/**
	 * 得到Locale物件。
	 *
	 * @return Locale物件
	 */
	public static Locale getLocale() {
		return getInst().getLocale();
	}

	/**
	 * 得到Locale物件列表。
	 *
	 * @return 包含所有Locale物件的Enumeration
	 */
	public static Enumeration getLocales() {
		return getInst().getLocales();
	}

	/**
	 * 請求是否使用了安全通道,如https
	 *
	 * @return boolean值
	 */
	public static boolean isSecure() {
		return getInst().isSecure();
	}

	/**
	 * 返回指定屬性的值(Object),如不存在則返回null。
	 *
	 * @param name
	 *            屬性名
	 * @return 值物件
	 */
	public static Object getAttribute(String name) {
		return getInst().getAttribute(name);
	}

	/**
	 * 設定一個屬性
	 *
	 * @param name
	 *            屬性名稱
	 * @param o
	 *            值物件
	 */
	public static void setAttribute(String name, Object o) {
		getInst().setAttribute(name, o);
	}

	/**
	 * 得到所有request中的屬性名稱列表。
	 *
	 * @return Enumeration物件,包含了所有request屬性名稱。
	 */
	public static Enumeration getAttributeNames() {
		return getInst().getAttributeNames();
	}

	/**
	 * 移除一個request屬性。
	 *
	 * @param name
	 *            屬性名稱
	 */
	public static void removeAttribute(String name) {
		getInst().removeAttribute(name);
	}

	/**
	 * 返回一個指定路徑的RequestDispatcher物件,如果過路徑無效返回null。
	 *
	 * @param path
	 *            路徑
	 * @return RequestDispatcher物件
	 */
	public static RequestDispatcher getRequestDispatcher(String path) {
		return getInst().getRequestDispatcher(path);
	}

	/**
	 * 獲取DATA標籤內參數值
	 *
	 * @param name
	 *            DATA標籤內的編碼
	 * @return 編碼值
	 */
	public static String getParamBean(String name) {
		String rtnVal = "";
		IBean paramBean = (IBean) AppMgr.threadVar("paramBean");
		if (paramBean != null) {
			rtnVal = String.valueOf(paramBean.get(name));
		}
		return rtnVal != null && rtnVal.length() > 0 ? rtnVal : getInst()
				.getParameter(name);
	}

	public static String getWebAddress() {
		StringBuffer webAddress = new StringBuffer(getInst().getScheme());
		webAddress.append("://").append(getInst().getServerName());
		if (80!=getInst().getServerPort()) {
			webAddress.append(":").append(getInst().getServerPort());
		}
		webAddress.append(getInst().getContextPath());
		return webAddress.toString()+"/";
	}
}