这篇来做一个cookie的练习场景,就是如何利用cookie来实现登录过程中记住用户名的过程。我们在很多web网站中的登录页面,看到有一个勾选项,叫记住登录。一般记住登录有时间周期,有七天,一个月等。只要用户在浏览器登录一次,第二天或者过几天再次打开登录页面,发现用户名和密码都自动填充了,只需要点击登录。我们来模拟登录页面记住用户名的情况,其实csdn就有这个记住用户名和密码。
需求
实现登录页面记住用户名的需求
上面这个登录就是第二次登录,自动记住用户名,用户名不需要输入。这个场景,在很多公司的内部网络的单点登录经常看得到,记住密码场景不多,很多公司要求员工三个月更换一次密码。
1.项目文件结构和代码内容
在src下写两个java类,都实现HttpServlet接口。一个LoginServlet.java实现登录页面和记住用户名的逻辑,第二个DoLogin.java实现判断登录是否成功,而且用户勾选了记住用户名,才做添加cookie处理。
LoginServlet.java内容
package com.anthony.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
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 {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
String userName = "";
String checked = "";
//得到客户端保存的cookie数据
Cookie[] cookies = req.getCookies();
for (int i = 0; cookies != null && i < cookies.length; i++) {
if("userName".equals(cookies[i].getName())) { //判断是不是记录用户名的cookie
userName = cookies[i].getValue();
checked = "checked='checked'";
}
}
//使用PrintWriter对象画出一个登录表单
out.write("");
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
DoLogin.java内容
package com.anthony.servlet;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Date;
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 DoLogin extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=UTF-8");
req.setCharacterEncoding("UTF-8");
PrintWriter out = resp.getWriter();
//获取表单数据
String name = req.getParameter("userName");
String pwd = req.getParameter("pwd");
String rember = req.getParameter("remenberUser");
Cookie ck = new Cookie("userName", name);
ck.setPath("/");
//处理业务逻辑
//这里不连数据库,就模拟登录成功
if("Anthony".equals(name) && "123".equals(pwd)) {
//判断,只有勾选了才记录cookie
if(rember != null) {
ck.setMaxAge(60*60*24*7); //记住用户名7天
}else {
ck.setMaxAge(0); //删除cookie
}
resp.addCookie(ck);
out.write("登录成功!
");
}else {
out.write("登录失败!
");
//设置2秒之后,跳转到登录页面
resp.setHeader("refresh", "2;url="+req.getContextPath()+"/cookie/login");
}
//分发转向
}
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
doGet(req, resp);
}
}
web.xml内容
cookieDemo1
com.anthony.servlet.CookieDemo1
cookieDemo1
/cookie/demo1
loginServlet
com.anthony.servlet.LoginServlet
loginServlet
/cookie/login
doLogin
com.anthony.servlet.DoLogin
doLogin
/cookie/doLogin
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
2.测试
打开浏览器,访问LoginServlet.java映射的URLhttp://localhost:8080/Servlet01/cookie/login
第一次登录,没有cookie,需要用户输入Anthony/123这个用户名和密码,因为我们代码中写死了这个判断。
输入代码中判断的用户名和密码,记得勾选记住用户名,点击登录,跳转到第二个servlet,显示登录成功
回到http://localhost:8080/Servlet01/cookie/login
上面代码逻辑是记住用户名一个星期,cookie文件保存本地一个星期后才过期。
通过本篇的记住用户名的练习,我们知道了web页面中类似场景的代码实现过程。如果把上面用户名和密码,通过jdbc去数据库查询,然后判断登录成功,这个就是一个真实生产环境的代码。