本文使用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,項目目錄結構
二)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網頁,可直接顯示:歡迎界面(無需登入)
七)檢視360浏覽器中的Cookie:
工具-->選項-->進階設定-->内容設定(内容設定...)-->Cookie(所有Cookie和網站資料)
此處可以檢視到:
為tgb.com儲存了一份cookie
為taobao儲存了一份session
為tianmao儲存了一份session
四 拓展知識
以往把項目直接部署在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
2.修改C:\Windows\System32\drivers\etc\hosts檔案,并添加兩個節點
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多域名配置》