Join Now
Quality Rating:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)
Expertise Level:
  • Currently 0.0 / 5
(0.0 / 5 - 0 votes cast)

This page was last modified 02:30, 4 July 2008.

Session management in J2ME

From Forum Nokia Wiki


The MIDlet and Java Servlet that follow implement session management using cookies. Upon the first request from the client to the servlet, the servlet will generate a unique client ID (simply a random number). This ID will be sent back to the MIDlet as a cookie:

HttpServletResponse res;
...
// Create new cookie and send ID in the header
Cookie cookie = new Cookie("ID", Integer.toString(random));
res.addCookie(cookie);

The MIDlet will store this value in the record store. All future requests from the MIDlet to the servlet will be accompanied by the client ID. When the servlet recognizes that the client (MIDlet) sent a cookie, it will simply return the value of the cookie.

Code Example

import javax.microedition.midlet.*;
import javax.microedition.lcdui.*;
import javax.microedition.rms.*;
import javax.microedition.io.*;
import java.io.*;
 
public class CookieTest extends MIDlet implements CommandListener {
    private Display display;
    private TextBox tbMain;
    private Form fmMain;
    private Command cmExit;
    private Command cmLogon;
    private String cookie = null;
    private RecordStore rs = null;
    static final String REC_STORE = "rms_cookie";
    private String url = "http://www.xxxxxxx.com/servlet/ CookieTestServlet";
    
    
    public CookieTest() {
        display = Display.getDisplay(this);
        
// Create commands
        cmExit = new Command("Exit", Command.EXIT, 1);
        cmLogon = new Command("Logon", Command.SCREEN, 2);
        
// Create the form, add commands, listen for events
        fmMain = new Form("");
        fmMain.addCommand(cmExit);
        fmMain.addCommand(cmLogon);
        fmMain.setCommandListener(this);
        
// Read cookie if available
        openRecStore();
        readCookie();
        
    }
    
    public void startApp() {
        display.setCurrent(fmMain);
    }
    
    public void pauseApp() {
    }
    
    public void destroyApp(boolean unconditional) {
        closeRecStore(); // Close record store
    }
    
    public void openRecStore() {
        try {
// The second parameter indicates that the record store
// should be created if it does not exist
            rs = RecordStore.openRecordStore(REC_STORE, true);
        } catch (Exception e) {
            db("open " + e.toString());
        }
    }
    
    public void closeRecStore() {
        try {
            rs.closeRecordStore();
        } catch (Exception e) {
            db("close " + e.toString());
        }
    }
    
    
    public void writeRecord(String str) {
        byte[] rec = str.getBytes();
        
        try {
            rs.addRecord(rec, 0, rec.length);
        } catch (Exception e) {
            db("write " + e.toString());
        }
    }
    
    public void readCookie() {
        try {
            byte[] recData = new byte[25];
            int len;
            
            if (rs.getNumRecords() > 0) {
// Only one record will ever be written, safe to use '1'
                if (rs.getRecordSize(1) > recData.length)
                    recData = new byte[rs.getRecordSize(1)];
                
                len = rs.getRecord(1, recData, 0);
                
                cookie = new String(recData);
            }
        } catch (Exception e) {
            db("read " + e.toString());
        }
    }
    
/*--------------------------------------------------
 * Send client request and recieve server response
 *
 * Client: If cookie exists, send it to the server
 *
 * Server: If cookie is sent back, this is the
 * clients first request to the server. In
 * that case, save the cookie. If no cookie
 * sent, display the string sent from the
 * server
 *-------------------------------------------------*/
    private void connect() throws IOException {
        InputStream iStrm = null;
        ByteArrayOutputStream bStrm = null;
        HttpConnection http = null;
        
        try {
// Create the connection
            http = (HttpConnection) Connector.open(url);
            
//----------------
// Client Request
//----------------
// 1) Send request method
            http.setRequestMethod(HttpConnection.GET);
            
// If you experience connection/IO problems, try
// removing the comment from the following line
//http.setRequestProperty("Connection", "close");
            
// 2) Send header information
            if (cookie != null)
                http.setRequestProperty("cookie", cookie);
            
            System.out.println("Client cookie: " + cookie);
            
// 3) Send body/data - No data for this request
            
//----------------
// Server Response
//----------------
// 1) Get status Line
            if (http.getResponseCode() == HttpConnection.HTTP_OK) {
// 2) Get header information
                String tmpCookie = http.getHeaderField("set-cookie");
                System.out.println("server cookie: " + tmpCookie);
                
// Cookie will only be sent back from server only if
// client (us) did not send a cookie in the first place.
// If a cookie is returned, we need to save it to rms
                if (tmpCookie != null) {
                    writeRecord(tmpCookie);
                    
// Update the MIDlet cookie variable
                    cookie = tmpCookie;
                    
                    fmMain.append("First visit\n");
                    fmMain.append("Client : " + cookie + "\n");
                } else // No cookie sent from server
                {
// 3) Get data, which is the last time of access
                    iStrm = http.openInputStream();
                    int length = (int) http.getLength();
                    String str;
                    if (length != -1) {
                        byte serverData[] = new byte[length];
                        iStrm.read(serverData);
                        str = new String(serverData);
                    } else // Length not available...
                    {
                        bStrm = new ByteArrayOutputStream();
                        
                        int ch;
                        while ((ch = iStrm.read()) != -1)
                            bStrm.write(ch);
                        
                        str = new String(bStrm.toByteArray());
                    }
                    
// Append data to the form
                    fmMain.append(str + "\n");
                }
            }
        } finally {
// Clean up
            if (iStrm != null)
                iStrm.close();
            if (bStrm != null)
                bStrm.close();
            if (http != null)
                http.close();
        }
    }
    
/*--------------------------------------------------
 * Process events
 *-------------------------------------------------*/
    public void commandAction(Command c, Displayable s) {
// If the Command button pressed was "Exit"
        if (c == cmExit) {
            destroyApp(false);
            notifyDestroyed();
        } else if (c == cmLogon) {
            try {
// Logon to the servlet
                connect();
            } catch (Exception e) {
                db("connect " + e.toString());
            }
        }
    }
    
    private void db(String str) {
        System.err.println("Msg: " + str);
    }
}
/*--------------------------------------------------
 * CookieTestServlet.java
 *
 * Use a cookie to identify clients
 *
 * www.CoreJ2ME.com
 *-------------------------------------------------*/
package corej2me; // Required for mycgiserver.com
 
import java.util.*;
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.sql.*;
import java.text.*;
 
public class CookieTestServlet extends HttpServlet {
    
    protected void doGet(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {
// Get cookie from the header
        Cookie[] cookies = req.getCookies();
        
//-------------------------------------------
// If cookie passed in...
// return the value of the cookie
// to the cleint
//-------------------------------------------
        if (cookies != null) {
// There will be only one cookie
            Cookie theCookie = cookies[0];
            String id = theCookie.getValue();
            
// Send back the last access date to the client
            res.setContentType("text/plain");
            PrintWriter out = res.getWriter();
            out.print("Cookie passed in was: " + id);
            out.close();
        } else // No Cookie
        {
//-------------------------------------------
// Generate a unique client ID, which is
// nothing more than a random number
//-------------------------------------------
            
// Random ID
            int random = (int) Math.round(100 * Math.random());
            
// Create new cookie and send ID in the header
            Cookie cookie = new Cookie("ID", Integer.toString(random));
            res.addCookie(cookie);
        }
    }
    
/*--------------------------------------------------
 * Information about servlet
 *-------------------------------------------------*/
    public String getServletInfo() {
        return "CookieTest";
    }
}
Related Discussions
Thread Thread Starter Forum Replies Last Post
Where are S40 Emulator Drives? titani2 Mobile Java General 4 2007-04-19 20:42
WML, ASP and Session Object jrios General Browsing 1 2002-10-19 17:00
how 2 track the error in this......? bharats General Symbian C++ 14 2006-12-15 08:20
Server sessions question... profoundwhispers General Symbian C++ 1 2005-03-04 09:42
有没有高手求教一下啊。都快被S60 FP2 的Ethernet emulator 搞死了 Armey Symbian 24 2005-12-01 01:19
 
Powered by MediaWiki
     
     RDF Facets:
     
     
     qfnZtopicQUqfnTopicZjavaQ
     qfnZtypeQUqfnTypeZCommunityContentQ
     qfnZtypeQUqfnTypeZWebpageQ
     qfnZtypeQUqfnTypeZWikiContentQ
     qmarsZlanguageQUxhttpE3aE2fE2fswE2enokiaE2ecomE2flanguageE2d1E2fenX