1.Request概述
--用戶通過瀏覽器訪問服務器時,Tomcat將HTTP請求中所有的信息都封裝在Request對象中
--作用:開發人員可以通過request對象方法,來獲取瀏覽器發送的所有信息.
2.Request體系結構
ServletRequest | HttpServletRequest | org.apache.catalina.connector.RequestFacade(由tomcat廠商提供)
3.Request獲取Http請求信息
String getMethod() 獲取請求方式 GET String getContextPath() 獲取項目網絡地址(虛擬路徑) String getRequestURI() 統一資源標識符(范圍廣) StringBuffer getRequestURL() 獲取URL(統一資源定位符) String getProtocol() 獲取協議和版本號 HTTP/1.1 String getRemoteAddr() 獲取客戶端ip地址 getLocalAddr() 獲取用戶ip地址
解決post提交方式的亂碼:request.setCharacterEncoding("UTF-8");
解決get提交的方式的亂碼:parameter = new String(parameter.getbytes("iso8859-1"),"utf-8");
String getHeader(String name) 根據請求頭的名稱獲取對應的值,注意:不區分大小寫 Enumeration<String> getHeaderNames() 獲取所有請求頭的名稱--注意:Iterator前身迭代器
req.setCharacterEncoding("utf-8"); System.out.println("請求方式=" + req.getMethod()); System.out.println("項目名=" + req.getContextPath()); System.out.println("當前訪問相對目錄=" + req.getRequestURI()); System.out.println("當前訪問絕對路徑=" + req.getRequestURL()); System.out.println("http版本號=" + req.getProtocol()); System.out.println("獲取用戶ip地址=" + req.getLocalAddr()); System.out.println("獲取ip地址=" + req.getRemoteAddr()); // System.out.println("兩個絕對路徑="); System.out.println(this.getServletContext().getRealPath("/")); System.out.println(req.getSession().getServletContext().getRealPath("/")); String path = req.getContextPath(); String basePath = req.getScheme() + "://" + req.getServerName() + ":" + req.getServerPort() + path + "/"; System.out.println("拼接獲取服務器加模塊名=" + basePath); //獲取請求頭 String header = req.getHeader("Host"); System.out.println(header); Enumeration<String> headerNames = req.getHeaderNames(); while (headerNames.hasMoreElements()) { String sname = headerNames.nextElement(); String header1 = req.getHeader(sname); System.out.print(sname + "::" + header1); }
結果 (省略一堆header值)
請求方式=GET 項目名=/web08_servlet_anno 當前訪問相對目錄=/web08_servlet_anno/indexServlet 當前訪問絕對路徑=http://localhost:8080/web08_servlet_anno/indexServlet http版本號=HTTP/1.1 獲取用戶ip地址=0:0:0:0:0:0:0:1 獲取ip地址=0:0:0:0:0:0:0:1 兩個絕對路徑= G:\ouClass\artifacts\web08_servlet_anno_war_exploded\ G:\ouClass\artifacts\web08_servlet_anno_war_exploded\ 拼接獲取服務器加模塊名=http://localhost:8080/web08_servlet_anno/ localhost:8080
//header....
注意:在jsp中獲取靜態路徑使用的是
req.getContextPath()
對應jsp
${pageContext.request.contextPath}或<%=request.getContextPath()%>
詳情查看 https://www.cnblogs.com/xiaozhang666/p/13355474.html
4.獲取請求參數
--不論get還是post請求方式,都可以使用下列方法來獲取請求參數
--在web階段,get和post方法處理的業務邏輯是一樣的...
--根據參數名獲取參數值
String getParameter(String name) --根據參數名獲取參數值數組 例如 hobby=somke&hobby=drink String[] getParameterValues(String name) --獲取所有的參數名和參數值,封裝map集合(key參數名,value參數值) Map<String,String[]> getParameterMap()
--前端傳值為數組時
String[] likeList = request.getParameterValues("likearr[]");
--get:在tomcat8及以上版本,內部url編碼(UTF-8)
post:編碼和解碼格式不統一,產生亂碼...
瀏覽器 編碼:UTF-8
服務器默認 解碼:ISO-8859-1 西歐(拉丁文)
指定服務器解碼方式
void setCharacterEncoding(String env)
注意:這哥們必須在post方法的行首
//中文亂碼 request.setCharacterEncoding("utf-8"); //獲取參數 String name = request.getParameter("name"); String pwd = request.getParameter("pwd"); String[] likes = request.getParameterValues("like"); String[] likeList = request.getParameterValues("likearr[]");
5.請求轉發
* API 1.通過reuqest對象獲取轉發器對象 RequestDispatcher getRequestDispatcher(String path) 2.通過轉發器對象,實現請求轉發 void forward(ServletRequest request, ServletResponse response) * 請求轉發特點 瀏覽器地址欄沒有發生改變 瀏覽器只發送了一次請求(request、response只創建一次,多個轉發的servlet共享) 只能轉發服務器內部資源 * 鏈式編程 request.getRequestDispatcher("/BServlet").forward(request, response);
6.域對象(共享數據)
--域對象:一個有作用范圍的對象,可以在范圍內共享數據
--request域:代表一次請求的范圍,一般用於一次請求中轉發的多個資源中共享數據
* API 1.存數據 void setAttribute(String name,Object o); 2.取數據 Object getAttribute(String name); 3.刪數據 void removeAttribute(String name); * 生命周期 1.創建? 用戶發送請求時,創建request 2.銷毀? 服務器做出響應,銷毀request 3.范圍? 一次請求,多次轉發
7.獲取ServletContext對象
public ServletContext getServletContext();
此對象為Servlet上下文對象,只會創建一個
補充案例和api
視頻防盜鏈
/* 視頻播放源,判斷... */ @WebServlet("/RefererRequest") public class RefererRequest extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); // 1.獲取請求來源信息(注意:如果瀏覽器直接訪問,這個頭返回的值為null) String referer = req.getHeader("referer"); // 2.判斷是否為家族體系訪問源 if (referer != null && referer.startsWith("http://localhost:8080/web09_request")) { resp.getWriter().write("<h3>正常播放視頻...</h3>"); } else { resp.getWriter().write("<h3>想看嗎?來騰訊把...</h3>"); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
瀏覽器兼容性
user-agent:獲取瀏覽器版本信息
/* 瀏覽器兼容性 */ @WebServlet("/UserAgentRequest") public class UserAgentRequest extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { resp.setContentType("text/html;charset=utf-8"); // 1.獲取瀏覽器信息 String userAgent = req.getHeader("user-agent"); // 2.判斷 if (userAgent.contains("Chrome")) { resp.getWriter().write("谷歌體系瀏覽器"); } else if (userAgent.contains("Firefox")) { resp.getWriter().write("火狐體系瀏覽器"); } else { resp.getWriter().write("其他體系瀏覽器"); } } @Override protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { } }
request.getServletPath() 獲取客戶端請求的路徑名如:/object/delObject request.getServerName() 獲取服務器地址,如:localhost request.getServerPort() 獲取服務器端口,如8080 request.getLocalName() 獲取本地IP映射名,如:localhost request.getLocalPort() 獲取本地端口,如:8090 request.getRealPath("/") 獲取項目所在服務器的全路徑,如:D:\Program Files\apache-tomcat-7.0.25\webapps\TestSytem\ request.getRemoteAddr() 獲取遠程主機地址,如:127.0.0.1 request.getRemoteHost() 獲取遠程主機,如:127.0.0.1 request.getRemotePort() 獲取遠程客戶端端口,如:3623 request.getRequestedSessionId() 獲取會話session的ID,如:823A6BACAC64FB114235CBFE85A46CAA request.getRequestURI() 獲取包含項目名稱的請求路徑,如:/TestSytem/object/delObject request.getRequestURL().toString() 獲取請求的全路徑,如:http://localhost:8090/TestSytem/object/delObject