Forum: Projeler turna RSS
Ortam Değişkenine Değer Yazdırmak?(çerez methodu için)
Sayfa:  1  2  3  4  sonraki 
canalpay (Moderatör) #1
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Konu adı: Ortam Değişkenine Değer Yazdırmak?
Özellikle çerez(cookie) için bunu soruyorum.

Çerezi şöyle edinebiliyoruz:

    string cookie = getenv("HTTP_COOKIE");


Bunu oluşturma biçimide vardır. Bu nasıl olabilir?

Bu sefer şu adresten akıl yürütüyorum:http://arsdnet.net/dcode/cgi.d (Bu arada direk belki bu modülü kullanabiliriz. Sizce kendimiz mi yazalım bu modülü mü kullanalım?)

 
hd ~= "Set-Cookie: " ~ c; c verdiğimiz parametreler olacak. hd değişkeninde biriktiriyoruz.
 
             foreach(h; hd) {
                if(rawDataOutput !is null)
                    rawDataOutput(cast(const(ubyte)[]) (h ~ "\r\n"));
                else
                    writeln(h);
            }

Biçiminde ise yazıyoruz.
acehreli (Moderatör) #2
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4396 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
    string cookie = getenv("HTTP_COOKIE");


Bunu oluşturma biçimide vardır. Bu nasıl olabilir?

Ortam değişkenleri çok kısa ömürlüdürler. Onlar bizi başlatan ortam tarafından oluşturulurlar. CGI programlarının ömrü de çok kısa olduğu için biz yanıt HTML belgesini yazıp çıkınca olay biter.

Çerez değerini bir şekilde bizim yaşatmamız gerekiyor. Oturumla ilgili bilgiyi dosyaya veya veri tabanına bile yazabiliriz.

Hatta zamanından PayPal'ın bile yaptığı gibi, oturumla ilgili bütün bilgi HTML yanıtımızın içindeki gizli bir alan olarak kullanıcıya gider, ve kullanıcı her tıkladığında biz onu o bilgiden tanırız. Bu yöntem çok eski teknolojidir, işe yarar, ama bir oturum yöneticisi daha iyi olur.

Tabii web çatısının CGI programından öte bir şey olması gerek. Apache'ye hep canlı duran modüller eklenebiliyordur herhalde. Mengü, sen biliyor musun?

Sizce kendimiz mi yazalım bu modülü mü kullanalım?)

Sen nasıl istersin? :) Kendimiz yazmak daha zevkli ve öğretici olur.

Ali
acehreli (Moderatör) #3
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4396 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
acehreli:
Ortam değişkenleri çok kısa ömürlüdürler.

Buna rağmen değiştirilebildiklerini söylemeyi unuttum:

  http://digitalmars.com/d/2.0/phobos/std_process.html#envir…

Ali
canalpay (Moderatör) #4
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yanıtlanan mesaj #2
Çerez değerini bir şekilde bizim yaşatmamız gerekiyor. Oturumla ilgili bilgiyi dosyaya veya veri tabanına bile yazabiliriz.

Sen nasıl istersin? :) Kendimiz yazmak daha zevkli ve öğretici olur.


Kendimiz yazarsak öğreniriz, ancak durmadan sizi rahatsız edeceğim :-)

Şimdi cookie'lerin erişen kişinin bilgisayarımızda saklanması gerçeğini göz önüne alarak kullanıcının bilgisayarında dosyalar halinde saklayabiliriz hatta saklamamız gerekiyor. Ancak kullanıcının bilgisayarına bu tür veriyi nasıl yerleştireceğiz ve belirli bir zaman sonra nasıl silinmesini sağlayacağız.

Tabi bundan sonra birde session var?

Buraları yazdıktan sonra bence asıl zevkli yerlere başlayacağız.
acehreli (Moderatör) #5
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4396 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
Kendimiz yazarsak öğreniriz, ancak durmadan sizi rahatsız edeceğim :-)

Rahatsız olalım lütfen. Bu sayede kimbilir D ile ilgili de neler ortaya çıkacak. (Bu forum fazla sessiz. :))

cookie'lerin erişen kişinin bilgisayarımızda saklanması

O işi tarayıcılar hallediyor. Biz çerez veriyoruz, karşı tarafın tarayıcısı onu bizim için kaydediyor ve kullanıcı bize her geldiğinde aynı çerez bize tekrar görünüyor.

Bizim yapmamız gereken, o çerez ile kullanıcı için saklamakta olduğumuz oturum bilgiyi eşleştirmek. Yani bizim tarafımızda bir depolama gerekiyor.

Ali

Not: Çerez mi cookie mi?
canalpay (Moderatör) #6
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
O işi tarayıcılar hallediyor. Biz çerez veriyoruz, karşı tarafın tarayıcısı onu bizim için kaydediyor ve kullanıcı bize her geldiğinde aynı çerez bize tekrar görünüyor.

Bizim yapmamız gereken, o çerez ile kullanıcı için saklamakta olduğumuz oturum bilgiyi eşleştirmek. Yani bizim tarafımızda bir depolama gerekiyor.

Evet biliyorum ancak biz çerezi nasıl vereceğiz, daha sonra çerezi nasıl alacağız bunu bilmiyorum.
Not: Çerez mi cookie mi?

Farketmez ikiside bana yabancı sözcük olarak  geliyor ve ikisinide anlıyoruz. Ancak projede adı cookie olacak.
acehreli (Moderatör) #7
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4396 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
Evet biliyorum ancak biz çerezi nasıl vereceğiz, daha sonra çerezi nasıl alacağız bunu bilmiyorum.

Kullanıcıya çerez göndermek için yanıttaki "Set-Cookie" alanı kullanılıyormuş:

  http://en.wikipedia.org/wiki/HTTP_cookie#Setting_a_cookie

Aynı alan tarayıcıdan da bize geri geliyormuş.

Ali
canalpay (Moderatör) #8
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Şimdi cookie oluştururken şöyle bir kod yazacağız:
 
string h="Set-Cookie: "~"name=value";
writeln(h);

Okurkende

string[string] cookie()
{
    string[string] endCookie;
    string cookie = getenv("HTTP_COOKIE");
  
    
    endCookie=fixedString(decode(cookie));
 
    
    
    return endCookie;
}

Yani bu kodu(writeln(cookie())) yazdığımızda şöyle bir çıktı alacağız:
[name:value]
Ayrıca çok zorlanırsak bunu javascript kullandırtarakta yapabiliriz.
canalpay (Moderatör) #9
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Biraz kopya ile yazdım.Konsoldan çalıştırdım ve doğru sonucu verdi:

module library.cookie;
 
import std.process; //  getenv
import std.string;
//import library.convertToUTF8;
import std.uri;
import library.fixedString;
 
 
 
string[string] cookie()
{
    string[string] endCookie;
    string cookie = getenv("HTTP_COOKIE");
  
    
    endCookie=fixedString(decode(cookie));
 
    
    
    return endCookie;
}
 
 
 
void setCookie(string name, string data, long expiresIn = 0, string path = null, string domain = null, bool httpOnly = false)
{
    string[] hd;
    string cookie = name ~ "=";
    cookie ~= data;
    if(path !is null)
        cookie ~= "; path=" ~ path;
    if(expiresIn != 0)
        cookie ~= "; expires=" ~ printDate(expiresIn);
    if(domain !is null)
        cookie ~= "; domain=" ~ domain;
    if(httpOnly == true )
        cookie ~= "; HttpOnly";
    
    responseCookies ~= cookie;
    if(responseCookies !is null && responseCookies.length > 0) {
        foreach(c; responseCookies)
            hd ~= "Set-Cookie: " ~ c;
    }
    std.stdio.writeln(hd);
 
}
// Buna gerek yok ancak
//std.datetime.ToUnixTime işlevini kullanamadım.
/*
 * uniz zaman değeri veren bir işlev gerekiyor.
 */
string printDate(long date) {
    return "Sun, 06 Nov 2011 08:49:37 GMT";
    
    
}
 
 
private string[] responseCookies;
 
void clearCookie(string name, string path = null, string domain = null) {
    setCookie(name, "", 1, path, domain);
}

Ancak şuanki unix zamanını döndüren bir işlev bulamadım. std.datetime'da toUnixTime işlevi vardı ancak kullanınca hata veriyordu. Tanımlanmamış diyordu.Ancak datetime eklenemedi diye bir hatada yoktu. Anlamadım.
acehreli (Moderatör) #10
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4396 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Çerezin ömrü "Max-Age" niteliği ile "şu kadar saniye süre ile geçerlidir" anlamıyla da belirlenebiliyormuş. Şuradan öğrendim:

  http://en.wikipedia.org/wiki/HTTP_cookie#Expires_and_Max-Age

Oradan da bu olanağın RFC sayfasına bir bağlantı var ama fazla teknik :)

  http://tools.ietf.org/html/rfc2965

Yani Max-Age=1000 olunca 1000 saniye ömrü var.

std.date'te toUTCString var ama onun düzeni de tam uymuyor.

Unix'te bu işi yapan strftime() işlevi var.

Veya std.date'teki weekDay() ve arkadaşlarını kullanarak biz de istediğimiz düzende yazdırabiliriz:

    format("... %s ...", ...)

Ama weekDay() 0..7 aralığında bir değer veriyormuş. Onu Sun, Mon, Tue, vs. diye çevirmek gerek. Yapılır işte... :)

Ali
canalpay (Moderatör) #11
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Yani Max-Age=1000 olunca 1000 saniye ömrü var.

En güzel çözüm bu.

std.date'te
std.date deprecation olarak işaretlenmiş, datetime'ı öneriyor. O işleve bakıyorum çok geniş bir modül. Andrei kendi modülünü yapmaktan bile vazgeçirmiş, çok hoş gözüküyor kesin vardır diyorum ancak rastladığım bir hataya denk geliyorum. En çok o hatayı merak ediyorum.

Max-Age=0 için özel davranış var mı? Yada expires için.(0 o anki tarih anlamına gelir herhalde.)

Artık bu bitti session için yeni bir konu açabiliriz.
canalpay (Moderatör) #12
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
canalpay:
Konsoldan çalıştırdım ve doğru sonucu verdi:
Ancak doğru çalışmıyor. O kodda eşleme tablosunu direk kullandığım için "[,]" karakterleri vardı.

Bende kodları şuna çevirdim:
    dout.writef("<html>\n  <body>\n");

    dout.writef("\n<hr>\n<b>Ortam değişkenleri:</b><br><br>\n");


yine olmadı. Bende fikir tükendi.
acehreli (Moderatör) #13
Kullanıcı başlığı: Ali Çehreli
Üye Haz 2009 tarihinden beri · 4396 mesaj
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
Ben hiçbir şey anlamadım. :(

foreach'in eşleme tablolarındaki indeks ve değer için şu kullanımını mı hatırlamıyorsun?

    foreach(indek, değer; tablo) {

İlgisiz olarak, yukarıdaki kodlarda bir şey farkettim: Şu koddaki responseCookies.length > 0 denetimine gerek yok:

    if(responseCookies !is null && responseCookies.length > 0) {
        foreach(c; responseCookies)

Çünkü 0 olduğunda foreach döngüsüne hiç girilmez zaten.

Ali
canalpay (Moderatör) #14
Kullanıcı başlığı: Can Alpay Çiftçi
Üye Tem 2009 tarihinden beri · 1133 mesaj · Konum: İzmir
Grup üyelikleri: Genel Moderatörler, Üyeler
Profili göster · Bu konuya bağlantı
foreach'in eşleme tablolarındaki indeks ve değer için şu kullanımını mı hatırlamıyorsun?

Yok canım hatırlıyorum. Hatırlamasam bile dersane var :-)

Ben şöyle bir kod kullansam bile cookie'yi ayarlayamadım:

    dout.writef("<html>\n  <body>\n");

    dout.writef("\n<hr>\n<b>Ortam değişkenleri:</b><br><br>\n");

Yani setCookie işlevini çalışan bir örneğini yazamadım.
Kadir Can #15
Üye Haz 2010 tarihinden beri · 413 mesaj
Grup üyelikleri: Üyeler
Profili göster · Bu konuya bağlantı
HTML ile cookie oluşturulabiliyor mu?

Bence bu noktada diğer dillerden faydalanalım.Örneğin cookie,session tarzı işlemleri PHP altyapısıyla sunalım.
Bu mesaj Kadir Can tarafından değiştirildi; zaman: 2011-02-11, 11:09.
Doğrulama Kodu: VeriCode Lütfen resimde gördüğünüz doğrulama kodunu girin:
İfadeler: :-) ;-) :-D :-p :blush: :cool: :rolleyes: :huh: :-/ <_< :-( :'( :#: :scared: 8-( :nuts: :-O
Özel Karakterler:
Sayfa:  1  2  3  4  sonraki 
Forum: Projeler turna RSS
Bağlı değilsiniz. · Şifremi unuttum · ÜYELİK
This board is powered by the Unclassified NewsBoard software, 20100516-dev, © 2003-10 by Yves Goergen
Şu an: 2017-05-27, 12:22:28 (UTC -07:00)