2018-5-17 JSP_Web_MVC開發(12)-response內置對象(Cookie)

2018-5-17 JSP_Web_MVC開發(12)-response內置對象(Cookie)

  • 請求重定向--客戶端跳轉
  • 設置頭信息
  • 操作Cookie

對於伺服器端而言,如果要接收客戶端發送來的請求數據,那麼只能依靠request對象完成。而伺服器端對客戶端的回應就是通過response對象完成。例如之前直接輸出的HTML代碼實際上都屬於伺服器端的回應。

response是javax.servlet.http.HttpServletResponse介面的實例化對象。它繼承自javax.servlet.ServletResponse父介面,而ServletResponse也只有HttpServletResponse一個子介面,這樣的設計與request對象是完全相同的。

在進行回應時候response採用以下方法完成:

  • 得到客戶端輸出流:public PrintWriter getWriter() throws IOException

除了輸出之外,在response對象中主要可以實現3個功能:請求重定向,設置頭信息,操作Cookie。

【1.請求重定向】

所謂重定向就是跳轉功能,使用HttpServletResponse介面的如下操作方法:

  • 重定向:public void sendRedirect(String location) throws IOException

例 觀察操作--response_send.jsp

<%@ page pageEncoding="UTF-8"%><% response.sendRedirect("param.jsp?username=hello&password=world");%>

此時實現了跳轉操作,但是同時也可以發現地址發生了改變,所以此類跳轉也稱為客戶端跳轉。同時也請記住,如果是客戶端端跳轉,那麼無法傳遞request屬性,只能夠傳遞session、application屬性。

面試題:請解釋JSP之中2種跳轉的區別,或者說請解釋response.sendRedirect()和<jsp:forward>區別。

  • response.sendRedirect():屬於客戶端跳轉,跳轉之後地址欄改變,不能傳遞request屬性。此跳轉是在頁面代碼都執行完之後再跳轉。
  • <jsp:forward>:屬於伺服器端跳轉,跳轉之後地址欄不改變,可以傳遞request屬性。此跳轉是無條件跳轉,跳轉之後的代碼不再執行。

【2.設置頭信息】

所謂頭信息就是附加在請求數據之外的信息,例如:在之前可以取得客戶端的IP地址,實際上這些IP地址都是附加在頭信息上得到的。如果用戶想知道有哪些頭信息,則可以使用request對象,在HttpServletResponse介面中定義了如下的取得頭信息操作的方法:

  • 取得全部頭信息的名字:public Enumeration getHeaderNames();
  • 根據名稱取得頭信息的內容:public String getHeader(String name);

例 取得頭信息

<%@ page pageEncoding="UTF-8"%><%@ page import="java.util.*"%><% //取得全部頭信息的名稱 Enumeration<String> enu=request.getHeaderNames(); while (enu.hasMoreElements()){ String name=enu.nextElement(); %> <h3><%=name%> = <%=request.getHeader(name)%></h3><% }%>

顯示結果

accept = application/x-ms-application, image/jpeg, application/xaml+xml, image/gif, image/pjpeg, application/x-ms-xbap, application/vnd.ms-excel, application/vnd.ms-powerpoint, application/msword, */*accept-language = zh-CNua-cpu = AMD64accept-encoding = gzip, deflateuser-agent = Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)host = localhostconnection = Keep-Alivecookie = JSESSIONID=4A75FC7012B49C738C2A817ABBD297

如果要設置頭信息可以使用HttpServletResponse介面的如下方法:

  • 設置頭信息:public void setHeader(String name,String value)

最為常用的頭信息就是定時刷新功能,名稱為:refresh。

例 實現一個定時刷新功能

<%@ page pageEncoding="UTF-8"%><%@ page import="java.util.*"%><%! int num = 0; //設置一個數字%><h1> <%=num ++%> </h1><% response.setHeader("refresh", "2");%>

每2秒刷新一次頁面。一般刷新頻率都是設置為2秒,這樣伺服器才可以承受。

利用刷新可以實現定時跳轉功能。

<%@ page pageEncoding="UTF-8"%><%@ page import="java.util.*"%><%! int num = 0; //設置一個數字%><h1> <%=num ++%> </h1><% response.setHeader("refresh", "2;URL=welcome.jsp");%>

但是有些時候該操作無法完成,因為瀏覽器不同,有可能是不能進行自動跳轉的。所以為了保險起見,可以增加一個鏈接地址。

<%@ page pageEncoding="UTF-8"%><%@ page import="java.util.*"%><%! int num = 0; //設置一個數字%><h1> <%=num ++%> </h1><% response.setHeader("refresh", "2;URL=welcome.jsp");%><h2>登錄成功,2秒後自動跳轉到首頁!</h2><h2>如果沒有跳轉,請按<a href="welcome.jsp">這裡</a></h2>

面試題:請解釋2種跳轉的區別。

在Web開發之中頁面跳轉有2種形式:

  • 客戶端跳轉:跳轉之後地址欄改變,不能傳遞request屬性。此跳轉是在頁面代碼都執行完之後再跳轉。實現方式
  1. response.sendRedirect(路徑)
  2. reponse.setHeader("refresh","時間:URL=路徑")
  3. window.location=路徑
  4. 超鏈接<a href></a>
  • 伺服器端跳轉:跳轉之後地址欄不改變,可以傳遞request屬性。此跳轉是無條件跳轉,跳轉之後的代碼不再執行。
    1. <jsp:forward page="路徑"/>

    【3.操作Cookie】

    Cookie指的是保存在客戶端上的一組數據,最為常見的功能就是,記住我,下次自動登錄,這就是基於Cookie完成的。由於Cookie是保存個人信息數據,如果電腦是一台公共電腦,那麼會極度不安全。

    在JSP中提供有專門Cookie操作類,此類常用方法如下:

    • 構造方法:public Cookie(String name,String value)
    • 取得Cookie的名字:public String getName()
    • 取得Cookie的內容:public String getValue()

    如果要想將Cookie數據設置到客戶端上,則可以利用response對象提供的方法完成。

    • 將Cookie設置到客戶端:public void addCookie(Cookie cookie)

    例 設置Cookie

    <%@ page pageEncoding="UTF-8"%><% Cookie c1=new Cookie("username","Hello"); Cookie c2=new Cookie("password","World"); response.addCookie(c1); response.addCookie(c2);%>

    在Eclipse中Window->Web Browser選擇IE

    然後運行jsp網頁,工具菜單中選擇開發人員工具

    在緩存菜單中選擇查看Cookie信息

    可以看到Cookie的賦值

    通過以上顯示可以發現,所設置的Cookie數據已經成功的保存好了。

    此時再運行取得頭信息代碼,得到的結果如下:

    accept = */*accept-language = zh-cnuser-agent = Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 6.1; Win64; x64; Trident/4.0; .NET CLR 2.0.50727; SLCC2; .NET CLR 3.5.30729; .NET CLR 3.0.30729; Media Center PC 6.0; .NET4.0C; .NET4.0E)ua-cpu = AMD64accept-encoding = gzip, deflatehost = localhostconnection = Keep-Alivecookie = username=Hello; password=World; JSESSIONID=B927FA2D55779F3A92DE48AF27CFC9

    所有客戶端的Cookie都是通過頭信息隨著請求一起發生到伺服器端的,所以要想取得設置的Cookie,則必須通過HttpServletRequest介面完成。方法如下:

    • 取得全部Cookie:public Cookie[] getCookies(),返回Cookie數組

    例 取得全部Cookie

    <%@ page pageEncoding="UTF-8"%><% Cookie c[]=request.getCookies();//取得全部Cookies for(int x=0;x<c.length;x++){%> <h2><%=c[x].getName() %>=<%=c[x].getValue() %></h2><% }%>

    此時就可以取得全部設置的Cookie數據了

    注意:此時設置的Cookie只能保存在當前瀏覽器之中。如果瀏覽器關閉,那麼Cookie會自動消失。如果要想Cookie保存時間長一些,那麼可以加入保存時間。

    • Cookie類提供的方法:public void setMaxAge(int expiry),單位秒

    例 修改Cookie保存時間

    <%@ page pageEncoding="UTF-8"%><% Cookie c1=new Cookie("username","Hello"); Cookie c2=new Cookie("password","World"); c1.setMaxAge(30); c2.setMaxAge(90); response.addCookie(c1); response.addCookie(c2);%>

    在實際工作中,如果真的實現了Cookie保存用戶名和密碼功能,那麼數據一定要加密處理。

    總結

    response對象中,最重要的就是2個跳轉的概念。


    推薦閱讀:

    MVC系列——一個異常消息傳遞引發的思考
    django系列九:頁面布局
    MVC 模式的原理,它在 Android 中是如何運用的?
    「每日一題」MVC 是什麼?(續1)
    django系列五:資料庫配置

    TAG:MVC | 遊戲從業者 |