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