Servlet - 會話
servletRequest、servletRespones作用于鏈接
servletContext作用于全局
Cookie客戶端技術,大家都知道的。
Session服務器端技術--為每一個客戶端創造一個獨享的Session對象
Session
關鍵點是,在getSession時,如果不存在當前會話,會自動創建,以后再getSession的時候,用的就是這個了。
Cookie
response.addCookie(),為會話加入一個cookie;
request.getCookies(),獲取當前會話的cookies;
Cookie.setMaxAge(),設置生存周期,默認值為瀏覽器頁面時間
Cookie.setPath(),設置有效目錄,默認值為當前程序所在目錄
Cookie.setDomian,設置域,例如(.sina.com.cn),記得前面加點(.)。瀏覽器一般會禁止寫入第三方域。
example:
顯示用戶上次訪問時間示例
public void doGet(.....){
//解決亂碼
response.setCharacterEncoding("UTF-8");
response.setContentType("text/html;charset=UTF-8");
//獲得一個writer
PrintWriter out=response.getWriter();
out.write("上次訪問時間");
//獲得cookies
Cookie cookies[]=request.getCookies();
//遍歷所有cookie并進行非空判斷
for(int i=0;cookies!=null && i<cookies.length;i++){
Cookie cookie=cookies[i];
//取得存取最后訪問時間的cookie
if(cookie.getName().equals("lastAccessTime")){
//取得cookie值
String value=cookie.getValue();
//將毫秒時間轉換格式化
Date d=new Date(Long.parseLong(value));
out.writer(d.toLocaleString());
}
//更新cookie的最后訪問時間
Cookie cookie=new Cookie("lastAccessTime",System.currentTimeMills()+"");
//設置cookie存活時間,這里是一周。
cookie.setMaxAge(60*60*24*7);
//設置cookie目錄,只要訪問當前目錄下,無論存不存在頁面,都會攜帶此cookie訪問
cookie.setPath("/***");
//寫入這個cookie
response.addCookie(cookie);
}
注意,瀏覽器一般只允許存放300個Cookie,每個站點最多20個,每個Cookie最大4kb。
example:
刪除cookie
public void doGet(.....){
//首先新建一個cookie,名稱為要刪除cookie的名字
Cookie cookie=new Cookie("lastAccessTime","");
//將存活時間設置為0
cookie.setMaxAge(0);
//訪問目錄要與目標cookie一樣
cookie.setPath("/***");
//寫入cookie,就會替換原始cookie,并刪除
response.addCookie(cookie);
}
判斷表單重復提交的事例:
判斷重復提交的流程,一般是這樣的,在提交的表單中,加入一個隨機數,提交表單的時候,一起提交,然后與服務器端session中的隨機數(令牌)對比,如果存在,則提交,并且從session中刪除這個令牌(隨機數)。如果重復提交,提交的隨機數與session中無法匹配,則對提交內容不作處理。
一個通用的令牌生成關鍵代碼:
class TokenProcessor{ //令牌
/*
* 1.把構造方法私有
* 2.自己創建一個
* 3.對外暴露一個方法,允許獲取上面創建的對象
*/
private TokenProcessor(){}
private static final TokenProcessor instance = new TokenProcessor();
public static TokenProcessor getInstance(){
return instance;
}
public String generateToken(){
//這樣獲得的隨機數長短不一
String token = System.currentTimeMillis() + new Random().nextInt() + "";
try {
//所以,對他們進行一次md5,取得固定長度的摘要
MessageDigest md = MessageDigest.getInstance("md5");
byte[] md5 = md.digest(token.getBytes());
//base64編碼,這樣做的目的是,避免字節碼偶然出現通訊中的結束位,誤判斷并提前結束傳輸
//base64是每6位前補00,形成一個字節,然后根據碼表轉換為鍵盤上的可見字符。
BASE64Encoder encoder = new BASE64Encoder();
return encoder.encode(md5);
} catch (NoSuchAlgorithmException e) {
throw new RuntimeException(e);
}
}
}

浙公網安備 33010602011771號