Java, SSO tek oturum açma özelliğini uygular

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 örnekleri

Aynı 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ın

Bölüm 2: Aynı Alan Adı SSO'su

2-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. Bölüm: Aynı üst etki alanı SSO'su

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 \ hosts

aş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

Bölüm 4: Alanlar Arası SSO'nun Uygulanması

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 \ hosts

aş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); } }
2018 Chengdu Otomobil Fuarı: Phantom Private Secret Realm Özel Sürümü Çıktı
önceki
Sonbahar Ortası Festivali Kutlaması! 35 yaşındaki koca nihayet babalığa terfi etti: Onu görür görmez ağlamak istedim
Sonraki
Denemeye cesaret ederseniz WeChat zengin olabilir! Göçmen işçiler ve göçmen kızlar kendi işlerini kurmak için evlerine dönüyor!
"Dongfeng Peugeot Süper Marka Günü" Wuhan'da düzenlenen Aslan Hayranları karnavalı, ciddi olduğumuzu itiraf ediyor!
2018 Chengdu Otomobil Fuarı: Mustang EC60 Pure Electric SUV Çıktı
Performans patlaması mayalanmaya devam ediyor game Bir oyun oyuncusu olan Tianshen Entertainment, geçen yıl 7,3 milyar yuan'ın üzerinde tahmini bir kayıpla "kayıp kralı" na koşuyor
HUAWEI P20 Pro el tipi süper gece sahnesi, gece daha güzel!
İmparator hayatın ilk anakara dramasının çekimlerini üç kez devraldığında erkeklerde ikinci oldu.
Arrizo GX satış öncesi fiyatını 7,99-10,69 milyon yuan'dan başlattı
Kuru mallar: Sisteminiz yüksek eşzamanlılığı nasıl destekliyor?
Huawei P30, P9 ve Leica'nın getirdiği siyah beyaz çift kamerayı inceleyerek piyasaya sürüldü
ZARAnın ekibini bu sefer yeni başlatılan "üniforma" ile sıralamak ister misiniz?
Kuru mallar: saniyede 100.000 yüksek eşzamanlı siparişi işleyen bir ödeme sistemi mimarisi
2018 Chengdu Otomobil Fuarı: Changan CS35 PLUS resmi olarak tanıtıldı
To Top