一.cookie機制
1. 什麼是cookie
最早由Netscape社區發展的一種機制.目前cookie已經成爲標準,所有的主瀏覽器IE,Netscape,Firefox,Ppera等都支持cookie.
2.cookie的原理
3.Cookie使用的三個步驟
使用Cookie創建cookie對象:
Cookie color = new Cookie(“color”,”red”);
在響應中加入cookie:
response.addCookie(color);
通過request取回cookie
Cookie[] cookie = request.getCookies();
示例:記錄用戶訪問次數
Cookie[] c = request.getCookies();
int count = 1;
if(c!=null) {
for(int i=0;i<c.length;i++) {
Cookie accountCookie = c[i];
if(accountCookie.getName().equals("accountCount")) {
count = Integer.parseInt(accountCookie.getValue())+1;
break;
}
}
}
response.addCookie(new Cookie("accountCount",String.valueOf(count)));
4.Cookie的有效期
Cookie 的maxAge決定這Cookie的有效期,單位爲秒(Second).Cookie中同構getMaxAge()方法與setMaxAge(int maxAge)方法來讀寫maxAge屬性
如果maxAge屬性爲正數,則表示該Cookie會在maxAge妙後自動失效,瀏覽器會將maxAge爲正數的Cookie持久化,即寫到對應的Cookie文件中.無論客戶關閉了瀏覽器還是電腦, 只要換在maxAge妙之前,登錄網站時該Cookie仍然有,
Cookie永遠有效代碼:
Cookie cookie-new Cookie(“Username”,”hello”);//新建一個Cookie
Cookie.setMaxAge(Integer.MAX-VALUE);//設置生命週期
response.addCookie(cookie);//輸出到客戶端
5.cookie機制
具體來說Cookie機制是採用的是在客戶端保持狀態的方式,它是在客戶端的會話狀態的儲存機制,它需要用戶打開客戶端的cookie支持
二.session機制
1.session原理
2.session的基本操作
獲取session對象
HttpSession session = request.getSession();
通過session存取數據
Session.setAttribute(“name”,value)
Session.getAttribute(“name”)
3.容器
1、在Session對象中保存數據,可以傳遞給同一個系統的其他Servlet或者是頁面。
2、不同的客戶端同時訪問時,根據sessionId來自動獲取Session中保存的數據。
3、HttpSession對象中只能保存Object類型的數據。
4.session和cookie的生命週期
Session原理是通過容器在調用session方法時自動通過cookie寫入sessionid的方法來控制
Cookie默認的有效期是瀏覽器被關閉之前 當前session有效期是當前session的有效期是當 前這一次訪問
Session數據存放在容器中,容器無監聽瀏覽器的關閉會通過web.xml
配置
<session-config>
<session-timeout>1</session-timeout>
</session-config>
來決定定時清除長期未訪問的session數據
5.session銷燬與失效
Session.invalidate();
Session.setMaxIncativeInterval(Interva);
三.攔截器
連接器鏈:
如果某些資源被多個過濾器攔截形成了鏈,如果資源被訪問時這個連中的所有過濾器都會被依次執行,如果任何一個過濾器沒有通過鏈條被中斷鏈條後的所有過濾器都不會執行
filtering API
接口:javax.servlet.Filter
所有起到過濾器功能的類要實現此接口
接口:javax.servlet.FilterChain
將各個過濾器連接起來組成過濾器鏈
接口:javax.servlet.FilterConfig
處理過濾器配置相關信息
創建filter
第一步:創建一個類,實現javax.servlet.Filter接口
第二步:配置web.xml文件
Filtering配置
Web.xml中文件的配置
Filter定義:名字, Filter類
Filter映射:要處理哪類資源
<filter>
<filter-name>charencode</filter-name>
<filter-class>servlet.CharEncodingFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>charencode</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
配置過濾器
<!-- 配置過濾器 -->
<filter>
<filter-name>MyFilter1</filter-name>
<filter-class>cn.servlet.lesson4.MyFilter1</filter-class>
</filter>
<filter-mapping>
<filter-name>MyFilter1</filter-name>
<!-- 表示攔截資源 -->
<url-pattern>/lesson03/*</url-pattern>
</filter-mapping>
過濾器統一設置字符集
/*
* 配置了攔截某些資源 這些資源都別進入doFilter
* 方法決定了資源是否能夠通過該過濾器
*/
public void doFilter(ServletRequest request, ServletResponse response,
FilterChain chain) throws IOException, ServletException {
//調用該方法
HttpServletRequest req=(HttpServletRequest)request;
HttpServletResponse resp=(HttpServletResponse)response;
req.setCharacterEncoding("UTF-8");
resp.setCharacterEncoding("UTF-8");
resp.setContentType("text/html;charset=UTF-8");
String url=req.getRequestURI();
System.out.println(url);
//如果訪問了file就通過訪問了private
if(!url.contains("private")){
chain.doFilter(request, response);
}
}
攔截器的攔截順序:由定義的先後順序
事件:
事件是java中的一個重要的概念,指某個代碼運行過程中的一個狀態,如:HttpSession創建,屬性值的改變等都可以用事件來描述。
事件:java.util.EventObject
getSource()-Object
事件偵聽程序:
(標誌)接口:java.util.EventListener
實現listener接口
事件源:
註冊偵聽程序
觸發事件偵聽程序
生成事件對象
調用已註冊的偵聽程序,處理事件
事件定義三要素:
1.事件源
2.動作
3.觸發回調(觸發動作後調用什麼東西οnclick=”回調”)
四.監聽器
事件源:HttpServletRequest,HttpSession,ServletContext
動作:生命週期階段對象產生銷燬,數據變化(setAttribute,remaveAttrihute)回調
<!-- 註冊監聽程序 -->
<listener>
<listener-class>cn.servlet.lesson4.RequestCycleListener</listener-class>
</listener>
生命週期的簡介
Request的生命週期:
生命週期短,瀏覽器發起請求產生request對響應後request被銷燬
servletcontext的生命週期:
伴隨着應用的發佈(產生)和關閉(銷燬)
數據存儲邏輯
所有的servlet都需要共存數據需要保留很長時間,寫入servletContext數據是有狀態的,不同的用戶擁有不同的數據寫用Httpsession傳遞的參數或者請求轉發跳轉數據傳遞寫入httpservletRequest