1.cookie是什么?
cookie是web應(yīng)用當(dāng)中非常常用的一種技術(shù),用于儲(chǔ)存某些特定的用戶信息。
2.cookie的作用?
在用戶登陸時(shí)將用戶的信息存放在cookie中,用戶在一定的時(shí)間中再次登陸時(shí)不需要輸入用戶名和密碼直接跳轉(zhuǎn)到下一個(gè)界面。
3.設(shè)置cookie
Cookie cookie = new Cookie("key", "value");
cookie.setMaxAge(saveTime*24*60*60);
生存周期默認(rèn)時(shí)間為秒,如果設(shè)置為負(fù)值的話,則為瀏覽器進(jìn)程Cookie(內(nèi)存中保存),關(guān)閉瀏覽器就失效。
cookie.setPath("/test/test2");
設(shè)置Cookie路徑,不設(shè)置的話為當(dāng)前路徑(對(duì)于Servlet來(lái)說(shuō)為request.getContextPath() + web.xml里配置的該Servlet的url-pattern路徑部分) 。
response.addCookie(cookie);
4.讀取cookie
該方法可以讀取當(dāng)前路徑以及“直接父路徑”的所有Cookie對(duì)象,如果沒(méi)有任何Cookie的話,則返回null。如果設(shè)置了路徑使用這個(gè)方法也沒(méi)有值。
Cookie[] cookies = request.getCookies();
5.刪除cookie
Cookie cookie = new Cookie("key", null);
cookie.setMaxAge(0);
設(shè)置為0為立即刪除該Cookie;
cookie.setPath("/test/test2");
刪除指定路徑上的Cookie,不設(shè)置該路徑,默認(rèn)為刪除當(dāng)前路徑Cookie;
response.addCookie(cookie);
下面看一個(gè)例子,這是模擬126郵箱登陸的小功能。建立一個(gè)名為AutoLoginFilter的project,包結(jié)構(gòu)如下:
project下有三個(gè)java文件、兩個(gè)jsp還有個(gè)html,
CheckLogin.java代碼如下:

public class CheckLogin
{


public static boolean login(String username, String password)
{

if ("admin".equals(username) && "123456".equals(password))
{
return true;

} else
{
return false;
}
}

}


IndexFilter.java代碼如下:
package com.bx.course;

/** *//**
* Filter可以實(shí)現(xiàn)對(duì)請(qǐng)求的過(guò)濾和重定向等,也就是說(shuō)可以操作request和response,session等對(duì)象,listner只能監(jiān)聽到以上對(duì)象的屬性的修改。
*/

import java.io.IOException;
import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class IndexFilter implements Filter
{

public void destroy()
{
// TODO Auto-generated method stub
}
public void doFilter(ServletRequest arg0, ServletResponse arg1,

FilterChain arg2) throws IOException, ServletException
{
System.out.println("every request pass here haha");
HttpServletRequest request = (HttpServletRequest) arg0;
HttpServletResponse response = (HttpServletResponse) arg1;
Cookie[] cookies = request.getCookies();
// Cookie cookie = new Cookie("user",null);
// cookie.setMaxAge(0);
// response.addCookie(cookie);
String[] cooks = null;
String username = null;
String password = null;

if (cookies != null)
{

for (Cookie coo : cookies)
{
String aa = coo.getValue();
System.out.println("1");
cooks = aa.split("==");

if (cooks.length == 2)
{
System.out.println(cooks[0]+cooks[1]);
username = cooks[0];
password = cooks[1];
}
}
}
System.out.println("cookie username | " + username);
System.out.println("cookie password | " + password);

if (CheckLogin.login(username, password))
{
System.err.println("check successfully cookie data ");
request.getSession().setAttribute("username",username);
request.getRequestDispatcher("/main126.jsp").forward(request, response);

}else
{
arg2.doFilter(request,response );
}
}

public void init(FilterConfig arg0) throws ServletException
{
// TODO Auto-generated method stub
}
}


LoginServlet.java代碼如下:
package com.bx.course;
import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginServlet extends HttpServlet
{
public void doGet(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException
{
this.doPost(request, response);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)

throws ServletException, IOException
{
String username=request.getParameter("username");
String password=request.getParameter("password");
String savetime=request.getParameter("saveTime");
System.out.println("usrename "+username+" password "+password);

if(CheckLogin.login(username, password))
{

if(null!=savetime)
{
int saveTime=Integer.parseInt(savetime);//這里接受的表單值為天來(lái)計(jì)算的
int seconds=saveTime*24*60*60;
Cookie cookie = new Cookie("user", username+"=="+password);
cookie.setMaxAge(seconds);
response.addCookie(cookie);
}
request.setAttribute("username",username);
request.getRequestDispatcher("/main126.jsp").forward(request,response);

}else
{
request.getRequestDispatcher("/failure.jsp").forward(request,response);
}
}
}


web.xml配置文件代碼如下:
<filter>
<filter-name>loginFilter</filter-name>
<filter-class>com.bx.course.IndexFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>loginFilter</filter-name>
<url-pattern>/login.html</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>LoginServlet</servlet-name>
<servlet-class>com.bx.course.LoginServlet</servlet-class>
</servlet>

<servlet-mapping>
<servlet-name>LoginServlet</servlet-name>
<url-pattern>/login.do</url-pattern>
</servlet-mapping>
<welcome-file-list>
<welcome-file>login.html</welcome-file>
</welcome-file-list>

<welcome-file-list>
<welcome-file>main126.jsp</welcome-file>
</welcome-file-list>


login.html代碼如下:
<html>
<head>
</head>
<body>
<form action="login.do">
126郵箱登錄<br/><br/>
用戶名:<input type="text" name="username" ><br/>
密 碼:<input type="text" name="password" ><br/>
<select name="saveTime">
<option value="366">一年</option>
<option value="183">半年</option>
<option value="30">一個(gè)月</option>
<option value="7">一周</option>
</select><br/>
<input type="submit" value="登錄" />
</form>
</body>
</html>


main126.jsp代碼如下:
<html>
<head>
<title>測(cè)試cookie</title>
</head>
<body>
<h2>登錄成功,歡迎${username}的到來(lái) 126郵箱</h2><br/>
<h3>測(cè)試cookie的功能
</body>
</html>


failure.jsp代碼如下:
<body>
Login failure <br>
</body>
運(yùn)行效果:
在IE地址欄中輸入http://localhost:8080/LoginFilter/login.html
顯示如下界面:
輸入用戶名:admin 密碼:123456 選擇保存時(shí)間,然后點(diǎn)擊登陸,就會(huì)進(jìn)入以下界面:
在保存時(shí)間內(nèi)再次在IE地址欄中輸入:http://localhost:8080/LoginFilter/login.html
就會(huì)直接進(jìn)入登陸成功界面。如果用戶名或密碼不正確則會(huì)進(jìn)入以下界面:
