天天看點

單點登入(一)使用Cookie+File實作單點登入源碼分享:連結: http://pan.baidu.com/s/1eQheDpS 密碼: gn9d一 實作原理二 知識點解析三 步驟:四 拓展知識

本文使用Cookies+Filter實作www.taobao.tgb.com 和 www.tianmao.tgb.com的單點登入。

源碼分享:連結: http://pan.baidu.com/s/1eQheDpS 密碼: gn9d

一 實作原理

使用使用者名和密碼登入taobao後,會将使用者名存儲在Session和Cookie中各一份。當使用者登入tianmao時,可直接從Cookie中擷取使用者名和密碼,不需要二次登陸。

二 知識點解析

1.本例使用tomcat做伺服器,綁定1個域名,且此域名對應2個不同的項目:一個是taobao,另一個是tianmao。

2.通路網址時,不需要輸入端口号。

三 步驟:

一)利用MyEclipse建立Web Service Project,名稱為:sso_cookie_filter,項目目錄結構

單點登入(一)使用Cookie+File實作單點登入源碼分享:連結: http://pan.baidu.com/s/1eQheDpS 密碼: gn9d一 實作原理二 知識點解析三 步驟:四 拓展知識

二)index.jsp使用者登入頁

<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>

<title>歡迎使用[tianmao]網站</title>
</head>
歡迎使用[tianmao]網站<br><br>
<body>
	<c:choose>
		<c:when test="${not empty sessionScope.user}">
    			歡迎你:${sessionScope.user}
  		</c:when>
		<c:otherwise>
    			你還沒有登入,請先登入:
    	         <form action="<%=path%>/login" method="post">
				userName:<input type="text" name="userName"><br>
				password:<input type="password" name="password"><br> 
				<input	type="submit" value="登入">
		 </form>
		</c:otherwise>
	</c:choose>
</body>
</html>
           

三)web.xml用于配制:攔截器、Servlet

<!--  開始:趙栗婧-建立Filter過濾器,用于攔截所有的請求-->
	<filter>
		<filter-name>autoLogin</filter-name>
		<filter-class>com.tgb.sso.filter.AutoLoginFilter</filter-class>
	</filter>
	<filter-mapping>
		<filter-name>autoLogin</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>
	<!--  結束:趙栗婧-建立Filter過濾器,用于攔截所有的請求-->
	<!--  開始:趙栗婧-建立Servlet-->
	<servlet>
		<servlet-name>LoginServlet</servlet-name>
		<servlet-class>com.tgb.sso.servlet.LoginServlet</servlet-class>
	</servlet>
	<servlet-mapping>
		<servlet-name>LoginServlet</servlet-name>
		<url-pattern>/login</url-pattern>
	</servlet-mapping>
	<!--  結束:趙栗婧-建立Servlet-->
	
           

四)編寫過濾器:AutoLoginFilter.java

/**
 * 自定義過濾器:使用者攔截使用者登入資訊
 * 
 * @author lizi
 * @version 1.0.0 2015年7月14日19:29:45
 */
public class AutoLoginFilter implements Filter {
	

	// 攔截所有使用者請求。
	// 首先判斷session中是否存在使用者名。
	// 若session中不存在使用者名,則判斷Cookies中是否存在使用者名
	// 若Cookie中存在使用者名,則将其放在session中。
	public void doFilter(ServletRequest req, ServletResponse resp,
			FilterChain chain) throws IOException, ServletException {

		// 攔截使用者請求
		HttpServletRequest request = (HttpServletRequest) req;
		// 判斷session中,是否為空
		// 若session中user為空,
		if (request.getSession().getAttribute("user") == null) {
			// 擷取request中所有的Cookie,并放在數組中
			Cookie[] cs = request.getCookies();
			// 若Cookie不為空,則周遊所有的Cookie中所有的記錄
			if (cs != null && cs.length > 0) {
				for (Cookie c : cs) {
					String cName = c.getName();
					// 查找目前使用者的Cookie(此處為sso辨別)
					if (cName.equals("sso")) {
						// 擷取sso中對應的值,即:使用者名userName
						String userName = c.getValue();
						// 把使用者名userName放在session中
						request.getSession().setAttribute("user", userName);
					}
				}
			}
		}
		// 傳回目前的請求
		chain.doFilter(request, resp);
	}

	

}
           

五)編寫Servlet:LoginServlet.java

/**
 * 使用者登入Servlet
 * 
 * @author lizi
 * @version 1.0.0 2015年7月14日19:29:45
 */
public class LoginServlet extends HttpServlet {

	// 若使用者送出的是Get請求,則将此請求轉發給doPost
	public void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		this.doPost(request, response);
	}

	// 接受使用者的Post請求
	public void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {

		// 擷取使用者輸入的使用者名
		String userName = request.getParameter("userName");
		// 擷取使用者輸入的面
		String password = request.getParameter("password");
		// 若使用者名和密碼一緻,則登入成功(此處實際上,應該查詢資料庫)
		if (userName != null && password != null) {
			if (userName.equals(password)) {
				// 把使用者名存儲在session中
				request.getSession().setAttribute("user", userName);

				// 向用戶端寫入cookie,名為為sso
				Cookie c = new Cookie("sso", userName);
				c.setMaxAge(3600);// 設定cookie有效時間為1小時
				c.setDomain(".tgb.com");// www.taobao.tgb.com
										// www.tianmao.tgb.com
				c.setPath("/");// 攔截所有的請求
				response.addCookie(c);// 把cookie添加到response中
			}
		}
		// 跳轉到index.jsp頁面
		response.sendRedirect(request.getContextPath() + "/index.jsp");
	}

	
}
           

六)Demo效果

在taobao網站中輸入:使用者名為taobao ,密碼為taobao ,後點選登入。後顯示:歡迎界面

此時重新整理tianmao網頁,可直接顯示:歡迎界面(無需登入)

單點登入(一)使用Cookie+File實作單點登入源碼分享:連結: http://pan.baidu.com/s/1eQheDpS 密碼: gn9d一 實作原理二 知識點解析三 步驟:四 拓展知識
單點登入(一)使用Cookie+File實作單點登入源碼分享:連結: http://pan.baidu.com/s/1eQheDpS 密碼: gn9d一 實作原理二 知識點解析三 步驟:四 拓展知識
單點登入(一)使用Cookie+File實作單點登入源碼分享:連結: http://pan.baidu.com/s/1eQheDpS 密碼: gn9d一 實作原理二 知識點解析三 步驟:四 拓展知識

七)檢視360浏覽器中的Cookie:

      工具-->選項-->進階設定-->内容設定(内容設定...)-->Cookie(所有Cookie和網站資料)

      此處可以檢視到:

           為tgb.com儲存了一份cookie

           為taobao儲存了一份session

           為tianmao儲存了一份session

單點登入(一)使用Cookie+File實作單點登入源碼分享:連結: http://pan.baidu.com/s/1eQheDpS 密碼: gn9d一 實作原理二 知識點解析三 步驟:四 拓展知識
單點登入(一)使用Cookie+File實作單點登入源碼分享:連結: http://pan.baidu.com/s/1eQheDpS 密碼: gn9d一 實作原理二 知識點解析三 步驟:四 拓展知識

四 拓展知識

以往把項目直接部署在tomcat中,然後通過:localhost:8080/projectname/methodname進行通路。

1.本例使用tomcat做伺服器,綁定1個域名,且此域名對應2個不同的項目:一個是taobao,另一個是tianmao。

2.通路網址時,不需要輸入端口号。

一)通過域名進行通路(www.taobao.tgb.com 、 www.tianmao.tgb.com),則需要做如下配置:

1.tomcat預設的啟動的項目目錄是:tomcat\webapps。

此處需要在tomcat安裝目錄中,建立兩個檔案夾:taobao、tianmao(如圖所示)

後把MyEclipse中的WEB-INF整個檔案夾拷貝至taobao和tianmao檔案夾中,并更改WEB-INF名稱為ROOT

單點登入(一)使用Cookie+File實作單點登入源碼分享:連結: http://pan.baidu.com/s/1eQheDpS 密碼: gn9d一 實作原理二 知識點解析三 步驟:四 拓展知識

2.修改C:\Windows\System32\drivers\etc\hosts檔案,并添加兩個節點

單點登入(一)使用Cookie+File實作單點登入源碼分享:連結: http://pan.baidu.com/s/1eQheDpS 密碼: gn9d一 實作原理二 知識點解析三 步驟:四 拓展知識

3.修改C:\tomcat\apache-tomcat-6.0.35\conf\server.xml檔案,并添加兩個Host節點

<Host appBase="webapps" autoDeploy="true" name="localhost" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false"></Host>	  
      <!--開始:趙栗婧-添加兩個Host節點:用于tomcat預設通路的目錄-->
      <Host appBase="taobao"  autoDeploy="true" name="www.taobao.tgb.com"  unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false"></Host>
      <Host appBase="tianmao" autoDeploy="true" name="www.tianmao.tgb.com" unpackWARs="true" xmlNamespaceAware="false" xmlValidation="false"></Host>
      <!--結束:趙栗婧-添加兩個Host節點:用于tomcat預設通路的目錄-->
           

到此為止:

若要通路taobao,則需要浏覽器中輸入:www.taobao.tgb.com:8080

若需要通路tianmao,則需要浏覽器中輸入:www.tianmao.tgb.com:8080

二)通路時,去掉端口号8080呢?

修改C:\tomcat\apache-tomcat-6.0.35\conf\server.xml檔案,中HTTP的端口号,由8080--->80

原來:

<Connector connectionTimeout="20000" port="8080" protocol="HTTP/1.1" redirectPort="8443"/>
           

修改後:

<Connector connectionTimeout="20000" port="80" protocol="HTTP/1.1" redirectPort="8443"/>
           

參考文章:《tomcat多域名配置》

繼續閱讀