2016年3月18日 星期五

Cache、錯誤頁面、Cookie、HttpSession方法 (Servlet 六)

※Cache

也就是回應給瀏覽器的cache,如果不想讓瀏覽器cache,可以如下設定
resp.setHeader("Cache-Control", "no-store");
.no-cache此文件不應該被cache;
.no-store此文件不應該被cache,也不可以儲存在proxy伺服器裡
有七個選項,看5.2.1

resp.setHeader("Expires", "0");//文件失效時間,0表示馬上失效,看5.3



※錯誤頁面

在web.xml的web-app下增加如下的設定
<error-page>
    <error-code>405</error-code>
    <location>/WEB-INF/405.jsp</location>
</error-page>
    
<error-page>
    <exception-type>java.lang.NullPointerException</exception-type>
    <location>/xxx.jsp</location>
</error-page>

※location可以是另外一支servlet,所以「/」的觀念還是一樣

※405的錯是get或post沒有對應的方法就會拋出來,所以我在jsp給post,但我servlet沒寫post,這時就會跳出405.jsp的畫面

※比較奇怪的是NullPointer,我在servlet寫Integer i;(沒初始化) i++,這樣子一定是NullPointer,可是不會跳xxx.jsp的頁面



※Cookie

Cookie cookie = new Cookie("bruce", "chen");
cookie.setMaxAge(60*60*24);
resp.addCookie(cookie);
    
Cookie[] cookieArray = req.getCookies();
for(Cookie c:cookieArray){
    if(c.getName().equals("bruce")){
        System.out.println(c.getValue());
    }
}

※setMaxAge設定有效期限,單位是秒

每個瀏覽器都有相關的設定,下面是IE的
勾結束時刪除瀏覽瀏覽記錄,會刪除一個叫刪除按鈕裡面的設定


這個設定可以調整Cookie的存取,如果調到最高就是完全不用Cookie



HttpSession方法

resp.setContentType("text/html; charset=UTF-8");
PrintWriter out = resp.getWriter();
HttpSession session = req.getSession();
    
out.print("sessionId=" + session.getId());
out.print("<br/>session是新的嗎?" + session.isNew());
out.print("<br/>session有效時間=" + session.getMaxInactiveInterval());
out.print("<br/>session創建時間=" + session.getCreationTime());
out.print("<br/>session上次存取時間=" + session.getLastAccessedTime());
out.print("<br/>從Cookie取得session嗎?" + req.isRequestedSessionIdFromCookie());
out.print("<br/>從URL取得session嗎?" + req.isRequestedSessionIdFromURL());
out.print("<br/>sessionId有效嗎?" + req.isRequestedSessionIdValid());
out.print("<br/><a href='");
out.print(resp.encodeURL(req.getRequestURI()));
out.print("'>注意狀態列和網址</a>");

※req.getSession()等同req.getSession(true),false表示不新增session,所以只能在session之後

※invalidate()是登出

※setMaxInactiveInterval(int)設定session有效時間,單位是秒

※如果要重導就用這一組resp.sendRedirect(res.encodeRedirectURL(""));

※isRequestedSessionIdFromURL想變成true。Session會先到Cookie找資料,如果發現Cookie被關掉,就會用URL Rewriting的方式,但測試時,localhost要改成ip才行,否則還是有辦法抓到Cookie

※會在網址後加上「;jsessionid=16進位的數字」,這個數字如果被有心人拿到,也是會有安全的漏洞,所以只要寫req.getSession()就會有一條session,如果瀏覽器關掉再開就是兩條,因為jsessionid不同了

沒有留言:

張貼留言