好記性不如爛筆頭34-利用java過濾器實現使用者自動登入
阿新 • • 發佈:2019-02-01
在很多的網站中,都有自動登入的功能,實現自動登入的方法有很多種方式,利用JAVA過濾器也能夠實現使用者的自動登入。
1、 實現使用者自動登入的基本原理
在使用者登陸成功後,傳送一個cookie給客戶端,cookie的值為使用者名稱和md5加密後的密碼。
編寫一個AutoLoginFilter,這個filter檢查使用者是否帶有指定名稱的cookie來,如果有,則查詢cookie的使用者名稱和密碼是否和資料庫匹配,匹配則向session中存入user物件(即使用者登陸標記),以實現程式完成自動登陸。
在下面的示例中,為了簡單處理,都是用明碼進行簡單處理。在實際專案中千萬不要依樣畫葫蘆。
2、 用JAVA過濾器實現使用者自動登入的原始碼-登入模組
package com.autoLogin;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
/**
* 通過過濾器實現自動登入-登入模組
* @author 範芳銘
*/
public class LoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
String username = request.getParameter("name");
String password = request.getParameter("pass");
response.setCharacterEncoding("UTF-8" );//設定將字元以"UTF-8"編碼輸出到客戶端瀏覽器
//通過設定響應頭控制瀏覽器以UTF-8的編碼顯示資料,瀏覽器顯示亂碼的解決方法
response.setHeader("content-type", "text/html;charset=UTF-8");
PrintWriter out = response.getWriter();
User user = null;
user = (User)request.getSession().getAttribute("user");
if (user == null){ //如果不能從過濾器中獲取user物件,那麼看是否使用者輸入了登入必要的資訊
user = new User();
user.setName(username);
user.setPass(password);
}
//驗證,簡化處理
if((user.getName() == null) || (user.getPass() == null)){
out.print("使用者名稱或密碼不對!!");
return;
}else{ //有內容就當成功
request.getSession().setAttribute("user", user);
//傳送自動登陸cookie給客戶端瀏覽器進行儲存
sendAutoLoginCookie(request,response,user);
out.print("登入成功");
//request.getRequestDispatcher("/index.jsp").forward(request, response);
}
}
//傳送自動登入cookie給客戶端瀏覽器
private void sendAutoLoginCookie(HttpServletRequest request, HttpServletResponse response, User user) {
if (request.getParameter("logintime")!=null) {
int logintime = Integer.parseInt(request.getParameter("logintime"));
//建立cookie,cookie的名字是autologin,值是使用者登入的使用者名稱和密碼,用.進行分割
Cookie cookie = new Cookie("autologin",user.getName() + "." + user.getPass());
//設定cookie的有效期
cookie.setMaxAge(logintime);
//設定cookie的有效路徑
cookie.setPath(request.getContextPath());
//將cookie寫入到客戶端瀏覽器
response.addCookie(cookie);
}
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}
3、 用JAVA過濾器實現使用者自動登入的原始碼-過濾器模組
package com.autoLogin;
import java.io.IOException;
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;
/**
* 通過過濾器實現自動登入-過濾器
* @author 範芳銘
*/
public class AutoLoginFilter implements Filter {
public void doFilter(ServletRequest req, ServletResponse resp,
FilterChain chain) throws IOException, ServletException {
HttpServletRequest request = (HttpServletRequest) req;
HttpServletResponse response = (HttpServletResponse) resp;
// 如果已經登入了,就直接chain.doFilter(request, response)放行
if (request.getSession().getAttribute("user") != null) {
chain.doFilter(request, response);
System.out.println("使用者名稱稱和密碼匹配,自動登入成功");
return;
}
// 1.得到使用者帶過來的authlogin的cookie
String value = null;
Cookie cookies[] = request.getCookies();
for (int i = 0; cookies != null && i < cookies.length; i++) {
if (cookies[i].getName().equals("autologin")) {
value = cookies[i].getValue();
}
}
// 2.得到 cookie中的使用者名稱和密碼
if (value != null) {
String username = value.split("\\.")[0];
String password = value.split("\\.")[1];
// 3.根據使用者名稱和密碼獲取使用者資訊,這裡簡單處理
User user = new User();
String name = user.getName();
String pass = user.getPass();
// 4.檢查使用者帶過來的md5的密碼和資料庫中的密碼是否匹配,這裡直接用明碼示例
if (username.equals(name) & password.equals(pass)) {
request.getSession().setAttribute("user", user);
System.out.println("使用者名稱稱和密碼匹配");
} else {
System.out.println("使用者名稱稱和密碼不對,不能自動登入。");
}
}
chain.doFilter(request, response);
}
public void destroy() {
}
public void init(FilterConfig filterConfig) throws ServletException {
}
}
4、 用JAVA過濾器實現使用者自動登入的原始碼-使用者模組
package com.autoLogin;
/**
* 通過過濾器實現自動登入-簡單使用者模組-僅用於示例
* @author 範芳銘
*/
public class User {
private String name;
private String pass;
public User(){
this.name = "ffm";
this.pass = "pass";
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getPass() {
return pass;
}
public void setPass(String pass) {
this.pass = pass;
}
}
5、 修改web.xml
<filter>
<filter-name>easyFilter</filter-name>
<filter-class>com.autoLogin.AutoLoginFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>easyFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<servlet>
<servlet-name>login</servlet-name>
<servlet-class>com.autoLogin.LoginServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>login</servlet-name>
<url-pattern>/login</url-pattern>
</servlet-mapping>
6、 用JAVA過濾器實現使用者自動登入的原始碼-移除cookie模組
有的業務不需要使用cookie,需要進行移除,可以用下面的類進行處理:
``````
package com.autoLogin;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class CancelAutoLoginServlet extends HttpServlet {
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
// 移除儲存在session中的user
request.getSession().removeAttribute("user");
// 移除自動登入的cookie
removeAutoLoginCookie(request, response);
// 登出使用者後跳轉到登入頁面
request.getRequestDispatcher("/login.jsp").forward(request, response);
}
/**
* @Description: 刪除自動登入cookie,
* JavaWeb中刪除cookie的方式就是新建立一個cookie,新建立的cookie與要刪除的cookie同名,
* 設定新建立的cookie的cookie的有效期設定為0,有效路徑與要刪除的cookie的有效路徑相同
*/
private void removeAutoLoginCookie(HttpServletRequest request,
HttpServletResponse response) {
// 建立一個名字為autologin的cookie
Cookie cookie = new Cookie("autologin", "");
// 將cookie的有效期設定為0,命令瀏覽器刪除該cookie
cookie.setMaxAge(0);
// 設定要刪除的cookie的path
cookie.setPath(request.getContextPath());
response.addCookie(cookie);
}
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
}