java代碼實現自動登錄功能


通常我們登錄某網站,會有選擇保存幾天,或者是幾個星期不用登錄,之后輸入該網站地址無需登錄直接進入主頁面,那么這就叫做自動登錄,怎么實現呢,下面我以一個小例子來演示一下

登錄頁面:login.jsp

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
  <head>
  </head>
  <body>
  <form action="login.do">
    用戶名:<input type="text" name="username" ><br/>
    密    碼:<input type="text" name="password" ><br/>
    
    <input type="submit" value="登錄" /><select name="saveTime">
    <option value="366">一年</option>
    <option value="183">半年</option>
     <option value="30">一個月</option> 
     <option value="7">一周</option>
    </select>
  </form>
  </body>
</html>

 

那么從上面可看到可選擇保存自動登錄的期限,可以是一年,半年,一個月,一周,當然這都是以天為單位的

服務類:LoginService

package com.login.servlet;

public class LoginService {

	public static boolean login(String username, String password) {
		if ("admin".equals(username) && "123456".equals(password)) {
			return true;
		} else {
			return false;
		}
	}
}

業務處理servlet:LoginServlet

 
package com.login.servlet;

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 LoginServlet extends HttpServlet {


	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
        this.doPost(request, response);
	}

	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		 String username=request.getParameter("username");
		   String password=request.getParameter("password");
		   String savetime=request.getParameter("saveTime");
		   if(LoginService.login(username, password)){
			   if(null!=savetime&&!savetime.isEmpty()){
				   int saveTime=Integer.parseInt(savetime);//這里接受的表單值為天來計算的
				   int seconds=saveTime*24*60*60;
				   Cookie cookie = new Cookie("user", username+"=="+password);
				   cookie.setMaxAge(seconds);					
				   response.addCookie(cookie);
			   }
			   request.setAttribute("username",username);
			   request.getRequestDispatcher("/main.jsp").forward(request,response);
		   }else{
			   request.getRequestDispatcher("/index.jsp").forward(request,response);
		   }
	}

}

 

看清上面處理Cookie的方式步驟:其實這是為第一次登錄該網站時【前提是選擇了保存自動登錄期限時間】處理Cookie,只要這一步處理成功,以后都無需經過這個Servlet因為我們接下來要在請求到達前,從Cookie中取出我們的用戶名和密碼,這樣的話就需要一個過濾器了

 
package com.login.servlet;

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;

public class IndexFilter implements Filter {

	public void destroy() {
		// TODO Auto-generated method stub

	}

	public void doFilter(ServletRequest arg0, ServletResponse arg1,
			FilterChain arg2) throws IOException, ServletException {
		HttpServletRequest request = (HttpServletRequest) arg0;
		HttpServletResponse response = (HttpServletResponse) arg1;
		Cookie[] cookies = request.getCookies();
		String[] cooks = null;
		String username = null;
		String password = null;
		if (cookies != null) {
			for (Cookie coo : cookies) {
				String aa = coo.getValue();
				cooks = aa.split("==");
				if (cooks.length == 2) {
					username = cooks[0];
					password = cooks[1];
				}
			}
		}
		if (LoginService.login(username, password)) {
			request.getSession().setAttribute("username",username);
			response.sendRedirect("main.jsp");
			//request.getRequestDispatcher("/main.jsp").forward(request, response);
		}else{
			arg2.doFilter(request,response );
		}
	

	}

	public void init(FilterConfig arg0) throws ServletException {
		// TODO Auto-generated method stub

	}

}

 

我這里所說的請求到達之前,不是指的某個路徑匹配的servlet而是指的就是在輸入網址到達登錄頁面前就要進行自動登錄的處理,那么web.xml中應該怎么配置呢

 
<?xml version="1.0" encoding="UTF-8"?>
<web-app version="2.5" 
	xmlns="http://java.sun.com/xml/ns/javaee" 
	xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
	xsi:schemaLocation="http://java.sun.com/xml/ns/javaee 
	http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
  <filter>
  <filter-name>loginFilter</filter-name>
  <filter-class>com.login.servlet.IndexFilter</filter-class>
  </filter>
  <filter-mapping>
  <filter-name>loginFilter</filter-name>
  <url-pattern>/index.jsp</url-pattern>
  </filter-mapping>
  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>com.login.servlet.LoginServlet</servlet-class>
  </servlet>

  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login.do</url-pattern>
  </servlet-mapping>
  <welcome-file-list>
    <welcome-file>login.jsp</welcome-file>
  </welcome-file-list>
</web-app>

 看見了沒有,上面的filter匹配路徑只是針對一個頁面,與通常寫/*匹配所有請求到達之前是不一樣的寫法哦

  主頁面:main.jsp

 
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<html>
  <head>
     <title>My JSP 'maiin.jsp' starting page</title>
  </head>
  <body>
    登錄成功,歡迎${username}的到來
  </body>
</html>

 

 輸入地址:http://localhost:8080/WebApp/login.jsp出現登錄頁面

 然后輸入:admin,123456 ,選擇一個保存日期

 這樣第一次登錄成功之后,是經由LoginServlet處理了,由於選擇了日期,所以Cookie中保存了用戶信息,所以之后再輸入同樣地址后,不會出現登錄頁面,就不再經過LoginServlet處理【因為LoginServlet處理的是登陸頁面上登錄按鈕請求的】,而直接提前交由IndexFilter處理,直接進入主頁面,明白了么


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM