1. 程式人生 > >Request物件和Response物件詳解

Request物件和Response物件詳解

Request 1.獲取請求的基本資訊 1>獲取請求的url和uri 2>獲取url後面的請求引數部分的字串 3>獲取請求方式 4>獲取主機名,IP地址 5>獲取 Contexpath String url = request.getRequestURL().toString(); System.out.println(url); String uri = request.getRequestURI().toString(); System.out.println(uri); String params = request.getQueryString();
System.out.println(params); String method = request.getMethod(); System.out.println(method); String addr = request.getRemoteHost() + request.getRemotePort() + request.getRemoteAddr() + "==user=" + request.getRemoteUser(); System.out.println("addr: " + addr); String contextPath = request
.getContextPath(); response.sendRedirect(contextPath + "/index.jsp"); 2.通過 Referer 請求頭實現防盜鏈 Referer請求頭的值表示從哪個網頁上的連結訪問到當前連結 盜鏈: 其他站點通過超連結連結到自己的站點,從而實現資源的盜竊稱為盜鏈. @WebServlet("/NewsServlet") public class NewsServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected
void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8");        String referer = request.getHeader("Referer"); if(referer == null || "".equals(referer) || !referer.contains("localhost/")) { response.sendRedirect(request.getContextPath() + "/index.jsp");        } response.getWriter().write("習大大吃包子....");     } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {        doGet(request, response);     } } 如果Referer為空或者不是從自己的站點訪問過來就重定向到自己站點的主頁. 2.獲取請求引數 Map<String, String[]> params = request.getParameterMap(); for (String name : params.keySet()) {    String value = request.getParameter(name);    System.out.println("name=" + name + ", value=" + value); } 解決請求亂碼問題: request.setCharacterEncoding("Utf-8"); 如果上面的程式碼只能解決POST的亂碼問題, 則可以自行進行解碼操作 String userName = request.getParameter("username"); userName new String(userName.getBytes("ISO8859-1"), "UTF-8"); 前段使用 UTF-8 進行編碼, 傳輸到伺服器, 伺服器可以使用 ISO8859-1 解碼得到UTF-8編碼後的碼值, 然後通過new String(bytes, charset)的方式進行解碼. 3.設定和獲取域屬性 Object attr = request.getAttribute("attr"); request.setAttribute("key", "value"); request.removeAttribute("attr"); Enumeration<String> attributeNames = request.getAttributeNames(); 一般我們的應用是servlet處理資料, 將處理好的資料放到request域中,然後帶到jsp頁面上進行展示操作.
  1. 請求轉發與請求包含
請求轉發: request.getRequestDispatcher("/DispatcherTest2").forward(request, response);this.getServletContext().getRequestDispatcher("/DispatcherTest2").forward(request, response); Note:     1)一次請求只能轉發一次, 否則會發生下面的異常: -- 可以得到第一次轉發獲取的資料 java.lang.IllegalStateException: Cannot forward after response has been committed     2)當有資料已經寫到客戶端時再請求轉發也會丟擲異常.
    3)若轉發前有資料寫入到response緩衝區,則請求轉發會清空response緩衝區的實體內容, 但不會清空請求頭資訊. 請求包含: 當需要將多個servlet的輸出合併到一塊打給瀏覽器時可以使用請求包含 request.getRequestDispatcher("/DispatcherTest2").include(request, response);this.getServletContext().getRequestDispatcher("/DispatcherTest2").include(request, response); Notice:     1)被包含的Servlet程式不能改變響應訊息的狀態碼和響應頭,如果它裡面存在這樣的語句,這些語句的執行結果將被忽略.     2)常被用來進行頁面佈局 請求重定向: response.sendRedirect(request.getContextPath() + "/DispatcherTest2"); Notice: 1) 不能在資料已經發送到瀏覽器之後再進行請求重定向: java.lang.IllegalStateException: Cannot call sendRedirect() after the response has been committed 2) 在請求重定向之前寫入到response緩衝區的資料會被清空 3) 一次請求只能重定向一次
Summary: 請求重定向位址列會發生變化.請求轉發位址列不發生變化. 請求重定向兩次請求兩次響應.請求轉發一次請求一次響應. 如果需要在資源跳轉時利用request域傳遞域屬性則必須使用請求轉發 如果希望資源跳轉後修改使用者的位址列則使用請求重定向 如果使用請求轉發也可以重定向也可以,則優先使用請求轉發,減少瀏覽器對伺服器的訪問次數減輕伺服器的壓力. Response 1.response     ServletResponse -- 通用的response提供了一個響應應該具有最基本的屬性和方法         |         |-HttpServletResponse -- 在ServletResponse的基礎上針對於HTTP協議增加了很多強化的屬性和方法 2.輸出資料  1)getOutputStream位元組輸出流 response.getOutputStream().write("中國".getBytes("utf-8")); string.getBytes()如果沒有指定編碼方式,會使用平臺預設的編碼方式
2)getWriter字元輸出流 response.getWriter().write("北京");     Notice: getWriter和getOutputStream在一次請求中只能使用一個     使用字元輸出流輸出中文時, 由於網線上只能輸出高低電平,如果沒有指定編碼方式,那麼伺服器在傳送資料時會使用預設的ISO-8859-1對資料編碼(該碼錶中沒有漢字, 因此漢字會被編碼為?, 傳送到瀏覽器上的資料實際就是?). 3)解決亂碼     1> 通知伺服器傳送資料時使用utf-8編碼 response.setCharacterEncoding("utf-8");     2> 通知瀏覽器接受資料時使用utf-8解碼 response.setHeader("Content-Type", "text/html;charset=utf-8");     3> Notice:         a. response物件中對Content-Type響應頭進行了封裝,可以使用一下程式碼代替 2> response.setContentType("text/html;charset=utf-8");         b. 如果設定了Content-Type,伺服器會自動的設定 characterEncoding,因此解決亂碼只需要設定Content-Type響應頭一行程式碼就可以了,但是為了程式碼的可讀性更高,一般還是建議同時設定 characterEncoding 和 Content-Type. 3)實現下載 protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setHeader("Content-Disposition", "attachment;filename=" + URLEncoder.encode("美女.jpg"));     InputStream in = new FileInputStream(this.getServletContext().getRealPath("美女.jpg"));     OutputStream out = response.getOutputStream(); byte[] bytes = new byte[1024]; int len = -1; while(-1 != (len = in.read(bytes))) { out.write(bytes, 0, len);     } in.close(); } 4) 實現定時重新整理     1.Servlet實現 response.setContentType("text/html;charset=utf-8"); response.getWriter().write("恭喜您註冊成功, 3秒後回到主頁"); response.setHeader("Refresh", "3;url=OutServlet");     2.html實現 <meta charset="UTF-8"> <meta http-equiv="Refresh" content="3; url=index.jsp" > <title>Insert title here</title> </head> <body>     恭喜您註冊成功, 3秒後回到主頁.... </body> 5)控制瀏覽器是否快取 response.setIntHeader("Expires", -1); response.setHeader("Cache-Control", "no-cache"); response.setHeader("Pragma", "no-cache"); response.getWriter().write(new Date().toLocaleString()); 6)實現請求重定向 response.sendRedirect(this.getServletContext().getContextPath()); 7)輸出驗證碼圖片 package com.inetsoft.response; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.IOException; import java.util.Random; import javax.imageio.ImageIO; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /**  * @Description: 用於輸出驗證碼圖片的Servlet  * @Warning:  * @Author DreamLi  * @Package Day04-Response-Request  --  com.inetsoft.response.ValidServlet  * @Date: 2017年12月17日 下午4:51:22  * @Version: 1.0.0  */ @WebServlet("/ValidServlet") public class ValidServlet extends HttpServlet { private static final long serialVersionUID = -70985881600765636L; private Random rand = new Random(); public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //設定響應頭讓瀏覽器不再快取驗證碼圖片 response.setDateHeader("Expires", -1); response.setHeader(

相關推薦

java Request物件Response物件

一:概述 Web伺服器收到客戶端的http請求,會針對每一次請求,分別建立一個用於代表請求的request物件、和代表響應的response物件 一、Response物件 1.Resonse的繼承結構: ServletResponse--H

JavaWeb之Request物件Response物件

一:概述 Web伺服器收到客戶端的http請求,會針對每一次請求,分別建立一個用於代表請求的request物件、和代表響應的response物件一、Response物件     1.Resonse的繼承結構:             ServletResponse--Ht

Request物件Response物件

Request 1.獲取請求的基本資訊 1>獲取請求的url和uri 2>獲取url後面的請求引數部分的字串 3>獲取請求方式 4>獲取主機名,IP地址 5>獲取 Contexpath String url = request.get

Java非靜態內部類外部this物件final型別

1. 非靜態內部類是如何引用外部類this物件的 Java內部類分為靜態內部類和非靜態內部類。它們有一個比較大的區別在於,非靜態內部類擁有外部類的this物件的引用,從而使得非靜態內部類可以訪問外部類的成員函式,成員變數。這個結論我們大家都比較清楚,那麼原理大家都懂嗎?這篇文章我講通

jsp 九大內建物件其作用

   JSP中一共預先定義了9個這樣的物件,分別為:request、response、session、application、out、pagecontext、config、page、exception 1、request物件 request 物件是 javax.servlet.httpServletRequ

SpringMVC獲取request物件response物件

其他Action繼承BaseAction 方法一: 1、BaseAction類 public class BaseAction { protected HttpServletRequest request; protected HttpServletRespo

request物件response物件

一、請求響應流程圖 伺服器處理請求的流程:   (1)伺服器每次收到請求時,都會為這個請求開闢一個新的執行緒。   (2)伺服器會把客戶端的請求資料封裝到request物件中,reques

Servlet(二):requestresponse物件

什麼是request和response request物件是伺服器對瀏覽器請求的封裝,而response是伺服器對伺服器響應的封裝。 request用來取出請求資訊,而response則用來新增要返回給瀏覽器的資訊。 使用response物件設定h

response物件&重定向

2018年10月26日16:10:47 於易動 客戶端瀏覽器和伺服器:   請求的時候: request物件:    HttpServletRequest   響應的時候: response物件: HttpServletResp

DRF自帶的RequestResponse物件

# 轉載請留言聯絡 1.Request物件 DRF傳入檢視的request物件,不再是Django預設的HttpRequest物件,而是擴充套件了HttpRequest類的Request類的物件。 REST framework 提供了Parser解析器,在接收到請求後會自動根據Content-Type指

Servlet入門(五)requestresponse物件

前言       本章學習servlet中的request、response物件 方法 1.概念 相信大家在之前的章節已經看到了,我用到了request物件獲取前臺傳遞過來的資料: String username = request.getPar

Request物件Response session

request.getContextPath()到底獲取的誰的絕對路徑?什麼叫絕對路徑?在硬盤裡存在的嗎? 假設有一個專案名為:report_emp request.getContextPath()獲得的是當前的專案名 /report_emp, 要想獲得專案實際在磁碟中存貯路徑可以使用reques

Python-模型類-F()物件Q()物件

定義模型 from django.db import models from django.db.models import F, Q class Publisher(models.Model): """出版社""" name = models.CharField(ma

Servlet(四):requestresponse物件

Request物件:問題:   瀏覽器發起請求到伺服器,會遵循HTTP協議將請求資料傳送給伺服器。 那麼伺服器接受到請求的資料改怎麼儲存呢?不但要存,而且要保證完成性。 解決:   使用物件進行儲存,伺服器每接受一個請求,就建立一個物件專門的存 儲此次請求的請求資料。 實現:    requ

ASP.NET常用物件——Request(請求)Response(響應)物件

請求與響應 Request物件 創建出5個Web窗體頁面 編寫或拖放超連結控制元件 不同頁面之間引數傳遞:第一個引數之前使用?,引數之間使用&連線 Que

Nodejs之request response 物件的具體介紹

res.app:同req.app一樣 res.append():追加指定HTTP頭 res.set()在res.append()後將重置之前設定的頭 res.cookie(name,value [,option]):設定Cookie opition: domain / expires / httpOnly

requestresponse物件的使用集合

Asp使用request.ServerVariables當討論Request物件內容時,要研究的集合之一就是ServerVariables集合。 powered by 25175.net 這個集合包含了兩種值的結合體,一種是隨同頁面請求從客戶端傳送到伺服器的HTTP報頭中的值,另外一種是由伺服器在接收到請求

spring單例多例。如何在單例中呼叫多例物件

spring生成物件預設是單例的。通過scope屬性可以更改為多例。 <bean id="user" class="modle.User" scope="prototype"> </bean> 在使用Spring3對控制器Controller進行bean管理時,如果要對控制器是

JSON字串物件之間的轉換

JSON(JavaScript Object Notation) 是JavaScript程式語言的一個子集。正因JSON是JavaScript的一個子集,所以它可清晰的運用於此語言中。 eval函式 JSON文字轉換為物件 為了將JSON文字轉換為物件,可以使用eva

為什麼C++中常量引用可以繫結非常量的物件、字面值一般表示式

    在c++語言中,除兩種例外情況,其他引用的型別都要和與之繫結的物件嚴格匹配,如int型的引用只能繫結int型的物件;並且引用不能直接與字面值常量或表示式結果繫結。    其中一種例外情況是:初始化常量引用時,允許用任意表達式作為初始值,只要該表示式的結果能轉換成引用的