需求分析:
环境准备:
1、搭建数据库
2、 准备页面
登陆页面:
body>
<form method="post" action="LoginServlet">
账号:<input type="text" name="username" /><br>
密码:<input type="password" name="password" /><br>
<input type="checkbox" name="auto_login" />自动登陆<br>
<input type="submit" value="登陆" />
</form>
</body>
登录成功以后进入index.jsp页面
<body>
这是首页,
<c:if test="${not empty userBean}">
欢迎您,${userBean.username }
</c:if>
<c:if test="${empty userBean}">
您好,请登录!
</c:if>
</body>
Servlet代码:
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
try {
String username = request.getParameter("username");
String password = request.getParameter("password");
String autoLogin = request.getParameter("auto_login");
UserBean user = new UserBean();
user.setUsername(username);
user.setPassword(password);
UserDao dao = new UserDaoImpl();
UserBean userBean = dao.login(user);
if(userBean != null) {
//页面提交的时候,是否选择了自动登陆
if("on".equals(autoLogin)) {
//发送cookie给客户端
Cookie cookie = new Cookie("auto_login", username + "#" + password);
cookie.setMaxAge(60*60*24*7);//7天有效期
cookie.setPath("/AutoLogin");
response.addCookie(cookie);
}
//登陆成功,进入首页
request.getSession().setAttribute("userBean", userBean);
response.sendRedirect("index.jsp");
}else {
//不成功
request.getRequestDispatcher("login.jsp").forward(request, response);
}
} catch (SQLException e) {
e.printStackTrace();
}
}
过滤器代码
> 过滤器的核心不是完成拦截不给 , 还是放行显示。 它的核心是在放行之前,帮用户完成登录的功能。
* 实现思路:
扫描二维码关注公众号,回复:
4054264 查看本文章
1)先判断session是否有效, 如果有效,就不用取cookie了,直接放行。
2) 如果session失效了,那么就取 cookie。
(1) 没有cookie 放行
(2) 有cookie
>取出来cookie的值,然后完成登录
>把这个用户的值存储到session中
> 放行。
@Override
public void doFilter(ServletRequest req, ServletResponse response, FilterChain chain)
throws IOException, ServletException {
try {
HttpServletRequest request = (HttpServletRequest) req;
//1、先判断,现在session中还有没有那个userBean
UserBean userBean = (UserBean) request.getSession().getAttribute("userBean");
//还有,有效
if (userBean != null) {
chain.doFilter(request, response);
} else {
//代表session失效
//2、看cookie
//来请求的时候,先从请求里面取出cookie,但是cookie里面有很多key-value
Cookie[] cookies = request.getCookies();
//从一堆的cookie中找出我们以前给浏览器发的那个cookie
Cookie cookie = CookieUtil.findCookie(cookies, "auto_login");
//第一次来
if (cookie == null) {
chain.doFilter(request, response);
} else {
//不是第一次
String value = cookie.getValue();
String username = value.split("#")[0];
String password = value.split("#")[1];
//完成登陆
UserBean user = new UserBean();
user.setUsername(username);
user.setPassword(password);
UserDao dao = new UserDaoImpl();
userBean = dao.login(user);
//使用session存这个值到域中,方便下一次未过期前还可以用
request.getSession().setAttribute("userBean", userBean);
chain.doFilter(request, response);
}
}
} catch (Exception e) {
e.printStackTrace();
chain.doFilter(req, response);
}
}
补充:
BeanUtils的使用
添加jar包:commons-beanutils-1.8.3.jar、commons-logging-1.1.1.jar
> BeanUtils.populate(bean, map);
//注册自己的日期转换器
ConvertUtils.register(new MyDateConverter(), Date.class);
//转化数据
Map map = request.getParameterMap();
UserBean bean = new UserBean();
转化map中的数据,放置到bean对象身上
BeanUtils.populate(bean, map);