从主页开始的首次成功登陆的运行流程:index.jsp->CookieServlet(检查是否有cookie记录,如果没有记录跳转登录页面)->PageServlet(登录页面)->LoginServlet(从上个页面获取账号密码,调用service做校验,如果账号密码均正确,设置cookie并跳转主页)->MainServlet(主页)
从主页开始的3天内免登陆流程:index.jsp->CookieServlet(检查是否有cookie记录(uid),如有则调用service校验该用户是否存在,如果存在,跳转主页面)->MainServlet(主页面)

编写CookieServlet
注意:cookie中存的是用户的uid而不是账号密码,这样比较安全
package com.xiaohei.servlet;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import com.xiaohei.pojo.User;
import com.xiaohei.service.CookieService;
import com.xiaohei.service.LoginService;
import com.xiaohei.service.impl.CookieServiceImpl;
import com.xiaohei.service.impl.LoginServiceImpl;
/**
* Servlet implementation class CookieServlet
*/
public class CookieServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码
req.setCharacterEncoding("utf-8");
//设置响应类型及编码
resp.setContentType("text/html;charset=utf-8");
//获取请求
//判断是否有cookie
Cookie[] cks = req.getCookies();
//处理请求
if(null!=cks) {
//从cookie中获取uid
String uid = "";
for(Cookie c : cks) {
if("uid".equals(c.getName())) {
uid = c.getValue();
}
}
//校验用户是否存在(使用uid)
CookieService ls = new CookieServiceImpl();
User u = ls.checkUidService(uid);
if(null!=u) {//存在,跳转主页
resp.sendRedirect("main");
return;
}else {//不存在,跳转登录页面
req.getRequestDispatcher("/page").forward(req, resp);
return;
}
}else {//没有cookie,跳转登录页面
req.getRequestDispatcher("/page").forward(req, resp);
return;
}
}
}
public class CookieServiceImpl implements CookieService{
//校验用户是否存在
@Override
public User checkUidService(String uid) {
CookieDao dao = new CookieDaoImpl();
User user = dao.checkUid(uid);
return user;
}
}
public class CookieDaoImpl implements CookieDao{
@Override
public User checkUid(String uid) {
User user = null;
try(Connection conn = JDBCUtil.getConnection();) {
String sql = "select * from t_user where uid = ? ";
PreparedStatement ps = conn.prepareStatement(sql);
ps.setString(1, uid);
ResultSet set = ps.executeQuery();
while(set.next()) {
user = new User();
int id = set.getInt("uid");
String username = set.getString("uname");
String password = set.getString("pwd");
user.setUid(id);
user.setUsername(username);
user.setPassword(password);
return user;
}
} catch (SQLException e) {
e.printStackTrace();
}
return null;
}
}
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//设置请求编码
req.setCharacterEncoding("utf-8");
//设置响应编码
resp.setContentType("text/html;charset=utf-8");
//获取请求数据
username = req.getParameter("uname");
password = req.getParameter("pwd");
//处理请求
LoginService ls = new LoginServiceImpl();
User user = ls.checkLoginService(username, password);
//响应
if(null != user) {
//创建cookie,实现3天免登陆
//我们不直接存账号密码,而是存用户的uid
Cookie c = new Cookie("uid",user.getUid()+"");
//设置有效期为3天
c.setMaxAge(3*24*3600);
//设置指定url
c.setPath("/200222-CookieLogin/ck");
//添加
resp.addCookie(c);
String username = user.getUsername();
String pwd = user.getPassword();
resp.sendRedirect("main");
return;
}else {
//请求转发
req.setAttribute("msg", "账号或密码错误");
req.getRequestDispatcher("page").forward(req, resp);
return;
}
}
原文:https://www.cnblogs.com/Scorpicat/p/12349004.html