了解cookie
我們在瀏覽器進行操作的時候,有時候會在我們的瀏覽器中留下cookie數(shù)據(jù),他不同于session域?qū)ο?cookie對象有這自己的生命周期,只要生命周期還在,那么cookie就不會消失,具體session和cookie的不同:
1)存儲的位置不同
Cookie存儲在瀏覽器端
Session存儲在服務(wù)器端:session攜帶cookie名稱jsessionid存在瀏覽器端存的
2)存儲數(shù)據(jù)類型不一樣
Cooike的構(gòu)造方法:
public Cooike(String name,String value):cookie只能存儲String類型
HttpSession.setAttribute(String name,Object value):可以存儲任意類型
3)存儲的數(shù)據(jù)大小是否有限制
Cookie在瀏覽器端是有限制的,一個站點下的cookie數(shù)據(jù)有限制的;
HttSession可以不斷的設(shè)置數(shù)據(jù),沒有限制
這張圖就可以看到cookie的創(chuàng)建時間和到期時間,生命周期是一個月.
自動登錄
在了解完cookie后,可以開始進行自動登錄的操作了,我們可以通過獲取到瀏覽器中的cookie,來獲取到自動登錄的賬戶的密碼賬戶,然后讓他進行自動登錄,不需要進行賬戶密碼的輸入.
那么首先要在前端,當我們勾選了自動登錄后,讓我們的后端java吧此次登錄的賬戶密碼添加到瀏覽器中的cookie中:
<input type="checkbox" name="autolog" value="auto"> 自動登錄
勾選后,autolog的值就為auto了,那么后端讀取到名字為autolog的值,如果為auto就代表了自己勾選了賬戶密碼.接下來進行后端的操作:
public void log(HttpServletRequest request, HttpServletResponse response) throws IOException {
HttpSession session1 = request.getSession();
session1.invalidate();
String username = request.getParameter( "username" );
String password = request.getParameter( "password" );
String autolog = request.getParameter( "autolog" );
String rpassword = MD5Utils.md5( password );
System.out.println( "前端輸入的用戶名是" + username );
NewServiceDao newServiceDao = new NewServiceDaoImpl();
User user = newServiceDao.logService( username, rpassword );
System.out.println( user );
if (user != null) {
if (user.getState() == 1) {
HttpSession session = request.getSession();
session.setAttribute( "user", user );
if (autolog.equals( "auto" )) { //讀取數(shù)據(jù)是否為auto,判斷是否要將數(shù)據(jù)添加
String count = username + "=" + rpassword;
//注意,cookie的數(shù)據(jù)只能存儲字符串類型,不可以添加object,所以我們自己規(guī)定格式
//用等號來分割賬戶和密碼
count = URLEncoder.encode( count, "utf-8" );
//為了防止被人看到賬戶密碼,給他進行轉(zhuǎn)換格式的添加,并且防止了中文亂碼
Cookie auto = new Cookie( "auto", count );
//新建一個cookie對象,cookie對象的名字為auto,值為剛剛拼接的賬戶密碼的字符串
auto.setMaxAge( 60 * 60 * 24 * 30 );
//設(shè)置cookie對象的生命周期
response.addCookie( auto );
//將此次cookie對象添加到瀏覽器中
} else {
Cookie auto = new Cookie( "auto", "" );
auto.setMaxAge( 0 );
//生命周期為0意思是刪除cookie
response.addCookie( auto );
}
response.sendRedirect( request.getContextPath() + "/jsp" );
} else {
HttpSession session = request.getSession();
session.setAttribute( "user", user );
String s = JiHuo.jiHuo();
MailUtils.sendMail( user.getEmail(), s, "激活碼" );
session.setAttribute( "codee", s );
response.sendRedirect( request.getContextPath() + "/jsp/zhong.jsp" );
}
}
}
這次操作后,我們的cookie對象已經(jīng)添加到瀏覽器中了,我們可以去看看
可以看到名字為auto的cookie,他的生命周期還有內(nèi)容,現(xiàn)在就要去讓他去進行自動登錄了.
首先寫一個過濾器,當我們點擊登錄,或者網(wǎng)址輸入登錄界面的時候,直接讓他進行自動登錄.
@WebFilter(value = "/jsp/login.jsp",dispatcherTypes = {DispatcherType.REQUEST,DispatcherType.FORWARD})
//DispatcherType.REQUEST地址欄直接訪問 DispatcherType.FORWARD 請求轉(zhuǎn)發(fā)
public class AutoFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
System.out.println("初始化了");
}
@Override
public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
HttpServletRequest request1=(HttpServletRequest) request;
HttpServletResponse response1=(HttpServletResponse)response;
Cookie[] cookies = request1.getCookies();
//獲取網(wǎng)頁中的全部cookie對象
if (cookies!=null){
//判斷是否為空
String value=null;
for (Cookie cookie:cookies){ //遍歷全部的cookie對象
if (cookie.getName().equals( "auto" )){//找到名字為auto的cookie對象
value = cookie.getValue();
//讀取到他的value值
}
}
if (value!=null){
//如果value值不為空,則代表有名字為這個的cookie值
value= URLDecoder.decode( value,"utf-8" );
//吧格式轉(zhuǎn)換回來
String[] split = value.split( "=" );
//因為我們規(guī)定了用等號切割賬戶密碼,所以獲取切割后的數(shù)組
String username = split[0];//賬戶
String password = split[1];//密碼
NewServiceDao serviceDao = new NewServiceDaoImpl();
User user = serviceDao.logService( username, password );
//獲取到user對象
if (user!=null){
HttpSession session = request1.getSession();
session.setAttribute( "user",user );
//吧user對象存儲進域?qū)ο?并且跳轉(zhuǎn)到登錄后的界面
response1.sendRedirect( request1.getContextPath()+"/jsp" );
}
}
else{
//如果不是,則放行
chain.doFilter( request1,response1 );
}
}else{
//如果不是,則放行
chain.doFilter( request1,response1 );
}
}
@Override
public void destroy() {
System.out.println("自動登錄器銷毀");
}
}
過濾器的原理:
頭部的@WebFilter里,value值是在那個界面會進行過濾,比如現(xiàn)在過濾器中value = “/jsp/login.jsp”,則代表當在網(wǎng)頁為/jsp/login.jsp的網(wǎng)頁中的時候,會進入過濾器,進行操作,chain.doFilter(request,response)的意思是進行放行操作,讓程序走自己該走的地方,寫完這些后,當我們已經(jīng)有了cookie對象名字為auto的時候,讓他進行自動登錄
退出賬戶
現(xiàn)在如果我想切換賬戶,但是因為cookie對象存在,所以我們現(xiàn)在除非手動刪除cookie,否則不管咋樣,進導(dǎo)登錄界面后,都會自動登錄了,那么為了不去手動刪除,而是通過點擊退出,來讓賬戶退出,則我們需要寫一個方法:
public void change(HttpServletRequest request, HttpServletResponse response) throws IOException {
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (Cookie cookie : cookies) {
if (cookie.getName().equals( "auto" )) {
//獲取這個名字為auto的cookie
System.out.println("進來了");
cookie.setMaxAge(0);
//生命周期給他賦為0則代表刪除了他
response.addCookie( cookie );
HttpSession session = request.getSession();
session.invalidate();
//清空session域
response.sendRedirect( request.getContextPath()+"/jsp/login.jsp" );
}
}
}else{
try {
request.getRequestDispatcher( "/jsp/login.jsp" ).forward( request,response );
} catch (ServletException e) {
e.printStackTrace();
}
}
}
這樣,就吧cookie對象為auto的刪除掉了