java深入探究06
Tomcat中獲取資源文件:
ServletContext().getRealPath(/WEB-INF/classes/db.properties);//獲取資源文件的在服務器中的絕對路徑
ServletContext()getResourceAsStream() 得到資源文件,返回的是輸入流
ServletContext().getRealPath
會話管理
1.定義:管理瀏覽器和服務器間會話期間產生的會話數據
2.域對象:實現資源之間數據的共享
3.會話數據
a) Cookie:會話數據保存在瀏覽器客戶端
- 使用流程:
1.Cookie對象在服務端被創建
2.發送到客戶端 respond.addCookie(cookie)(這裏隱式發了一個set-Cookie的響應頭set-Cookie:name=value)->
3.瀏覽器得到這個Cookie會保存起來下次訪問服務器時會帶著Cookie信息(隱式帶著一個Cookie:name=value的請求頭)->
4.服務器獲得瀏覽器發來的Cookie對象request.getCookies()
- 主要方法
構造:Cookie(String ,value);
設置:
setValue(String newValue);//設置新的Cookie值
setPath(String path);//設置有效的訪問路徑
發生:addCookie(cookie);
服務端接受:request.getCookies();
- 註意:
Cookie只能保存非中文字符串類型,可以保存多個多個Cookie,一個瀏覽器可以保存300個Cookie,每個站點只能存20個,每個Cookie大小限制4kb;
setMaxAge(int expiry):正數:保存在瀏覽器客戶端硬盤時間;
負數:保存在瀏覽器內存中,關閉瀏覽器就沒有了
零:刪除同名的Cookie數據
- 例子:保存用戶上次訪問的時間
/** * 案例-用戶上次訪問時間 * @author APPle * */ public class HistServlet extends HttpServlet { /** * */ private static final long serialVersionUID = 1L; public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); //獲取當前時間 SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd hh:mm:ss"); String curTime = format.format(new Date()); //取得cookie Cookie[] cookies = request.getCookies(); String lastTime = null; if(cookies!=null){ for (Cookie cookie : cookies) { if(cookie.getName().equals("lastTime")){ //有lastTime的cookie,已經是第n次訪問 lastTime = cookie.getValue();//上次訪問的時間 //第n次訪問 //1.把上次顯示時間顯示到瀏覽器 response.getWriter().write("歡迎回來,你上次訪問的時間為:"+lastTime+",當前時間為:"+curTime); //2.更新cookie cookie.setValue(curTime); cookie.setMaxAge(1*30*24*60*60); //3.把更新後的cookie發送到瀏覽器 response.addCookie(cookie); break; } } } /** * 第一次訪問(沒有cookie 或 有cookie,但沒有名為lastTime的cookie) */ if(cookies==null || lastTime==null){ //1.顯示當前時間到瀏覽器 response.getWriter().write("你是首次訪問本網站,當前時間為:"+curTime); //2.創建Cookie對象 Cookie cookie = new Cookie("lastTime",curTime); cookie.setMaxAge(1*30*24*60*60);//保存一個月 //3.把cookie發送到瀏覽器保存 response.addCookie(cookie); } } }View Code
b) Session:會話數據保存在服務端
- 出現原因:
a) Cookie有自己缺點,最大4kb,只能非中文限制多,Session就能解決這個問題,可以存對象,任何類型數據
b) 服務器能夠識別不同瀏覽器,數據存到哪個域就必須從那個域中或獲得對象
- 使用流程:
不同的瀏覽器request對象獲得不同的域對象
HttpSession session=request.getSession();只要解析他的流程就可以了
a) 第一次一個瀏覽器創建Session域對象,服務器給這個session對象分配了一個JSESSIONID對象,用來唯一標識這個session對象的-》
b) 再將這個JSESSIONID發送到客戶端respond.addCookie("JSESSIONID", sessionID)->
c) 之後瀏覽器發送請求到服務器帶著JSESSIONID請求頭從服務器中找配備的session對象-》
d) 找到了就獲得這個對象沒有找到就重復a)
- 主要方法
a) 創建:request.getSession([true]);
b) 設置:setMaxInactiveInterval(int interval)//設置保存時間
Invalidate();//銷毀這個session對象
getId();//獲得這個Session的唯一標識JSESSIONID
- 註意:
a) 銷毀時間設置:默認情況30min,setMaxInactiveInterval(int interval);設置時間;全局設置銷毀時間可以在web.xml中配置
<!-- 修改session全局有效時間:分鐘 -->
<session-config>
<session-timeout>1</session-timeout>
</session-config>
;手動銷毀:invalidate()
b) 如何避免瀏覽器的JSESSIONID的cookie隨著瀏覽器關閉而丟失的問題
手動設置瀏覽器的Cookie時間
Cookie cookie=new Cookie();
cookie.setMaxAge(60*60);
response.addCookie(cookie);
- 例子:
//1.得到session對象 HttpSession session = request.getSession(false); if(session==null){ System.out.println("沒有找到對應的sessino對象"); return; } /** * 得到session編號 */ System.out.println("id="+session.getId()); //2.取出數據 String name = (String)session.getAttribute("name"); System.out.println("name="+name);View Code
java深入探究06