案例:自動登陸
阿新 • • 發佈:2018-11-13
需求分析:
環境準備:
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(); } }
過濾器程式碼
> 過濾器的核心不是完成攔截不給 , 還是放行顯示。 它的核心是在放行之前,幫使用者完成登入的功能。
* 實現思路:
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);