Servle使用cookie实现自动登录

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 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 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界面即实现了自动登录,所以是怎么做到实现自动登录的?
请帮忙修改一下我的代码,谢谢

首先要判断userCookie是否为空,如果为null返回登录页面,否则执行自动登录。

protected void service(HttpServletRequest req, HttpServletResponse resp)
            throws ServletException, IOException {
            //取得cookie,且名称和值对应
            String user="";
              String pass="";
              //读取cookie
              Cookie[] cookies = request.getCookies();
              if(cookies!=null){
                  for(int i=0;i<cookies.length;i++){
                      //读取username
                      if(cookies[i].getName().equals("userName")){
                          //解码操作:URLDecoder.decode()方法
                          user = URLDecoder.decode(cookies[i].getValue());    
                      }
                      //读取密码
                      if(cookies[i].getName().equals("pwd")){
                          pass = URLDecoder.decode(cookies[i].getValue());
                      }
                  }
                  req.setAttribute("userName", user);
                  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);


img

你得14和16行后面都加return就好了,能解决你那个报错,但是你得逻辑看起来好像还不对,我感觉你15行那个else的逻辑不应该要了。
按照你这个逻辑,它就应该是两个servlet,第一个是跳转页面用的,在这个servlet里判断有没有cookie,如果有,就直接登录成功了。
你现在这个doLogin.do是点登录按钮之后触发的,那还得是用户看到登录页面了点按钮才能触发,所以它应该是拆开的,你现在这个不对。
或者这个cookie你放登录拦截器里验证