对于cookie,最主要的当然是读取和设置了,下面分两方面说明.
一、设置
Cookie是通过HttpServletResponse的addCookie方法加入到Set-Cookie应答头中的
例如:
Cookie userCookie = new Cookie("user", "admin")
response.addCookie(userCookie)
和设置有关系的还有以下两个重要方法
1.setMaxAge
设置Cookie过期之前的时间,以秒计。如果不设置该值,则Cookie只在当前会话内有效,而且这些Cookie不会保存到磁盘上。
注意:删除cookie就是通过该方法实现的。将要删除的cookie的过期之前的时间指定为0就可以达到删除该cookie的目的。
2.setPath
设置Cookie适用的路径。如果不指定路径,Cookie将返回给当前页面(JSP页面或者Servlet的映射)所在目录及其子目录下的所有页面。
注意:
A:所有的cookie都是有路径的
B:该方法设置的路径为客户端路径,即“/”代表服务器根目录,而不是WEB应用根目录
C:该方法设置路径时,“/myWeb/”与“/myWeb”是不同的,要特别注意;前者可以关联到服务器的myWeb目录下,而或者则不可以。
D:该方法设置路径时,没有相对目录可言,即不论在哪个目录下设置setPath(“/myWeb/”),该cookie都将关联到服务器的myWeb目录下(setPath(“/myWeb”)则不可以),而不是当前目录的myWeb的子目录下;同样,设置setPath(“myWeb/”)和setPath(“myWeb”)也不能关联到当前目录的myWeb的子目录下
这里有个奇怪的例子,就是在一个web应用下设置的cookie可以在另一个web应用下获得(两个web应用在同一个服务器下)
目录结构:在服务器根目录上有web1和web2两个目录,在web1下有setcookie.jsp和getcookie.jsp、在web2下有getcookie.jsp
web1下的setcookie.jsp
web1下的getcookie.jsp
web2下的getcookie.jsp
先访问web1下的setcookie.jsp,然后分别访问web1和web2下面的getcookie.jsp文件,你会发现奇怪的现象,web1下的getcookie.jsp中user为空而web2下的getcookie.jsp中user却有值,这就实现了从一个web应用下设置的cookie在另一个web应用下获得。
大多数人删除cookie不成功都是因为目录原因。一个典型的原因是在某一个目录中设置了cookie(没有调用setPath方法)却在另一个目录中删除该cookie(其实是调用setMaxAge方法)
二、读取
从客户端读取Cookie时调用的是HttpServletRequest的getCookies方法。该方法返回一个与HTTP请求头中的内容对应的Cookie对象数组。得到这个数组之后,一般是用循环访问其中的各个元素,调用getName检查各个Cookie的名字,直至找到目标Cookie。然后对这个目标Cookie调用getValue,根据获得的结果进行其他处理。
注意:若JSP和Servlet所在目录(Servlet为其映射目录)的父目录中有同名cookie,则request.getCookie()方法得到的Cookie数组中保存的是其父目录中的cookie的信息;
1.设置Cookie1Cookie cookie = new Cookie("key", "value")
2cookie.setMaxAge(60)//设置60秒生存期,如果设置为负值的话,则为浏览器进程Cookie(内存中保存),关闭浏览器就失效。
3cookie.setPath("/test/test2")//设置Cookie路径,不设置的话为当前路径(对于Servlet来说为request.getContextPath() + web.xml里配置的该Servlet的url-pattern路径部分)
4response.addCookie(cookie)
2.读取Cookie
11//该方法可以读取当前路径以及“直接父路径”的所有Cookie对象,如果没有任何Cookie的话,则返回null
22Cookie[] cookies = request.getCookies()
3.删除Cookie
1Cookie cookie = new Cookie("key", null)
2cookie.setMaxAge(0)//设置为0为立即删除该Cookie
3cookie.setPath("/test/test2")//删除指定路径上的Cookie,不设置该路径,默认为删除当前路径Cookie
4response.addCookie(cookie)
简单的代码,
比较简单的登陆的servlet.参考代码
import java.io.IOExceptionimport java.io.PrintWriter
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 Login2 extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
this.doPost(request, response)//调用doPost方法
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
webLogin(request, response)
}
private void webLogin(HttpServletRequest request,
HttpServletResponse response) throws IOException {
response.setContentType("text/htmlcharset=utf-8")//设置字符集
Cookie[] cs = request.getCookies()//读取cookie
if (cs != null && cs.length != 0) {//判断是不是有效的cookie
String cookie_uname = null
String cookie_upswd = null
for (int i = 0 i < cs.length i++) {
if (cs[i].getName().equals("uname")) {//得到用户名
cookie_uname = cs[i].getValue()
}
if (cs[i].getName().equals("upswd")) {//得到密码
cookie_upswd = cs[i].getValue()
}
}
//判断用户名和密码都不能为空
if (cookie_uname != null && cookie_upswd != null) {
System.out.println("试图使用cookie登陆"+cookie_uname+"\t"+cookie_upswd)
//把姓名和密码发到ValidateUser2 进行验证,如果验证成功就跳转到登陆后的页面,否则跳回来
response.sendRedirect("ValidateUser2?uname=" + cookie_uname
+ "&upswd=" + cookie_upswd)
// 验证成功就登陆
// 验证失败, 就返回, ,注意这里可能是死循环.. 需要特别解决和注意
// 因为cookie里的数据不对,返回登陆,返回后登陆又检测到cookie又验证登陆,又验证失败,返回登陆...
// 所以登陆失败.就删除掉cookie
}
}
PrintWriter pw = response.getWriter()
pw.print("<form action='ValidateUser2' method='post' >")
pw.print("用户名<input type='text' name='uname' /><br />")
pw.print("密 码<input type='password' name='upswd' /><br />")
pw.print("<input type='checkbox' name='jizhu' value='jizhu'>1分钟内登陆<br />")//为了测试效果,就记住1分钟
pw.print("<input type='submit' value='提交'/>")
pw.print("</form>")
pw.flush()
pw.close()
}
}
下面是验证密码和账号的 ValidateUser2
首先,用户名和密码是否正确.不正确.那么返回登陆,下面的核心代码就是返回重新登陆时,删除用户名和密码的
String uname = (String) req.getParameter("uname")//从request里获得用户名和密码String upswd = (String) req.getParameter("upswd")
if(验证成功){
跳转到登陆后的界面
}else{
Cookie[] cs = req.getCookies()
if(cs!=null&&cs.length!=0){
for (int i = 0 i < cs.length i++) {
if(cs[i].getName().equals("uname")){
cs[i] = new Cookie("uname",null)
cs[i].setMaxAge(0)
res.addCookie(cs[i])
}else if(cs[i].getName().equals("upswd")){
cs[i] = new Cookie("upswd",null)//删除cookie
cs[i].setMaxAge(0)
res.addCookie(cs[i])
}
}
}
res.sendRedirect("Login2")//返回Login2
}
欢迎分享,转载请注明来源:夏雨云
评论列表(0条)