Web Programlama - Front-End - Alt Kategoriler :

HTML SEO - Search Engine Optimization Cascading Style Sheet Javascript Mobil ve Akıllı Telefonlar Responsive Web Design Html5 Boilerplate Bootstrap SyntaxHighlighter CORS SMIL BowerBu Kategoriye İçerik Girin. Soru Sorun

İçerikler :

Atmosfer ve Comet Basit Bir Confirm Dialog Örneği Bir Kaynağın Diğer Sunuculardan Çağrılmasının.. Bir Sitenin HTML-XHTML-XML Doğrulaması Bir Web Sitesini Farklı User-Agent'ler İle Ba.. Create a new Fiddle - jsFiddle DOCTYPE Doğrudan Web Front-End Kitabını Zafer Teker T.. Facebook Hesabı İle Sitenize Giriş Yapılabilm.. Fixed-Width Design Flexible Design - Liquid Design Godoro Tanıtım - Görüntülü Eğitim - HTML & CS.. Google Hesabı İle Sitenize Giriş Yapılabilmes.. Graceful Degradation (Nazikçe Bozulma) IETester - Browser Compatibility Check for In.. Initializr - Start an HTML5 Boilerplate proje.. Internet Explorer 8'de Max-Width İle İlgili S.. Java'da Session Timeout Zamanını Değiştirme LukeW - Mobile First Mobile First No Access-Control-Allow-Origin header is pres.. Node.js Polyfill - Polyfiller Progressive Enhancement (Aşamalı Geliştirme) Test the Responsiveness of your Website The World Wide Web Consortium (W3C) The World Wide Web Consortium (W3C) Web Hypertext Application Technology Working .. Web Hypertext Application Technology Working .. Web Sitenizin Performansını Arttırmak İçin Ob.. Web Sitesinin Bileşenleri Web Tarayıcı Modu Web ve Front-End Dilleri ve Framework'leri

Bu Sayfayı Paylaş:

Kavram

The World Wide Web Consortium (W3C)

Tanım: Web teknoloji standartlarını belirleyen , uluslararası teknoloji firmalarının desteklediği topluluk. HTML, CSS, XML gibi teknolojilerinin standartları bu kurum tarafından belirlenmektedir

Kavram

Web Hypertext Application Technology Working Group (WHATWG)

Tanım: Web uygulamaları ile ilgili gerekli standartlarını belirlemek için çalışan topluluk. Özellikle Web uygulamaları için gerekli olan konular ile ilgilenmektedir

Kaynak

The World Wide Web Consortium (W3C)

Web teknoloji standartlarını belirleyen The World Wide Web Consortium (W3C) topluluğunun web sitesi

Kaynak

Web Hypertext Application Technology Working Group (WHATWG)

Web Hypertext Application Technology Working Group (WHATWG) (Web uygulamaları ile ilgili gerekli API standartlarını belirlemek için çalışan topluluk) kurumunun web sitesi

Kavram

Graceful Degradation (Nazikçe Bozulma)

Tanım: Bir uygulamada veya web sitesinde, bölümlerden herhangi birinin çalışmamasına rağmen (herhangi bir nedenle çökmesi veya geç cevap vermesi) uygulamanın veya sitenin düzgün çalışmaya devam edebilme özelliği. Fault-Tolerance (Hata Toleransı) ile aynı anlama gelmektedir ancak bu terim daha çok web siteleri için kullanılır

Kavram

Progressive Enhancement (Aşamalı Geliştirme)

Tanım: Web geliştiricileri için özellikle farklı user-agent veya cihazlarda başarılı çalışacak web siteleri geliştirmelerini sağlayan yöntem. Yöntem , ilk önce web sitesinin en basit halinin yapılmasını , ardından CSS (sunum tarafı) ve daha sonrasında Script ile web sitesinin diğer user-agent ve cihazlarda düzgün çalışacak şekilde getirilmesi şeklindedir. Genel olarak içerik , sunum ve script şeklinde sırasıyla üç genel aşama olarak düşünülebilir

Kavram

Mobile First

Tanım: Web tasarımında ve programlamada, ilk önce mobil cihazlar için tasarımın yapılmasını, daha sonra web sitesinin CSS, javascript gibi teknolojilerle desktop cihazlara uyumlu hale getirilmesi şeklinde olan web tasarım veya programlama yöntemi. Mobile cihazların kullanım ağırlığının giderek artacağı ve bu nedenle öncelikle mobil cihazlara öncelik verilmesini savunur

Kavram

DOCTYPE

Tanım: HTML ve XHTML'de dökümanın (sayfanın) tipini belirtmek için kullanılan tanımlama (declaration). Versiyon ve DTD hakkında bilgi vermek amacıyla kullanılır

Kavram

Web Tarayıcı Modu

Tanım: Tarayıcının (IE, Chrome, Firefox gibi) sayfayı nasıl değerlendireceğini belirleyen modlardır. Standart Mod(Standards Mode - Sayfayı ayrıntılı ve doğru şekilde işler) ve Garip Mod(Quirks Mode - Sayfayı işlerken hatalara karşı duyarsız şekilde işler) şeklinde iki mod bulunmaktadır. DOCTYPE tanımında DTD var ise tanımlı ise Standart Mod, yok ise Garip Mod geçerli olur

Veri

Web Sitesinin Bileşenleri

Bir web sitesi üç bileşenden oluştuğu söylenebilir : 

  • İçerik ve Yapı : İçerik ve yapı HTML ile kodlanır
  • Sunum (Biçim vb..) : Bu bölüm CSS ile kodlanır
  • Etkileşim : Bu bölüm script dilleri (JavaScript,JScript,VbScript vb..) ve server (sunucu) taraflı diller (Java,PHP,C#,Python vb..) ile geliştirilir


Öneri

Web Sitenizin Performansını Arttırmak İçin Obfuscator ve Minifier Uygulamaları Kullanın

Web sitesindeki Javascript ve CSS dosyalarının boyutlarının düşürülmesi sitenizi hızlandırır. Bu nedenle Obfuscator ve Minifier veya Compressor denilen uygulamaları kullanabilirsiniz. Bu uygulamalar dosya boyutlarını küçültmektedirler. 


Kaynak

Bir Sitenin HTML-XHTML-XML Doğrulaması

Online olarak bir sitenin HTML-XHTML-XML kodlarını doğrulamak için kullanılmaktadır

Kavram

Polyfill - Polyfiller

Tanım: Web tarayıcısın sağlamadığı özellikleri (CSS, javascript, HTML5 vb..) destekleyecek şekle getiren kod veya kütüphanelere verilen genel isim. Örneğin html5shiv kütüphanesi HTML5 etiketlerini desteklemeyen IE 9 öncesi tarayıcıları destekler hale getirmektedir

Kaynak

Create a new Fiddle - jsFiddle

HTML, CSS ve Javascript kodlarını ayrı bölümü yazarak web sayfası oluşturabileceğiniz online yardımcı site

Kavram

Flexible Design - Liquid Design

Tanım: Sabit boyut (örneğin pixsel) vermek yerine yüzde veya ilişkili boyut verme yöntemini kullanan, ekran görüntüsüne göre bozulmadan küçülebilen veya büyeyebilen web siteleri geliştirilmesi için kullanılan web tasarım yöntemi. Fixed-Width Design (Sabit Genişlikli Tasarım) yönteminin zıttıdır

Kavram

Fixed-Width Design

Tanım: Bir web sitesindeki tüm bölümleri sabit boyutlar (örneğin pixsel cinsinden) vermek yoluyla yapılan web tasarım yöntemi. Flexible Design (Esnek (Akışkan) Tasarım) yönteminin zıttıdır

Kaynak

Initializr - Start an HTML5 Boilerplate project in 15 seconds!

Bazı özellikleri özelleştirip , kolay bir şekilde Html5 Boilerplate , Bootstrap , Modernizr , JQuery destekli , responive web projeleri oluşturmak için kullanılan web sitesi

Kaynak

Test the Responsiveness of your Website

Bir web sitesinin farklı boyuttaki cihazlarda nasıl görüneceğiniz test etmek için kullanılan bir test sitesi (İngilizce)

Kaynak

LukeW - Mobile First

Bir Web Tasarımı düşüncesi olan "Mobile First" ile ilgili bir yazı

Kaynak

IETester - Browser Compatibility Check for Internet Explorer Versions from 5.5 to 10

Bir web sayfasını farklı IE10 preview, IE9, IE8, IE7 IE 6 and IE5.5 için ayrı olarak test etmek için kullanılan uygulama

İpucu

Bir Web Sitesini Farklı User-Agent'ler İle Bağlanarak Test Edebilirsiniz

Bir web sitesini farklı user-agent'lar ile bağlanıp test edebilirsiniz. Örneğin web sitenizin bir mobil cihazdan bağlanıldığında nasıl davranacağını test edebilirsiniz. Bunun için Firefox tarayıcısında benzer görevi gören iki eklentiyi (plug-in) kullanabilirsiniz : 

User Agent Switcher :  https://addons.mozilla.org/en-US/firefox/addon/user-agent-switcher/

Modify Headers :  https://addons.mozilla.org/en-US/firefox/addon/modify-headers/


İpucu

Java'da Session Timeout Zamanını Değiştirme

Java'da bir web projesinde session zamanın değiştirmek içni web.xml dosyasında web-app elementinin (ana element) altına aşağıdaki bölümü eklemeniz gerekmektedir : 

 15

veya kod üzerinden değişirmek istiyorsanız aşağıdaki gibi değiştirilebilirsiniz : 

session.setMaxInactiveInterval(15);

 


İpucu

Internet Explorer 8'de Max-Width İle İlgili Sorunun Çözümü

Bir resmin genişliği 100% olsun (ekranı kaplasın) ancak kendi genişliğinden daha da büyümesin (büyük ekranda resmin genişliği neyse o şekilde gözüksün) isteniyorsa aşağıdaki gibi bir biçim verilebilir :


Bu resim 100px den geniş ekranlarda 100px genişliğinde görülür fakat 100 px'den daha küçük ekran genişliklerinde resim ekran genişliğine sığdırılır.
Yukarıdaki stil internet explorer 8'de (IE8) çalışmamaktadır.
Bunu çözmek için stil aşağıdaki gibi tanımlanabilir :


Resmin genişliği 60px ise yukarıdaki gibi max-height:60px ifadesi eklenmesi gerekir. Bu şekilde IE8 de düzgün gözükecektir
Bu konuda kaynak makale detaylı açıklama bulunmaktadır : http://www.zeilenwechsel.de/it/articles/5/How-max-width-fails-in-IE8.html


İpucu

Bir Kaynağın Diğer Sunuculardan Çağrılmasının Sağlanması

Bir sunucuda bulunana kaynağınız, diğer sunuculardan client'a inen kaynaklar tarafından (örneğin javascript ve ajax) çağrılabilmesi için aşağıdaki gibi header bilgilerini response'a ekleyebilirisiniz :

Access-Control-Allow-Origin : *
Access-Control-Allow-Methods : GET,POST,OPTIONS
Access-Control-Allow-Headers :Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers

Yukarıdaki ifadeleri Header'a eklerseniz farklı sunucudan inen client kodları sizin kaynağınıza GET ve POST isteği yapabilir


İpucu

No Access-Control-Allow-Origin header is present on the requested resource. Origin '' is therefore not allowed access Hatasının Çözümü

Bir client kodundan farklı bir site üzerindeki bir kaynağa istek yaptığınızda aşağıdaki gibi bir hata alabilirsiniz :
No 'Access-Control-Allow-Origin' header is present on the requested resource. Origin 'local ipniz burada' is therefore not allowed access
Bu hatanın çözülmesi için çağırmaya çalıştığınız sunucun CORS (Cross-Origin Resource Sharing) isteklerine (yani farklı bir sunucudan istek yapılmasına) izin vermiş olması gerekir. Sunucu response'larına aşağıdaki ifadeler eklenebilir :


Access-Control-Allow-Origin : *
Access-Control-Allow-Methods : GET,POST,OPTIONS 
Access-Control-Allow-Headers :Content-Type,X-Requested-With,accept,Origin,Access-Control-Request-Method,Access-Control-Request-Headers


Bu şekilde diğer sunucunun kaynağına GET veya POST isteği yapabilirsiniz


Kavram

Node.js

Tanım: Web uygulamalarına hizmet vermek için yaratılan, sunucu tarafında da Javascript'in kullanıldığı (Chrome'un Javascript Engine'i kullanılmaktadır), sunucu taraflı (server-side) bir platform. Node.js aynı zamanda paket yönetim aracı içerir (NPM) ve Node.js üzerinde çalışan paketlerin kurulumu ve yönetilmesini sağlar. Node.js event driven (olay yönelimli) ve non-blocking IO (talepler asenkron olarak işlenebilir) özellikleri olan bir platformdur ve web projeleri için Tomcat-Jboss-IIS vb.. gibi uygulama sunucuların işlevini yerine getirebilmektedir

Örnek

Basit Bir Confirm Dialog Örneği

jquery-confirm kütüphanesini kullanarak basit bir confirm dialog gösterebilirsin. Bu kütüphane bootstarp'ı kullanmasından dolayı mobil cihazlarda da düzgün çalışmaktadır. Örnek bir sayfa aşağıdaki gibidir:


Insert title here



<script type="text/javascript" src="bower_components/jquery/dist/jquery.min.js"></script>
<script type="text/javascript" src="bower_components/bootstrap/dist/js/bootstrap.min.js"></script>
<script type="text/javascript" src="bower_components/jquery-confirm2/dist/jquery-confirm.min.js"></script>


<script type="text/javascript"> $('#submitButton').on('click', function () { $.confirm({ title: 'Confirm!', content: 'Simple confirm!', confirm: function () { alert('Confirmed!'); }, cancel: function () { alert('Canceled!') } }); }); </script>
Yukarıdaki örnekte gerekli script ve css dosyalarının bower_components klasörü altında olduğuna dikkat ediniz. jquery-confirm kütüphanesini bower ile de kurabilirsiniz. Eğer bower kullanmıyorsanız jquery-confirm'in örnek projesini sitesinden indirip yukarıdaki dosyaları projenize ekleyebilirsiniz. 

Ok tuşuna bastığınızda confirm dialogu görebilirsiniz

Görüntü aşağıdaki gibidir:


Alıntı

Atmosfer ve Comet

Atmosfer, HTTP sunucudan web tarayıcısına, kullanıcının herhangi özel bir isteği olmaksızın bilgi aktarmasına yarayan bir çözüm.
Sahipleri : Yusuf Boyacıgil
Bu yazı izinle alıntılanmıştır : http://yboyacigil.com/turkish/atmosphere-and-comet/
Atmosfer (Atmosphere) isimli bir framework geçen hafta başında geldi beni buldu. Normalde oturup şöyle birşey var inceleyeyim şeklinde değil de bu sefer kendisi bana geldi.
Burada bir paragraf açıp şöyle acayip bir teorim/inanışım var ondan bahsedeyim: Internet gezginleri şu şekilde seviyelendirilebilir:
  • İlk seviye öylesine gezinenlerin seviyesidir. Onlar için önemli olan gezmektir. Amaç odur.
  • Sonraki “bilinçli tüketici” seviyesidir. Onlar özel birşeye bakar ve onu bir şekilde arar, bulurlar.
  • Daha sonraki seviye internete herhangi bir içeriği koyanlarındır. Bu seviyedekiler diğer iki seviyeden daha yukarıdadır.
  • Son ve en üst seviye ise aranılan şeyin mucizevi bir şekilde bulunduğu seviyedir. O seviyedekinin birşeyi aramasına bile gerek yoktur. Yeri ve zamanı geldiğinde aradığı şey onu bulur. Ben kendimi bu seviyede olan şanslı veya seçilmiş kişi olarak görürüm. İçeriğin beni bulduğu çok olmuştur.

Atmosfer, HTTP sunucudan web tarayıcısına, kullanıcının herhangi özel bir isteği olmaksızın bilgi aktarmasına yarayan bir çözüm. Biliyorum bir önceki cümle pek bir anlam ifade etmiyor. Bir örnekle açıklayayım: Twitter hesabınıza girdiğinizde takip ettiklerinizin twit’lerini sayfayı ilk görüntülediğinizde görebiliyorsunuz. Ama o esnada aynı kişiler yeni twitler yayınlayabilirler değil mi? Bunları nasıl görebilirsiniz? Sayfayı tekrar yükletirsiniz olur biter! Evet olur biter ama ya siz yükletmezseniz ya siz yüklettiğinizde çok geç olmuşsa. Devamlı tekrar yüklemek zorunda mısınız? “Otomatik yükletirim abi, tarayıcılar bunu destekliyor zati” diyecek süper kullanıcılar veya “Abi, script’le sayfayı tekrar yükletmek mümkün, sen ne anlatıyosun!”diyecek programcı ruhlu kardeşler çıkabilir. Ama olayımız o değil! İşte atmosfer bu twit’leri siz sayfayı tekrar yüklemeden/yükletmeden görüntületmeyi sağlayabilecek bir çözüm.
Aslında bu tip sunucudan tarayıcıya doğru ve tarayıcının istemesine gerek kalmadan bilgi aktarımı teknolojisine Comet deniyor. Atmofer comet tekniğini kullanarak bu işi hem tarayıcı hem de sunucu tarafında çözen yapıları sağlıyor. Atmosferin detayına bu yazıda girmek niyetinde değilim.
Biraz comet’ten bahsedeyim: Comet yukarıdaki örnekte anlattığım devamlı yükleme yapmayı/yaptırmayı elemine etmek için sunucu tarafından kapatılmayan özel bir tarayıcı isteğine, içerik oluştukça tarayıcıya veri göndererek cevap veren bir yöntem sağlıyor.
Sunucu tarafında kapatılmayan özel bir istek ne ola ki derseniz: HTTP sunucu veriyi istemcisine ya tek seferde ya da parçalar halinde (chunked) iletir. Parçalar halinde iletme durumunda en son parça gelene kadar tarayıcı isteği son bulmaz. Eğer sunucu en son parçayı sana gönderdim dedirtilmezse, tarayıcı ondan veri geldikçe işlemeye devam eder.
İşte comet tekniği ile sunucu devamlı veri gönderek tarayıcının sayfanın bazı bölümlerini gerektiğinden değiştirmesi sağlanabilir. Bu gönderilen veri ya script olarak iletilir ve tarayıcı tarafından geldikçe çalıştırılır. Ya da JSON veya XML gibi verilerdir yine daha önceden yüklenmiş script’ler tarafından işlenir.
Comet tekniği ile biraz zorlama gibi gözüken bu tip veri aktarımı işine daha kolay ve entegre çözüm HTML5 ile gelen websocket teknolojisidir. Websocket HTTP sunucusu tarafından da desteklenen ve veri aktarımı için açılan çift yönlü bir kanaldır. Bu kanal üzerinde sunucu ve tarayıcı birbirleri ile veri paylaşımı yapabilirler. Neredeyse yeni versiyon tüm web tarayıcıları HTML5’i destekliyor.
Atmosfer aynı zamanda websocket’i de destekleyen sunucu ve tarayıcılarla da çalışabiliyor. O bakımdan, internete çok çeşitli tarayıcılarla bağlanan kullanıcılar olduğu için web uygulama geliştiricileri için bu özelliği onu öne çıkarıyor.
Son olarak; web uygulamalarında comet tekniği kullanmak isteyenlerin atmosferi kesinlikle değerlendirmeleri gerekir diye düşünüyorum.

İpucu

Google Hesabı İle Sitenize Giriş Yapılabilmesini Sağlama

Bazı web sitelerinde Google ile giriş yap, Facebook ile giriş yap gibi düğmeler görebilirsiniz. Bu siteler Google abonelerini kolay bir şekilde giriş yapmasıını sağlayarak kullanıcıları kayıt yükünden kurtarmaktadır.
Google bu işlevi gerçekleştirmek için yarattığı ürüne Google Sign-In adı verilmektedir ve bu ürün OAuth 2.0 standartlarına uygun geliştirilmiştir.
İlk iş olarak Client ID yaratılması gerekir. Bu client id ile sign-in API'leri çağrılabilecektir. Client ID alınabilmesi için de Google API Console projesi yaratılması gerekir. Bunun için console.developers.google.com/apis/dashboard sayfasında OAuth İzin ekranı bölümü kullanılabilir. Burada bir üye giriş yaptığında geriye neler döndürüleceği gibi bilgiler seçilebilir. Privacy Policy bilgileri içeren bir bağlantı adresi de eklenmesi gerekiyor. Proje yaratılıp Client Id alındıktan sonra ikinci aşamaya geçilebilir.
İkinci işlem olarak Google ile Giriş yap düğmesi sayfanıza eklenmesi gerekir. Aşağıdaki bölüm header bölümüne eklenebilir:
<script src="https://apis.google.com/js/platform.js" async="async" defer="defer">
	{lang:'tr'}
</script>
Ardından düğmenin kendisi eklenir
<div class="g-signin2" data-onsuccess="onSignIn"></div>
Eğer üye zaten loginli ise işlemi başarılı olur ver onSignIn yöntemi çağrılır. Kullanıcı bu durumda giriş ekranını görmesine dahi gerek yoktur. Eğer Google'a daha önce giriş yapmadıysa Google giriş ekranı açılır.
<script type="text/javascript">
function onSignIn(googleUser) {
  var id_token = googleUser.getAuthResponse().id_token;
  var xhr = new XMLHttpRequest();
  xhr.open('POST', 
	'#{request.contextPath}/GoogleTokenSigninServlet');
  xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  xhr.onload = function() {
	  if(xhr.status==200){
		location.href="/";
	  }
  };
  xhr.send('idtoken=' + id_token);
}
</script>
Eğer işlem başarılı olursa GoogleTokenSigninServlet adında bir Servlet çağrılır. Bu Servlet kullanıcının mail adresi vb.. bilgilerini alan ve giriş yapan, eğer üye değilse kayıt yapan servlettir.
@WebServlet("/GoogleTokenSigninServlet")
public class GoogleTokenSigninServlet extends HttpServlet {
	private String CLIENT_ID = "1047450979973-rqpakuc4ekv7a79enedssgtpahcjo8ds.apps.googleusercontent.com";
	public GoogleTokenSigninServlet() {
		super();
	}
	protected void doGet(HttpServletRequest request, 
		HttpServletResponse response)
			throws ServletException, IOException {
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		String idtoken = request.getParameter("idtoken");
		
		if(idtoken==null || idtoken.isEmpty()){
			System.out.println("Invalid google ID token.");
			response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
			return;
		}
		GoogleIdTokenVerifier verifier = new GoogleIdTokenVerifier.Builder(new NetHttpTransport(), new JacksonFactory())
			    .setAudience(Collections.singletonList(CLIENT_ID))
			    .build();
		GoogleIdToken idToken=null;
		try {
			idToken = verifier.verify(idtoken);
		} catch (GeneralSecurityException e) {
			e.printStackTrace();
			response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
			return;
		}
		
		if (idToken != null) {
			Payload payload = idToken.getPayload();
			String userId = payload.getSubject();
			System.out.println("User ID: " + userId);
			String email = payload.getEmail();
			boolean emailVerified = Boolean.valueOf(payload.getEmailVerified());
			
			String name = (String) payload.get("name");
			System.out.println("email:" + email  + " emailVerified:" + emailVerified+" name:"+name);
			
			// üye mi değil mi kontrol ediliyor email adresine gore.
			// üye değilse kayıt ediliyor. Üye ise sadece login yapılıyor
				
			response.setStatus(HttpServletResponse.SC_OK);
			return;
		} else {
			System.out.println("Invalid ID token.");
			response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
			return;
		}
	}
}

İpucu

Facebook Hesabı İle Sitenize Giriş Yapılabilmesini Sağlama

Bazı web sitelerinde Facebook ile giriş yap, Google ile giriş yap gibi düğmeler görebilirsiniz. Bu siteler Facebook abonelerini kolay bir şekilde giriş yapmasıını sağlayarak kullanıcıları kayıt yükünden kurtarmaktadır.
Öncelikle Facebook'da bir developer hesabı almak gerekir : developers.facebook.com
İlk iş olarak bir App yaratılması gerekir. App yaratıldıktan sonra Facebook Login yaratılabilir.
İkinci işlem olarak Facebook ile Giriş yap düğmesi sayfanıza eklenmesi gerekir. Aşağıdaki bölüm header bölümüne eklenebilir. Bu facebook ile ilgili araçları kullanmak için gereklidir.
<script>
	  window.fbAsyncInit = function() {
	    FB.init({
	      appId      : '692669434443081',
	      cookie     : true,
	      xfbml      : true,
	      version    : 'v3.1'
	    });	      
	    FB.AppEvents.logPageView();	      
	  };
	
	  (function(d, s, id){
	     var js, fjs = d.getElementsByTagName(s)[0];
	     if (d.getElementById(id)) {return;}
	     js = d.createElement(s); js.id = id;
	     js.src = "https://connect.facebook.net/en_US/sdk.js";
	     fjs.parentNode.insertBefore(js, fjs);
	   }(document, 'script', 'facebook-jssdk'));
	</script>
Ardından düğmenin kendisi eklenir
<fb:login-button size="large"
		scope="public_profile,email"
	onlogin="checkLoginState();">
	<span style= "margin-right: 10px;">Facebook</span>
</fb:login-button>
Burada JSF kullanıldığı için fb namsepace'i xmlns:fb="http://www.facebook.com/2008/fbml" şeklinde eklenmiştir.
Eğer üye zaten loginli ise işlemi başarılı olur ver checkLoginState yöntemi çağrılır. Kullanıcı bu durumda giriş ekranını görmesine dahi gerek yoktur. Eğer Facebook'a daha önce giriş yapmadıysa Facebook giriş ekranı açılır.
<script>
function statusChangeCallback(response) {
	if (response.status === 'connected') {
		FB.api('/me', {fields:'id,name,email'}, function(meResponse) {
		  var xhr = new XMLHttpRequest();
		  xhr.open('POST', '#{request.contextPath}/FacebookTokenSigninServlet');
		  xhr.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
		  xhr.onload = function() {
			  if(xhr.status==200){
				location.href="/";
			  }
		  };
		  xhr.send('token=' + response.authResponse.accessToken
				  +'&amp;userID='+response.authResponse.userID
				  +'&amp;email='+meResponse.email
				  +'&amp;name='+meResponse.name);		
		});	  
	}
}
</script>
<script type="text/javascript">
	function checkLoginState() {
	  FB.getLoginStatus(function(response) {
		statusChangeCallback(response);
	  });
	}
</script>
Eğer işlem başarılı olursa FacebookTokenSigninServletadında bir Servlet çağrılır. Bu Servlet kullanıcının mail adresi vb.. bilgilerini alan ve giriş yapan, eğer üye değilse kayıt yapan servlettir.
@WebServlet("/FacebookTokenSigninServlet")
public class FacebookTokenSigninServlet extends HttpServlet {
	private String CLIENT_ID = "1047450979973-rqpakuc4ekv7a79enedssgtpahcjo8ds.apps.googleusercontent.com";
	public FacebookTokenSigninServlet() {
		super();
	}
	protected void doGet(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response)
			throws ServletException, IOException {
		
		String token = request.getParameter("token");
		String userID = request.getParameter("userID");
		String name = request.getParameter("name");
		String email = request.getParameter("email");
		if(token==null || token.isEmpty() || userID==null || userID.isEmpty()){
			System.out.println("Invalid facebook ID token.");
			response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
			return;
		}
		
		if(email==null || email.isEmpty()){
			System.out.println("Invalid facebook ID token.");
			response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
			return;
		}
		
		// GET appToken from appLink
		String accessToken = getAccessToken(token);
		if(accessToken==null){
			System.out.println("access token is null");
			response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
			return;
		}
		
		boolean validate=validate(token, accessToken, userID);
		if(!validate){
			response.setStatus(HttpServletResponse.SC_BAD_REQUEST);
			return;
		}
				
		try {
			
			// üye mi değil mi kontrol ediliyor email adresine gore.
			// üye değilse kayıt ediliyor. Üye ise sadece login yapılıyor
			
			response.setStatus(HttpServletResponse.SC_OK);
			return;
			
		} catch (DatabaseException e) {
			e.printStackTrace();
			response.setStatus(HttpServletResponse.SC_BAD_GATEWAY);
			return;
		}
				
	}
	
	private String getAccessToken(String token) throws ClientProtocolException, IOException{
		
		String appLink = 
				"https://graph.facebook.com/oauth/access_token?"
				+ "client_id=692669434443081&client_secret=123456&"
				+ "grant_type=client_credentials";
		
		String accessToken  = null;
		DefaultHttpClient httpclient = new DefaultHttpClient();
		try {
			HttpGet httpget = new HttpGet(appLink);
			ResponseHandler<String> responseHandler = new BasicResponseHandler();
			String responseBody = httpclient.execute(httpget, responseHandler);
			JsonParser parser = new JsonParser();
			JsonObject json = parser.parse(responseBody).getAsJsonObject();
			return json.get("access_token").getAsString();
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			httpclient.getConnectionManager().shutdown();
		}
		return accessToken;
		
	}
	
	private boolean validate(String token, String accessToken, String userID) {
		
		String link = "https://graph.facebook.com/debug_token?input_token="
 +  token + "&access_token=" + URLEncoder.encode(accessToken);
		
		DefaultHttpClient httpclient = new DefaultHttpClient();
		try {
			HttpGet httpget = new HttpGet(link);
			ResponseHandler<String> responseHandler = new BasicResponseHandler();
			String responseBody = httpclient.execute(httpget, responseHandler);
			
			Map map=getGraphData(responseBody);
			
			if(map.get("user_id").equals(userID)){
				return true;
			}
			
		} catch (ClientProtocolException e) {
			e.printStackTrace();
		} catch (IOException e) {
			e.printStackTrace();
		} finally {
			httpclient.getConnectionManager().shutdown();
		}
		
		return false;
		
	}
	private Map getGraphData(String fbGraph) {
		
		Map fbProfile = new HashMap();
			
		JsonParser parser = new JsonParser();
		JsonObject json = parser.parse(fbGraph).getAsJsonObject();
		
		JsonObject data=(JsonObject)json.get("data");
		
		fbProfile.put("user_id", data.get("user_id").getAsString());
		
		if(json.has("first_name")){
			fbProfile.put("first_name", json.get("first_name").getAsString());
		}
		if(json.has("last_name")){
			fbProfile.put("last_name", json.get("last_name").getAsString());
		}
		if (json.has("email")){
			fbProfile.put("email", json.get("email").getAsString());
		}
		return fbProfile;
	}
}

Materyal

Doğrudan Web Front-End Kitabını Zafer Teker Tanıtıyor

Doğrudan Web Front-End kitabını yazarı Zafer Teker tanınıyor.Kitaptaki hangi konular olduğundan bahsedilmektedir.Kitaptaki konular : HTML, CSS, Javascript ve Web ve Front-End geliştiricilerin bilmesi gereken temel teknolojiler

Materyal

Web ve Front-End Dilleri ve Framework'leri

Web Front-End Geliştirme ile ne kastedilmektedir.
Web Programlama , HTML, CSS , Javascript nedir ?
HTML 5 ve CSS 3 nedir ?
SASS ve LESS niçi kullanılır ?
Responsive Dizayn ve Bootstrap nedir ?
Ecma script nedir ?
TypeScript nedir ?
Node.js , NPMne için kullanılır ?
JQuery nedir ?
Angular ve React nedir? Farkları nedir ?

Materyal

Godoro Tanıtım - Görüntülü Eğitim - HTML & CSS

Godoro HTML & CSS görüntülü eğitiminin tanıtımı.



Bu Sayfayı Paylaş:

İletişim Bilgileri

Takip Et

Her Hakkı Saklıdır. Bu sitede yayınlanan tüm bilgi ve fikirlerin kullanımından fibiler.com sorumlu değildir. Bu sitede üretilmiş , derlenmiş içerikleri, fibiler.com'u kaynak göstermek koşuluyla kendi sitenizde kullanılabilirsiniz. Ancak telif hakkı olan içeriklerin hakları sahiplerine aittir