案例11-自动登录功能的基本实现
1 login.jsp代码
2 web层LoginServlet
package www.test.web.servlet; import java.io.IOException; import java.sql.SQLException; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import www.test.domain.User; import www.test.service.LoginService; public class LoginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // 解决乱码问题 request.setCharacterEncoding("UTF-8"); HttpSession session = request.getSession(); // 获得页面输入的验证 String checkCode_client = request.getParameter("checkCode"); // 获得生成图片的文字的验证码 String checkCode_session = (String) request.getSession().getAttribute("checkcode_session"); // 比对页面的和生成图片的文字的验证码是否一致 if (!checkCode_session.equals(checkCode_client)) { request.setAttribute("loginInfo", "您的验证码不正确"); request.getRequestDispatcher("/login.jsp").forward(request, response); return; } // 获取用户输入的数据 String username = request.getParameter("username"); String password = request.getParameter("password"); LoginService service = new LoginService(); User user = null; try { user = service.login(username, password); } catch (SQLException e) { e.printStackTrace(); } if (user != null) { // 登录成功 // 判断用户是否勾选自动登录 String autoLogin = request.getParameter("autoLogin"); if (autoLogin != null) { Cookie cookie_username = new Cookie("cookie_username", user.getUsername()); Cookie cookie_password = new Cookie("cookie_password", user.getPassword()); // 设置 cookie 的持久化时间 cookie_username.setMaxAge(60 * 60); cookie_password.setMaxAge(60 * 60); // 设置 cookie 的携带路径 cookie_username.setPath(request.getContextPath()); cookie_password.setPath(request.getContextPath()); // 发送 cookie response.addCookie(cookie_username); response.addCookie(cookie_password); } //将登录的用户的 user 对象存到 session 中 session.setAttribute("user", user); //重定向到首页 response.sendRedirect(request.getContextPath()); } else { request.setAttribute("loginInfo", "密码或者用户名不正确"); request.getRequestDispatcher("/login.jsp").forward(request, response); } } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
3 web层AutoLoginFilter
package www.test.web.filter; import java.io.IOException; import java.sql.SQLException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import www.test.domain.User; import www.test.service.LoginService; public class AutoLoginFilter implements Filter { public AutoLoginFilter() { super(); } private FilterConfig filterConfig; public void init(FilterConfig filterConfig) throws ServletException { this.filterConfig = filterConfig; } public void doFilter(ServletRequest req, ServletResponse res, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest) req; HttpServletResponse response = (HttpServletResponse) res; HttpSession session = request.getSession(); // 获得 cookie 中用户名和密码 进行登录的操作 // 定义 cookie_username String cookie_username = null; // 定义 cookie_password String cookie_password = null; // 获得 cookie Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) {// 获得名字是 cookie_username 和 // cookie_password if ("cookie_username".equals(cookie.getName())) { cookie_username = cookie.getValue(); } if ("cookie_password".equals(cookie.getName())) { cookie_password = cookie.getValue(); } } } // 判断 username 和 password 是否是 null if (cookie_username != null && cookie_password != null) { // 登录的代码 LoginService service = new LoginService(); User user = null; try { user = service.login(cookie_username, cookie_password); } catch (SQLException e) { e.printStackTrace(); } // 将登录的用户的 user 对象存到 session 中 session.setAttribute("user", user); } //放行 filterChain.doFilter(request, response); } public void destroy() { } }
4 service层LoginService
package www.test.service; import java.sql.SQLException; import www.test.dao.LoginDao; import www.test.domain.User; public class LoginService { public User login(String username, String password) throws SQLException { LoginDao dao = new LoginDao(); return dao.login(username,password); } }
5 dao层LoginDao
package www.test.dao; import java.sql.SQLException; import org.apache.commons.dbutils.QueryRunner; import org.apache.commons.dbutils.handlers.BeanHandler; import www.test.domain.User; import www.test.utils.C3P0Utils; public class LoginDao { public User login(String username, String password) throws SQLException { QueryRunner qr = new QueryRunner(C3P0Utils.getDataSource()); String sql = "select * from user where username =? and password = ?"; return qr.query(sql, new BeanHandler<User>(User.class), username,password); } }
6 header.jsp代码
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE html> <!-- 登录 注册 购物车... --> <div class="container-fluid"> <div class="col-md-4"> <img src="img/logo2.png" /> </div> <div class="col-md-5"> <img src="img/header.png" /> </div> <div class="col-md-3" style="padding-top: 20px"> <ol class="list-inline"> <c:if test="${empty user }"> <li><a href="login.jsp">登录</a></li> <li><a href="register.jsp">注册</a></li> </c:if> <c:if test="${!empty user }"> <li>欢迎您,${user.username }</li> <li><a href="#">退出</a></li> </c:if> <li><a href="cart.jsp">购物车</a></li> <li><a href="order_list.jsp">我的订单</a></li> </ol> </div> </div> <!-- 导航条 --> <div class="container-fluid"> <nav class="navbar navbar-inverse"> <div class="container-fluid"> <!-- Brand and toggle get grouped for better mobile display --> <div class="navbar-header"> <button type="button" class="navbar-toggle collapsed" data-toggle="collapse" data-target="#bs-example-navbar-collapse-1" aria-expanded="false"> <span class="sr-only">Toggle navigation</span> <span class="icon-bar"></span> <span class="icon-bar"></span> <span class="icon-bar"></span> </button> <a class="navbar-brand" href="#">首页</a> </div> <div class="collapse navbar-collapse" id="bs-example-navbar-collapse-1"> <ul class="nav navbar-nav"> <li class="active"><a href="product_list.htm">手机数码<span class="sr-only">(current)</span></a></li> <li><a href="#">电脑办公</a></li> <li><a href="#">电脑办公</a></li> <li><a href="#">电脑办公</a></li> </ul> <form class="navbar-form navbar-right" role="search"> <div class="form-group" style="position: relative"> <input type="text" class="form-control" placeholder="Search" onkeyup="searchWord(this)"> <div id="showDiv" style="display: none; position: absolute; z-index: 1000; background: #fff; width: 179px; border: 1px solid #ccc;"> </div> </div> <button type="submit" class="btn btn-default">Submit</button> </form> <!-- 完成站内搜索 --> <script type="text/javascript"> function overFn(obj) { $(obj).css("background", "#DBEAF9"); } function outFn(obj) { $(obj).css("background", "#fff"); } function clickFn(obj) { $("#search").val($(obj).html()); $("#showDiv").css("display", "none"); } function searchWord(obj) { //1、 获得输入框的输入的内容 var word = $(obj).val(); //2、 根据输入框的内容去数据库中模糊查询---List<Product> var content = ""; $ .post( "${pageContext.request.contextPath}/searchWord", { "word" : word }, function(data) { if (data.length > 0) { for (var i = 0; i < data.length; i++) { content += "<div style='padding:5px;cursor:pointer'onclick='clickFn(this)' onmouseover='overFn(this)'onmouseout='outFn(this)'>" + data[i] + "</div>"; } $("#showDiv").html(content); $("#showDiv").css("display", "block"); } }, "json"); } </script> </div> </div> </nav> </div>
7 filter配置文件
<filter> <filter-name>AutoLoginFilter</filter-name> <filter-class>www.test.web.filter.AutoLoginFilter</filter-class> </filter> <filter-mapping> <filter-name>AutoLoginFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>