我在前些天刚开始接触JavaWeb的时候,感觉这写很高大上的东西自己怎么可能做出来,从我刚开始做出我第一个登陆的代码的时候可以说是历经了千辛万苦哈哈,但是还好做出来了,从那往后就感觉自己可以做的更多一点,后来啊原生的做了注册啊验证啊等等,感觉没有像开始那么遥不可及了,然后我就在想那些自动登录是怎么做出来的呢,初学几天肯定没有太多的思路,然后我就把那些基础学完然后再考虑这些问题就感觉很简单了。
@author Wrial
我先来缕一缕思路,因为我感觉吧思路是最重要的,没有思路就没有了灵魂。
自动登陆的原理其实还是页面信息的呈现,但是登陆和未登陆又不是同一个效果,当然处理方法也不同,因此这就用到了过滤器,对它的状态进行筛选和放行。
步骤:(以Jsp+servlet+Filter开发,当然前后端分离也很好实现)
1.做好准备工作,建立好数据库,并且做好Dao和Service(如果自己测试或者功能少的话可以不用做Service)
2.新建一个Login.jsp和一个Success.jsp作为登陆和呈现的页面(要有自动登陆的选项)
3.建立一个servlet来控制逻辑功能
(1)如果没有收到登陆信息或者信息不符合就重新登陆(提示信息Json)
(2)如果收到信息并且符合就存在Session里,并设置Session的生存时间
(3)如果勾选了自动登录就将信息存在Session和Cookie里(此处牵扯到生命周期,如果生命周期不懂的可以看看书或者其他博客)
4.新建一个Filter过滤器(负责放行和逻辑过滤)
(1)先检查Session里有没有进来的数据,如果有的话就**放行**,交给Servlet处理
(2)如果Session不存在但是有Cookie(Session失效或者是关闭了浏览器),把存的Cookie拿出来并且再给Session放一份,然后**放行**,然后到Servlet处理
(3)如果是没有输入信息或者输入信息不符合的就**放行**,然后让Servlet去处理
逻辑上是分析完了,话不多说直接上核心代码了,再页面的输出用的是EL表达式,当然前后端分离这个就不归你管了哈哈哈
Servlet代码,如果有特定的情况或者特定的页面需要这个功能,可以设置Cookie的范围
/*
*@author Wrial
*/
package Servlet;
import dao.UserDao;
import daoimpl.UserDaoImp;
import domain.UserBean;
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 java.io.IOException;
import java.sql.SQLException;
@WebServlet(name = "LoginServlet", urlPatterns = "/LoginServlet")
public class LoginServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
String username = request.getParameter("username");
String password = request.getParameter("password");
String autoLogin = request.getParameter("auto_login");
System.out.println(username + "==" + password + "==" + autoLogin);
UserBean user = new UserBean();
user.setUsername(username);
user.setPassword(password);
UserDao dao = new UserDaoImp();
UserBean userBean = dao.login(user);
if (userBean != null) {
if ("on".equals(autoLogin)) {
Cookie cookie = new Cookie("autoLogin", username + "###" + password);
//cookie的存活时间
cookie.setMaxAge(60 * 60 * 12 * 7);
//cookie有效的路径或者是项目
cookie.setPath(request.getContextPath());
response.addCookie(cookie);
}
//有信息
request.getSession().setAttribute("userBean", userBean);
response.sendRedirect("success.jsp");
} else {
request.getRequestDispatcher("index.jsp").forward(request, response);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
}
过滤器代码,值得注意的是Servlet中的request的类型和Filter是不同的需要进行强转,这个当时注册再xml中注册了
package filter;
/*
*@author Wrial
*/
import Util.CookieUtil;
import dao.UserDao;
import daoimpl.UserDaoImp;
import domain.UserBean;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;
import java.sql.SQLException;
@WebFilter(filterName = "AutoLoginFilter")
public class AutoLoginFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//强转为HttpServletRequest才能取cookie和session
HttpServletRequest request = (HttpServletRequest) req;
UserBean userBean = (UserBean) request.getSession().getAttribute("userBean");
if (userBean != null) {
chain.doFilter(request,resp);
} else {
//从请求中获得cookie
Cookie[] cookies = request.getCookies();
//找到我们自己放进的cookie
Cookie cookie = CookieUtil.findCookie(cookies, "auto_lohin");
if (cookie == null) {
chain.doFilter(request, resp);
} else {
try {
String value = cookie.getValue();
String username = value.split("###")[0];
String password = value.split("###")[1];
UserBean user = new UserBean();
user.setPassword(password);
user.setUsername(username);
UserDao dao = new UserDaoImp();
userBean = dao.login(userBean);
request.getSession().setAttribute("userBean", userBean);
chain.doFilter(request, resp);
} catch (SQLException e) {
e.printStackTrace();
chain.doFilter(request, resp);
}
}
}
}
public void init(FilterConfig config) throws ServletException {
}
}
今天的分享就到这了,感觉写的不错的点个赞加个关注会经常更新,有什么不对的地方或者不懂的地方欢迎留言讨论。