Servle使用cookie实现自动登录,
想做到在用户第一次登录后创建cookie,若用户选择了“下一次自动登录",则在关闭浏览器再打开login.html界面后自动登录至主页面(home.html)
但只能做到两个分开的servlet,一个是创建cookie,如图
@WebServlet("/doLogin.do")
public class auto_login extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
String name = req.getParameter("userName");
String pwd = req.getParameter("pwd");
String page;
if ("caterpillar".equals(name) && "123456".equals(pwd)) {
Cookie cookie = new Cookie("userName", "caterpillar");
if ("on".equals(req.getParameter("autoLogin"))) {
cookie.setMaxAge(60*60);
}
resp.addCookie(cookie);
page = "home.html";
} else {
page = "login.html";
}
resp.sendRedirect(page);
}
}
另一个是验证是否存在cookie且名字与值正确,再进行页面跳转,如图
@WebServlet("/doLogin.do")
public class auto_login extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
Optional<Cookie> userCookie = Optional.ofNullable(req.getCookies())
.flatMap(this::userCookie);
if(userCookie.isPresent()){
Cookie cookie = userCookie.get();
req.setAttribute(cookie.getName(), cookie.getValue());
System.out.println(cookie.getName()+cookie.getValue());
req.getRequestDispatcher("home.html").forward(req,resp);
}else{
resp.sendRedirect("login.html");
}
}
private Optional userCookie(Cookie[] cookies) {
return Stream.of(cookies).filter(cookie -> check(cookie)).findFirst();
}
private boolean check(Cookie cookie){
return "userName".equals(cookie.getName())&&"caterpillar".equals(cookie.getValue());
}
若将二者合并则会浏览器报错,提交响应后无法调用sendRedirect()。如图
@WebServlet("/doLogin.do")
public class auto_login extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
//取得cookie,且名称和值对应
Optional<Cookie> userCookie = Optional.ofNullable(req.getCookies())
.flatMap(this::userCookie);
if (userCookie.isPresent()) {
Cookie cookie = userCookie.get();
req.setAttribute(cookie.getName(), cookie.getValue());
System.out.println(cookie.getName() + cookie.getValue());
req.getRequestDispatcher("home.html").forward(req, resp);
} else {
resp.sendRedirect("login.html");
}
String name = req.getParameter("userName");
String pwd = req.getParameter("pwd");
String page;
if ("caterpillar".equals(name) && "123456".equals(pwd)) {
Cookie cookie = new Cookie("userName", "caterpillar");
if ("on".equals(req.getParameter("autoLogin"))) {
cookie.setMaxAge(60*60);
}
resp.addCookie(cookie);
page = "home.html";
} else {
page = "login.html";
}
resp.sendRedirect(page);
}
private Optional userCookie(Cookie[] cookies) {
return Stream.of(cookies).filter(cookie -> check(cookie)).findFirst();
}
private boolean check(Cookie cookie){
return "userName".equals(cookie.getName())&&"caterpillar".equals(cookie.getValue());
}
}
所以应该如何处理?而且,想问@webServlet的注释应该怎么写?如果写成doLogin.do(login.html界面表单的action值)那么每一次都需要先进入HTML界面,点击登录,然后进入servlet,就不是自动登陆了;如果直接访问doLogin.do又没有访问到HTML界面即实现了自动登录,所以是怎么做到实现自动登录的?
请帮忙修改一下我的代码,谢谢