1-1 Kurs tanıtımı ve SSO tanıtımı
Kurs hedefleri
SSO'yu ve uygulamalarını tanıyın ve anlayın ve SSO'yu kendi uygulama ilkelerine göre kendi başına uygulayabilir.Öğrenme İçeriği
1. SSO'ya giriş ve uygulama deneyimi (örnek olarak Sina'yı alın) SSO: Bir kez oturum açın, her yere servis yapın 2. SSO sınıflandırmasına girişin gerçekleştirilmesine ilişkin tartışma Aynı etki alanı SSO'su: farklı uygulamalar aynı etki alanı adı altında bulunur Alanlar arası SSO: farklı uygulamalar, farklı alan adları altında bulunur 3. Çeşitli SSO'ların özel uygulaması için kod örnekleriAynı alan adı TOA simgesi
1-2 SSO çekirdek teknolojisi analizi
SSO uygulama adımları ve ilkeleri
Satın alınan geçişi örnek olarak alın:
SSO özellikleri:
1. Bir kez giriş yapmalısınız 2. Faturalar ve bilet kontrol mekanizmasıSSO'ya ulaşma adımlarının kaldırılması
Anahtar: Faturaları saklayın (bilet satın alma ve saklama), faturaları kontrol edin (bilet olup olmadığı ve geçerli olup olmadığı)Çekirdek teknoloji noktalarının uygulama ilkesi:
Turizm ile karşılaştırın2-1 Aynı alan adına SSO için hazırlıklar
Örnek akış şemasını öğretmek
Kişisel öğrenme akış şeması
Proje yapımı
Not: Öğretim bir demo projesi oluşturmak için SSH kullanır. Çalışırken oluşturmak için springboot kullanırım. Kaynak kodu github'ımda görüntülenebilir, indirilebilir, çalıştırılabilir vb. Bu bölüm esas olarak SSO tek oturum açma hakkında konuştuğundan, projenin oluşturulmasıyla ilgili değildir, bu nedenle oluşturma süreci atlanır.Projenin adı: myssosamedomain
2-2 Birleşik bir oturum açma arabirimi yazın
Doğrulama araçları yazın
paket com.myimooc.sso.web.util; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; / ** * Giriş doğrulama araçları * @ yazar ZhangCheng * @date 2017-03-22 * @ sürüm V1.0 * / public class LoginCheck { / ** Kullanıcı adını test et * / public static final String USERNAME = "kullanıcı"; / ** Test şifresi * / public static final String PASSWORD = "123"; / ** Çerez anahtarı * / public static final String COOKIE_NAME = "ssocookie"; / ** Çerez değeri * / public static final String COOKIE_VALUE = "sso"; / ** * Giriş kullanıcı adı ve şifre doğrulama * @param kullanıcı adı kullanıcı adı * @param şifre şifresi * @return gerçek kullanıcı adı ve şifre doğru; yanlış kullanıcı adı veya şifre yanlış * / public static boolean checkLogin (Dize kullanıcı adı, Dize şifresi) { eğer (USERNAME.equalsIgnoreCase (kullanıcı adı) PASSWORD.equalsIgnoreCase (password)) { doğruya dön; } yanlış dönüş; } / ** * Çerezi Doğrula * @param isteği * @ dönüş doğru doğru; yanlış yanlış * / public static boolean checkCookie (HttpServletRequest isteği) { Çerez çerezleri = request.getCookies (); eğer (çerezler == null) { yanlış dönüş; } for (Cookie cookie: cookies) { eğer (COOKIE_NAME.equals (cookie.getName ()) COOKIE_VALUE.equals (cookie.getValue ())) { doğruya dön; } } yanlış dönüş; } }Kontrol kontrolörü yaz
paket com.myimooc.sso.web.controller;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.servlet.ModelAndView;
import com.myimooc.sso.web.util.LoginCheck;
/ **
* SSO giriş denetleyicisi
* @ yazar ZhangCheng
* @date 2017-03-22
* @ sürüm V1.0
* /
@Kontroller
@RequestMapping ("/ sso")
public class LoginController {
/ **
* Kullanıcı oturum açma isteğini işle
* @param kullanıcı adı kullanıcı adı
* @param şifre şifresi
* Başarılı oturum açma sonrasında @param gotoUrl istek yolu
* @param yanıtı
* @dönüş
* /
@PostMapping ("/ doLogin")
public ModelAndView doLogin (Dize kullanıcı adı, String şifresi,
String gotoUrl, HttpServletResponse yanıtı) {
ModelAndView mv = new ModelAndView ("login_fail");
// Kullanıcı adını ve şifreyi doğrulayın
boolean ok = LoginCheck.checkLogin (kullanıcı adı, şifre);
// Girişin başarılı olup olmadığını belirleyin
Eğer tamam ise){
Çerez çerezi = yeni Çerez (LoginCheck.COOKIE_NAME, LoginCheck.COOKIE_VALUE);
// Üst düzey etki alanı altında, tüm uygulamalar görünür
cookie.setPath ("/");
// Çerez Ekle
response.addCookie (çerez);
mv.setViewName ("redirect:" + gotoUrl);
}
dönüş mv;
}
/ **
* Giriş sayfasına gidin
* @dönüş
* /
@GetMapping ("/ login")
public ModelAndView girişi () {
yeni ModelAndView ("oturum açma") döndür;
}
}
2-3 Oturum açma sayfası demo1 ve demo2 denetleyicisini yazın
demo1 denetleyici
paket com.myimooc.sso.demo1; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import com.myimooc.sso.web.util.LoginCheck; / ** * * @ yazar ZhangCheng * @date 2017-04-02 * @ sürüm V1.0 * / @Kontroller public class DemoOneController { @RequestMapping ("/ demo1") public ModelAndView main (HttpServletRequest isteği) { ModelAndView mv = new ModelAndView (); eğer (LoginCheck.checkCookie (istek)) { mv.setViewName ("demo1"); dönüş mv; } mv.addObject ("gotoUrl", "/ demo1"); mv.setViewName ("oturum açma"); dönüş mv; } }demo2 denetleyici
paket com.myimooc.sso.demo2; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import com.myimooc.sso.web.util.LoginCheck; / ** * * @ yazar ZhangCheng * @date 2017-04-02 * @ sürüm V1.0 * / @Kontroller public class DemoTwoController { @RequestMapping ("/ demo2") public ModelAndView main (HttpServletRequest isteği) { ModelAndView mv = new ModelAndView (); eğer (LoginCheck.checkCookie (istek)) { mv.setViewName ("demo2"); dönüş mv; } mv.addObject ("gotoUrl", "/ demo2"); mv.setViewName ("oturum açma"); dönüş mv; } }2-5 Aynı alan adına sahip SSO'nun nihai etkisinin gösterilmesi
Demo1 sayfasına erişmek için giriş yapılması gerekiyor
Demo2 sayfasına erişmek için giriş yapılması gerekiyor
Demo1 sayfasında oturum açın
Başarılı giriş, demo1 sayfasını ziyaret edebilirsiniz
Demo2'yi tekrar ziyaret ettiğinizde, giriş yapmadan ziyaret edebilirsiniz
3-1 Hazırlık
Ana-alt etki alanı adının gerçekleştirilmesini simüle etmek için ana bilgisayar dosyasını değiştirerek.
Dosya yolu: C: \ Windows \ System32 \ drivers \ etc \ hostsaşağıdaki gibi değiştirin
Not: Normal koşullar altında, demo1.x.com, demo2.x.com, check.x.com'a karşılık gelen üç proje ayrı ayrı oluşturulmalıdır. Ancak demonstrasyon ve açıklamanın rahatlığı için, hangi projenin projede karşılık gelen paket ismine göre ayırt ediyoruz.
Proje yapımı
Projenin adı: myssosamefather
3-2 Birleşik giriş arayüzü
Bir mesaj yanıt sınıfı yazın
paket com.myimooc.sso.util; java.io.Serializable ithal; / ** * Mesaj yanıt nesnesi * @ yazar ZhangCheng * @date 2017-04-02 * @ sürüm V1.0 * / public class RespMessage, Serializable { özel statik son uzun serialVersionUID = 1L; / ** Yanıt numarası * / özel String respCode; / ** Yanıt mesajı * / özel String respMsg; public String getRespCode () { geri dönüş kodu; } public void setRespCode (String respCode) { this.respCode = respCode; } public String getRespMsg () { dönüş respMsg; } public void setRespMsg (String respMsg) { this.respMsg = respMsg; } }Giriş doğrulama aracı sınıfı yazın
paket com.myimooc.sso.util; / ** * Giriş doğrulama araçları * * @ yazar ZhangCheng * @date 2017-03-22 * @ sürüm V1.0 * / public class LoginCheck { / ** Kullanıcı adını test et * / public static final String USERNAME = "kullanıcı"; / ** Test şifresi * / public static final String PASSWORD = "123"; / ** Çerez anahtarı * / public static final String COOKIE_NAME = "ssocookie"; / ** Çerez değeri * / public static final String COOKIE_VALUE = "sso"; / ** * Giriş kullanıcı adı ve şifre doğrulama * * @param kullanıcı adı * Kullanıcı adı * @param şifresi * Parola * @return true giriş yapıldı; false giriş yapılmadı * / public static boolean checkLogin (Dize kullanıcı adı, Dize şifresi) { eğer (USERNAME.equalsIgnoreCase (kullanıcı adı) PASSWORD.equalsIgnoreCase (şifre)) { doğruya dön; } yanlış dönüş; } / ** * Çerezi Doğrula * @param cookieName * @param cookieValue * @dönüş * / public static boolean checkCookie (String cookieName, String cookieValue) { if (cookieName == null || cookieName == "") { yanlış dönüş; } if (cookieValue == null || cookieValue == "") { yanlış dönüş; } eğer (COOKIE_NAME.equals (cookieName) COOKIE_VALUE.equals (cookieValue)) { doğruya dön; } yanlış dönüş; } }Http istek aracı sınıfı yaz
paket com.myimooc.sso.util; java.io.BufferedReader'ı içe aktarın; java.io.InputStream'i içe aktarın; java.io.InputStreamReader'ı içe aktarın; java.net.HttpURLConnection'ı içe aktar; java.net.URL dosyasını içe aktarın; import com.alibaba.fastjson.JSONObject; / ** * http araçları * @ yazar ZhangCheng * @date 2017-04-02 * @ sürüm V1.0 * / public class HttpUtils { / ** * Belirtilen url yolu için bir alma isteği başlatın ve çerezi doğrulayın * @param url yolu * @param cookieName * @param cookieValue * @dönüş * / public static RespMessage doGet (String url, String cookieName, String cookieValue) { RespMessage respMessage = new RespMessage (); HttpURLConnection httpURLConnection = null; URL targetUrl = boş; Deneyin{ targetUrl = yeni URL (url + "? cookieName =" + cookieName + "cookieValue =" + cookieValue); httpURLConnection = (HttpURLConnection) targetUrl.openConnection (); httpURLConnection.setRequestMethod ("GET"); httpURLConnection.connect (); InputStream in = httpURLConnection.getInputStream (); InputStreamReader isr = yeni InputStreamReader (in); BufferedReader br = new BufferedReader (isr); StringBuffer sb = new StringBuffer (); Dize sıcaklığı = boş; while ((temp = br.readLine ())! = null) { sb.append (temp); } br.close (); isr.close (); in.close (); JSONObject resultJson = JSONObject.parseObject (sb.toString ()); respMessage.setRespCode (resultJson.getString ("respCode")); respMessage.setRespMsg (resultJson.getString ("respMsg")); dönüş respMessage; } catch (İstisna e) { respMessage.setRespCode ("500"); respMessage.setRespMsg ("Çerez doğrulama isteği başarısız oldu"); dönüş respMessage; }en sonunda { eğer (httpURLConnection! = null) { httpURLConnection.disconnect (); } } } }check.x.com: Bir sertifika merkezi denetleyicisi yazın
paket com.myimooc.sso.check.x.com; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import com.myimooc.sso.util.LoginCheck; import com.myimooc.sso.util.RespMessage; / ** * SSO giriş denetleyicisi * * @ yazar ZhangCheng * @date 2017-03-22 * @ sürüm V1.0 * / @Kontroller @RequestMapping ("/ sso") public class LoginController { / ** * Kullanıcı oturum açma isteğini işle * * @param kullanıcı adı * Kullanıcı adı * @param şifresi * Parola * @param gotoUrl * Başarılı girişten sonra yol iste * @param yanıtı * @dönüş * / @PostMapping ("/ doLogin") public ModelAndView doLogin (Dize kullanıcı adı, Dize şifresi, Dize gotoUrl, HttpServletResponse yanıtı) { ModelAndView mv = new ModelAndView ("login_fail"); // Kullanıcı adını ve şifreyi doğrulayın boolean ok = LoginCheck.checkLogin (kullanıcı adı, şifre); // Girişin başarılı olup olmadığını belirleyin Eğer tamam ise) { Çerez çerezi = yeni Çerez (LoginCheck.COOKIE_NAME, LoginCheck.COOKIE_VALUE); // üst etki alanı altında ayarlayın cookie.setDomain ("x.com"); // Üst düzey etki alanı altında, tüm uygulamalar görünür cookie.setPath ("/"); // Çerez Ekle response.addCookie (çerez); mv.setViewName ("redirect:" + gotoUrl); } dönüş mv; } / ** * Çerezi doğrula * @param cookieName * @param cookieValue * @param yanıtı * @dönüş * / @GetMapping ("/ checkCookie") @Kafadergisi public RespMessage checkCookie (String cookieName, String cookieValue, HttpServletResponse yanıtı) { RespMessage sonucu = yeni RespMessage (); result.setRespCode ("500"); result.setRespMsg ("CookieName veya CookieValue geçersiz"); boolean isOk = LoginCheck.checkCookie (cookieName, cookieValue); eğer (isOk) { result.setRespCode ("200"); result.setRespMsg ("Tanımlama bilgisi geçerlidir"); } dönüş sonucu; } / ** * Giriş sayfasına gidin * * @dönüş * / @GetMapping ("/ login") public ModelAndView girişi () { yeni ModelAndView ("oturum açma") döndür; } }3-3 Demo1 ve demo2 projelerinin kontrol katmanını yazın
demo1.x.com: demo1 proje denetleyicisi yazın
paket com.myimooc.sso.demo1.x.com; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import com.myimooc.sso.util.HttpUtils; import com.myimooc.sso.util.RespMessage; / ** * * @ yazar ZhangCheng * @date 2017-04-02 * @ sürüm V1.0 * / @Kontroller public class DemoOneController { @RequestMapping ("/ demo1") public ModelAndView main (HttpServletRequest isteği) { ModelAndView mv = new ModelAndView (); // Çerezin boş olup olmadığını kontrol edin Çerez çerezleri = request.getCookies (); eğer (çerezler! = boş çerezler.length > 0) { // Çerezin var olup olmadığını kontrol edin for (Cookie cookie: cookies) { eğer ("ssocookie" .equals (cookie.getName ())) { // Doğrulama sunucusuna doğrulama isteği gönderin Dize url = " RespMessage respMessage = HttpUtils.doGet (url, cookie.getName (), cookie.getValue ()); eğer ("200" .equals (respMessage.getRespCode ())) { mv.setViewName ("demo1"); dönüş mv; } } } } mv.addObject ("gotoUrl", " mv.setViewName ("oturum açma"); dönüş mv; } }demo2.x.com: Demo2 proje denetleyicisi yazın
paket com.myimooc.sso.demo2.x.com; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.servlet.ModelAndView; import com.myimooc.sso.util.HttpUtils; import com.myimooc.sso.util.RespMessage; / ** * * @ yazar ZhangCheng * @date 2017-04-02 * @ sürüm V1.0 * / @Kontroller public class DemoTwoController { @RequestMapping ("/ demo2") public ModelAndView main (HttpServletRequest isteği) { ModelAndView mv = new ModelAndView (); // Çerezin boş olup olmadığını kontrol edin Çerez çerezleri = request.getCookies (); eğer (çerezler! = boş çerezler.length > 0) { // Çerezin var olup olmadığını kontrol edin for (Cookie cookie: cookies) { eğer ("ssocookie" .equals (cookie.getName ())) { // Doğrulama sunucusuna doğrulama isteği gönderin Dize url = " RespMessage respMessage = HttpUtils.doGet (url, cookie.getName (), cookie.getValue ()); eğer ("200" .equals (respMessage.getRespCode ())) { mv.setViewName ("demo2"); dönüş mv; } } } } mv.addObject ("gotoUrl", " mv.setViewName ("oturum açma"); dönüş mv; } }3-4 Bir oturum açma sayfası yazın
< ! DOCTYPE html > < html > < baş > < meta karakter kümesi = "UTF-8" > < Başlık > Buraya başlık ekleyin < /Başlık > < / kafa > < vücut > < merkez > < h1 > Lütfen giriş yapın < / h1 > < form eylem = " method = "post" > < giriş türü = "gizli" name = "gotoUrl" value = "$ {gotoUrl}" / > < açıklık > Kullanıcı adı: < / span > < input type = "text" name = "kullanıcı adı" / > < açıklık > Parola: < / span > < input type = "şifre" name = "şifre" / > < input type = "gönder" > < /form > < / merkez > < /vücut > < / html >3-5 Aynı üst etki alanında SSO etkisinin gösterilmesi
Lütfen tarayıcının URL adresini inceleyin
Demo1.x.com adresini ziyaret edin: Giriş gerekli
Demo2.x.com adresini ziyaret edin: Giriş gerekli
Demo1.x.com'da başarıyla oturum açtıktan sonra, demo1 sayfasına atlayın
Demo2.x.com'un demo2 sayfasını tekrar ziyaret ettiğinizde, artık giriş yapmanız gerekmiyor
4-1 Hazırlık
Örnek akış şemasını öğretmek
Kişisel öğrenme akış şeması
Etki alanları arası uygulamaları simüle etmek için ana bilgisayar dosyasını değiştirerek.
Dosya yolu: C: \ Windows \ System32 \ drivers \ etc \ hostsaşağıdaki gibi değiştirin
Not: Normal şartlar altında, sırasıyla www.a.com, www.b.com ve www.x.com adreslerine karşılık gelen üç proje oluşturulmalıdır. Ancak gösteri ve açıklamanın rahatlığı için, hangi projenin projede karşılık gelen paket adına göre ayırt ediyoruz.
4-2 Birleşik giriş arayüzü yazma
Bir mesaj yanıt sınıfı yazın
paket com.myimooc.sso.util; java.io.Serializable ithal; java.util.Map içe aktarın; / ** * Mesaj yanıt nesnesi * @ yazar ZhangCheng * @date 2017-04-02 * @ sürüm V1.0 * / public class RespMessage, Serializable { özel statik son uzun serialVersionUID = 1L; / ** Yanıt numarası * / özel String respCode; / ** Yanıt mesajı * / özel String respMsg; / ** Yanıt verileri * / özel Harita < Dize, Nesne > respArgs; public String getRespCode () { geri dönüş kodu; } public void setRespCode (String respCode) { this.respCode = respCode; } public String getRespMsg () { dönüş respMsg; } public void setRespMsg (String respMsg) { this.respMsg = respMsg; } genel Harita < Dize, Nesne > getRespArgs () { dönüş yanıtları; } public void setRespArgs (Harita < Dize, Nesne > respArgs) { this.respArgs = respArgs; } @Override public String toString () { "RespMessage" döndür; } }Http istek aracı sınıfı yaz
paket com.myimooc.sso.util; java.io.BufferedReader'ı içe aktarın; java.io.InputStream'i içe aktarın; java.io.InputStreamReader'ı içe aktarın; java.net.HttpURLConnection'ı içe aktar; java.net.URL dosyasını içe aktarın; java.util.Map içe aktarın; import com.alibaba.fastjson.JSONObject; / ** * Http istek aracı * @ yazar ZhangCheng * @date 2017-04-02 * @ sürüm V1.0 * / public class HttpUtils { / ** * Belirtilen url yolu için bir alma isteği başlatın * @param url istek yolu * @param param istek parametreleri * @dönüş * / public static RespMessage doGet (String url, Map < Dize, Dize > param) { RespMessage respMessage = new RespMessage (); HttpURLConnection httpURLConnection = null; URL targetUrl = boş; Deneyin{ // Montaj isteği parametreleri StringBuffer targetUrlStr = new StringBuffer (url) .append ("?"); için (Map.Entry < Dize, Dize > entry: param.entrySet ()) { targetUrlStr.append (entry.getKey ()). append ("="). append (entry.getValue ()). append (""); } url = targetUrlStr.substring (0, targetUrlStr.length () - 1); targetUrl = yeni URL (url); httpURLConnection = (HttpURLConnection) targetUrl.openConnection (); httpURLConnection.setRequestMethod ("GET"); httpURLConnection.connect (); InputStream in = httpURLConnection.getInputStream (); InputStreamReader isr = yeni InputStreamReader (in); BufferedReader br = new BufferedReader (isr); StringBuffer sb = new StringBuffer (); Dize sıcaklığı = boş; while ((temp = br.readLine ())! = null) { sb.append (temp); } br.close (); isr.close (); in.close (); JSONObject resultJson = JSONObject.parseObject (sb.toString ()); respMessage.setRespCode (resultJson.getString ("respCode")); respMessage.setRespMsg (resultJson.getString ("respMsg")); JSONObject resultJsonMap = JSONObject.parseObject (resultJson.getString ("respArgs")); respMessage.setRespArgs (resultJsonMap); dönüş respMessage; } catch (İstisna e) { respMessage.setRespCode ("500"); respMessage.setRespMsg ("İstek başlatma başarısız oldu"); dönüş respMessage; }en sonunda { eğer (httpURLConnection! = null) { httpURLConnection.disconnect (); } } } }www.x.com: Sertifika merkezi doğrulama araçlarını derleyin
paket com.myimooc.sso.www.x.com; / ** * Giriş doğrulama araçları * * @ yazar ZhangCheng * @date 2017-03-22 * @ sürüm V1.0 * / public class LoginCheck { / ** Kullanıcı adını test et * / public static final String USERNAME = "kullanıcı"; / ** Test şifresi * / public static final String PASSWORD = "123"; / ** Çerez anahtarı * / public static final String COOKIE_NAME = "ssocookie"; / ** Çerez değeri * / public static final String COOKIE_VALUE = "sso"; / ** * Giriş kullanıcı adı ve şifre doğrulama * * @param kullanıcı adı * Kullanıcı adı * @param şifresi * Parola * @return true giriş yapıldı; false giriş yapılmadı * / public static boolean checkLogin (Dize kullanıcı adı, Dize şifresi) { eğer (USERNAME.equalsIgnoreCase (kullanıcı adı) PASSWORD.equalsIgnoreCase (şifre)) { doğruya dön; } yanlış dönüş; } / ** * Çerezi Doğrula * @param cookieName * @param cookieValue * @dönüş * / public static boolean checkCookie (String cookieName, String cookieValue) { if (cookieName == null || cookieName == "") { yanlış dönüş; } if (cookieValue == null || cookieValue == "") { yanlış dönüş; } eğer (COOKIE_NAME.equals (cookieName) COOKIE_VALUE.equals (cookieValue)) { doğruya dön; } yanlış dönüş; } }www.x.com: Bir sertifika merkezi denetleyicisi yazın
paket com.myimooc.sso.www.x.com; import java.util.ArrayList; java.util.HashMap'i içe aktar; import java.util.List; java.util.Map içe aktarın; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.GetMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.ResponseBody; import com.myimooc.sso.util.RespMessage; / ** * SSO giriş denetleyicisi * * @ yazar ZhangCheng * @date 2017-03-22 * @ sürüm V1.0 * / @Kontroller @RequestMapping ("/ sso") public class LoginController { / ** * Kullanıcı bilgilerini doğrulayın * @param parametresi * @dönüş * / @GetMapping ("/ doLogin") @Kafadergisi public RespMessage doLogin (Dize kullanıcı adı, Dize şifresi) { RespMessage sonucu = yeni RespMessage (); result.setRespCode ("500"); result.setRespMsg ("Kullanıcı adı veya şifre yanlış"); // Kullanıcı adını ve şifreyi doğrulayın boolean ok = LoginCheck.checkLogin (kullanıcı adı, şifre); // Girişin başarılı olup olmadığını belirleyin Eğer tamam ise) { result.setRespCode ("200"); result.setRespMsg ("Kullanıcı adı ve şifre doğru"); Liste < Harita < Dize, Dize > > targetCookies = new ArrayList < Harita < Dize, Dize > > (); // Çerezi artırmak için www.a.com sunucusuna gönderin Harita < Dize, Dize > targetCookiea = yeni HashMap < Dize, Dize > (); String urla = " targetCookiea.put ("targetUrl", urla); targetCookiea.put ("cookieName", LoginCheck.COOKIE_NAME); targetCookiea.put ("cookieValue", LoginCheck.COOKIE_VALUE); // Çerezi artırmak için www.b.com sunucusuna gönderin Harita < Dize, Dize > targetCookieb = yeni HashMap < Dize, Dize > (); String urlb = " targetCookieb.put ("targetUrl", urlb); targetCookieb.put ("cookieName", LoginCheck.COOKIE_NAME); targetCookieb.put ("cookieValue", LoginCheck.COOKIE_VALUE); targetCookies.add (targetCookiea); targetCookies.add (targetCookieb); Harita < Dize, Nesne > args = new HashMap < Dize, Nesne > (); args.put ("targetCookies", targetCookies); result.setRespArgs (args); } dönüş sonucu; } / ** * Çerezi doğrula * @param cookieName * @param cookieValue * @param yanıtı * @dönüş * / @GetMapping ("/ checkCookie") @Kafadergisi public RespMessage checkCookie (String cookieName, String cookieValue) { RespMessage sonucu = yeni RespMessage (); result.setRespCode ("500"); result.setRespMsg ("CookieName veya CookieValue geçersiz"); boolean isOk = LoginCheck.checkCookie (cookieName, cookieValue); eğer (isOk) { result.setRespCode ("200"); result.setRespMsg ("Tanımlama bilgisi geçerlidir"); } dönüş sonucu; } }4-3 Giriş doğrulama arayüzünü yazın
www.a.com: Kontrolörün programlanması
paket com.myimooc.sso.www.a.com; java.util.HashMap'i içe aktar; java.util.Map içe aktarın; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import com.myimooc.sso.util.RespMessage; import com.myimooc.sso.util.HttpUtils; / ** * * @ yazar ZhangCheng * @date 2017-04-02 * @ sürüm V1.0 * / @Kontroller @RequestMapping ("/ a") public class DemoOneController { / ** * Demo1'in ana sayfasına gidin * @param isteği * @dönüş * / @RequestMapping ("/ demo1") public ModelAndView demo1 (HttpServletRequest isteği) { ModelAndView mv = new ModelAndView (); // Çerezin boş olup olmadığını kontrol edin Çerez çerezleri = request.getCookies (); eğer (çerezler! = boş çerezler.length > 0) { // Çerezin var olup olmadığını kontrol edin for (Cookie cookie: cookies) { eğer ("ssocookie" .equals (cookie.getName ())) { // İstek parametrelerini kapsülleyin Harita < Dize, Dize > param = yeni HashMap < Dize, Dize > (); param.put ("çerezAdı", çerez.getName ()); param.put ("cookieValue", cookie.getValue ()); // Doğrulama sunucusuna doğrulama isteği gönderin Dize url = " RespMessage respMessage = HttpUtils.doGet (url, param); // Doğrulama geçti eğer ("200" .equals (respMessage.getRespCode ())) { mv.setViewName ("demo1"); dönüş mv; } } } } // giriş başarısız oldu ve tekrar giriş yapın Dize yolu = request.getContextPath (); mv.addObject ("bağlamYolu", yol); mv.addObject ("yol", "a"); mv.addObject ("gotoUrl", " mv.setViewName ("oturum açma"); dönüş mv; } / ** * Kullanıcı Girişi * @param parametresi * @dönüş * / @PostMapping (value = "/ doLogin") @Kafadergisi public RespMessage doLogin (@RequestParam Haritası < Dize, Dize > param) { // Doğrulama sunucusuna doğrulama isteği gönderin Dize url = " RespMessage respMessage = HttpUtils.doGet (url, param); System.out.println ("SSO sunucusu yanıt mesajı:" + respMessage); dönüş respMessage; } / ** * Mevcut etki alanına çerez eklemek istiyorum * @param cookieName * @param cookieValue * @param yanıtı * / @RequestMapping (value = "/ addCookie") public void addCookie (String cookieName, String cookieValue, HttpServletResponse yanıtı) { Cookie cookie = new Cookie (cookieName, cookieValue); cookie.setPath ("/"); response.addCookie (çerez); } }www.b.com: Kontrolörün programlanması
paket com.myimooc.sso.www.b.com; java.util.HashMap'i içe aktar; java.util.Map içe aktarın; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PostMapping; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RequestParam; import org.springframework.web.bind.annotation.ResponseBody; import org.springframework.web.servlet.ModelAndView; import com.myimooc.sso.util.HttpUtils; import com.myimooc.sso.util.RespMessage; / ** * * @ yazar ZhangCheng * @date 2017-04-02 * @ sürüm V1.0 * / @Kontroller @RequestMapping ("/ b") public class DemoTwoController { @RequestMapping ("/ demo2") public ModelAndView main (HttpServletRequest isteği) { ModelAndView mv = new ModelAndView (); // Çerezin boş olup olmadığını kontrol edin Çerez çerezleri = request.getCookies (); eğer (çerezler! = boş çerezler.length > 0) { // Çerezin var olup olmadığını kontrol edin for (Cookie cookie: cookies) { eğer ("ssocookie" .equals (cookie.getName ())) { // İstek parametrelerini kapsülleyin Harita < Dize, Dize > param = yeni HashMap < Dize, Dize > (); param.put ("çerezAdı", çerez.getName ()); param.put ("cookieValue", cookie.getValue ()); // Doğrulama sunucusuna doğrulama isteği gönderin Dize url = " RespMessage respMessage = HttpUtils.doGet (url, param); // Doğrulama geçti eğer ("200" .equals (respMessage.getRespCode ())) { mv.setViewName ("demo2"); dönüş mv; } } } } // giriş başarısız oldu ve tekrar giriş yapın mv.addObject ("contextPath", request.getContextPath ()); mv.addObject ("yol", "b"); mv.addObject ("gotoUrl", " mv.setViewName ("oturum açma"); dönüş mv; } / ** * Kullanıcı Girişi * @param parametresi * @dönüş * / @PostMapping (value = "/ doLogin") @Kafadergisi public RespMessage doLogin (@RequestParam Haritası < Dize, Dize > param) { // Doğrulama sunucusuna doğrulama isteği gönderin Dize url = " RespMessage respMessage = HttpUtils.doGet (url, param); System.out.println ("SSO sunucusu yanıt mesajı:" + respMessage); dönüş respMessage; } / ** * Mevcut etki alanına çerez ekleyin * @param cookieName * @param cookieValue * @param yanıtı * / @RequestMapping (value = "/ addCookie") public void addCookie (String cookieName, String cookieValue, HttpServletResponse yanıtı) { Cookie cookie = new Cookie (cookieName, cookieValue); cookie.setPath ("/"); response.addCookie (çerez); } }