filter之自動登入
阿新 • • 發佈:2019-01-14
jsp頁面
<%@ page language="java" contentType="text/html; charset=utf-8" pageEncoding="utf-8"%> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <title>Insert title here</title> </head> <body> <form action="${pageContext.request.contextPath}/login" method="get"> <table> <tr> <td>使用者名稱</td> <td><input type="text" name="username"/></td> </tr> <tr> <td>密碼</td> <td><input type="text" name="password"/></td> </tr> <tr> <td colspan="1"><input type="checkbox" name="saveName" value="ok">記住使用者名稱</td> <td colspan="1"><input type="checkbox" name="autoLogin" value="ok">自動登入</td> </tr> <tr> <td colspan="2"><input type="submit"></td> </tr> </table> </form> <script type="text/javascript"> onload=function(){ var s = "${cookie.savename.value}"; s = decodeURI(s); //alert(s); document.getElementsByName("username")[0].value=s; } </script> </body> </html>
servlet
package com.huida.web.servlet; import java.io.IOException; import java.net.URLEncoder; 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 com.huida.bean.User; import com.huida.constant.Constant; import com.huida.service.UserService; /** * 登入 */ public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { //0設定編碼 request.setCharacterEncoding("utf-8"); //1.獲取使用者名稱和密碼 String username = request.getParameter("username"); String password = request.getParameter("password"); System.out.println(username+"...."+password); //2.呼叫service User user=null; try { user = new UserService().login(username, password); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } //3.判斷user是否為空 if(user==null){ //System.out.println("沒有此使用者"); request.getRequestDispatcher("/login.jsp").forward(request, response); //System.out.println("為空了...."); return; }else{ //System.out.println("有此使用者"); //不為空 跳轉到sucess.jsp request.getSession().setAttribute("user", user); //判斷是否勾選了自動登入 若勾選了需要將使用者名稱和密碼放入到cookie中,寫回瀏覽器 cookie不支援中文 if(Constant.IS_AUTO_LOGIN.equals(request.getParameter("autoLogin"))){ Cookie c = new Cookie("autologin",username+"-"+password); c.setMaxAge(3600); c.setPath(request.getContextPath()+"/"); response.addCookie(c); } //判斷是否勾選 了記住使用者名稱 //Constant.IS_SAVE_NAME.equals(request.getParameter("saveName")) //Constant.IS_SAVE_NAME.equals(request.getParameter("saveName")) if(true){ System.out.println("進來了"); //建立cookie Cookie c = new Cookie("savename", URLEncoder.encode(username,"utf-8")); c.setMaxAge(3600); c.setPath(request.getContextPath()+"/"); response.addCookie(c); } //頁面重定向 response.sendRedirect(request.getContextPath()+"/success.jsp"); } } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request, response); } }
filter
package com.huida.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 com.huida.bean.User; import com.huida.service.UserService; import com.huida.utils.CookUtils; import net.sf.json.JSON; import net.sf.json.JSONArray; public class AutoLoginFilter implements Filter{ @Override public void destroy() { // TODO Auto-generated method stub } @Override public void doFilter(ServletRequest arg0, ServletResponse arg1, FilterChain arg2) throws IOException, ServletException { //強轉 HttpServletRequest request = (HttpServletRequest)arg0; HttpServletResponse response = (HttpServletResponse)arg1; //判斷session中有無登入使用者沒有的話繼續自動登入 User user = (User) request.getSession().getAttribute("user"); //System.out.println(JSONArray.fromObject(user)); if(user==null){ //沒用使用者 需要自動登入 //判斷訪問的資源是否有和登入註冊相關,若相關則不需要自動登入 String path = request.getRequestURI(); //System.out.println(path); if(!path.contains("/login")){ //獲取指定的cookie Cookie c = CookUtils.getCookieByName("autologin",request.getCookies()); //判斷cookie是否為空 //若不為空 獲取值(username password) 呼叫service完成登入 if(c!=null){ String username = c.getValue().split("-")[0]; String password = c.getValue().split("-")[1]; //呼叫service完成登入 //User user = null; try { user = new UserService().login(username, password); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } if(user!=null){ //將user放入session中 request.getSession().setAttribute("user", user); } } } } arg2.doFilter(arg0, arg1); } @Override public void init(FilterConfig arg0) throws ServletException { // TODO Auto-generated method stub } }