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¶m2=value2的鍵值對形式編碼成一個格式化串,它承載多個請求引數的資料。不但報文體可以傳遞請求引數,請求URL也可以通過類似於“/chapter15/user.html? param1=value1¶m2=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()+"/";
}
}