26 Nisan 2010 Pazartesi

MSISDN Yönlendirme (MSISDN Forwarding) Java Kod Örneği

MSISDN nedir diye soruyorsanız, muhtemelen bu makale size uygun değil :). Yine de wikiye bir göz atın..
http://tr.wikipedia.org/wiki/MSISDN

Muhtemelen bir WAP uygulaması geliştiriyorsunuz ve operatörünüz (örnek: Turkcell) uygulamanıza msisdn yönlendirmesi (msisdn forwarding) yapıyor. Bu durumda MSISDN'i HTTP başlıklarından okumanız gerekmekte. Kullanacağınız başlık bir çerez (cookie) olarak yer alan User-Identity-Forward-msisdn.

905301234567 için User-Identity-Forward-msisdn içeren örnek bir çerez:
Cookie: User-Identity-Forward-msisdn=393035333031323334353637;...


Buna göre Java için örnek servlet şu şekilde:


import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* @author aLi -- http://kodornegi.blogspot.com
*/
public class MsisdnOrnekServlet extends HttpServlet {

private static final long serialVersionUID = -6971624334249419092L;

private static String hex2ascii(String s) {
StringBuilder ascii = new StringBuilder();
for (int i = 0; i < s.length(); i+=2) {
int c = Integer.parseInt(s.substring(i, Math.min(i+2, s.length())), 16);
ascii.append(c == 0 ? '?' : (char) c);
}
return ascii.toString();
}

private static String getMsisdnFromCookie(HttpServletRequest request, boolean msisdnHex) {
String msisdn = null;
Cookie[] cookies = request.getCookies();
if (cookies != null) {
for (int i = 0; i < cookies.length; i++) {
if (cookies[i] != null) {
if ("User-Identity-Forward-msisdn".equalsIgnoreCase(cookies[i].getName())) {
msisdn = msisdnHex ? hex2ascii(cookies[i].getValue()) : cookies[i].getValue();
break;
}
}
}
}
return msisdn;
}

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
String msisdn = getMsisdnFromCookie(request, true);
}

@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws IOException {
String msisdn = getMsisdnFromCookie(request, true);
}
}


Eğer MSISDN, onaltılı (hexadecimal) sayı düzeninde yönlendirilmiyorsa bu durumda, yukarıdaki kodda doGet ve doPost metodları içinde
String msisdn = getMsisdnFromCookie(request, true);

satırlarını şu şekilde değiştirmeniz gerekiyor:
String msisdn = getMsisdnFromCookie(request, false);


SSL (HTTPS)

Eğer uygulamanız SSL (HTTPS üzerinde) çalışıyorsa bu durumda, operatörünüzün MSISDN yönlendirmesi çalışmayacaktır. Çünkü HTTP başlıklarına MSISDN'i ekleyecek olan WAP Gateway, bir HTTP proxy'dir ve istemci (kullanıcı) ile sunucu (uygulamanız) arasındaki iletişimi görüntüleyemez / değiştiremez. Ancak bu durumun çözümü de yok değil.

1. Kullanıcı HTTP sayfanızı açmak için istek gönderir. (Eğer anasayfanız HTTPS ise HTTP bir sayfaya yönlendirmeyi düşünebilirsiniz. Aşağıda SecureServlet'te MSISDN olmadığı durumda NonSecureServlet'e çevrilmesi yöntemini de kullanabilirsiniz.)
2. Operatör tarafından uygulamanıza yönlendirilen MSISDN, HTTP session'a kaydedilir.
3. HTTP yönlendirme metodları kullanılarak, istek HTTPS sayfaya yönlendirilir.
4. HTTPS sayfada artık MSISDN, session içinde yer alır.

İlk 3 adım için NonSecureServlet'i örnek olarak alabilirsiniz:


import java.io.IOException;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* @author aLi -- http://kodornegi.blogspot.com
*/
public class NonSecureServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
String msisdn = getMsisdnFromCookie(request, true);
request.getSession().setAttribute("MSISDN", msisdn);
response.sendRedirect("https://localhost/secure?redirected=1");
}
}



MSISDN'i almak için HTTPS üzerinde çalışan SecureServlet:


import java.io.IOException;
import java.io.OutputStream;

import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

/**
* @author aLi -- http://kodornegi.blogspot.com
*/
public class SecureServlet extends HttpServlet {

public void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException {
String msisdn = (String) request.getSession().getAttribute("MSISDN");
if (msisdn == null) {
String redirected = request.getParameter("redirected");
if ("1".equals(redirected)) {
// Zaten NonSecureServlet'ten yönlendirilmiş. Msisdn yok..
response.setContentType("text/plain");
OutputStream os = response.getOutputStream();
os.write(("msisdn yok").getBytes());
os.close();
} else {
response.sendRedirect("http://localhost/nonsecure");
}
} else {
response.setContentType("text/plain");
OutputStream os = response.getOutputStream();
os.write(("msisdn: " + msisdn).getBytes());
os.close();
}
}
}

1 yorum: