Search code examples
servletshttpsession

java servlet session maintain


I have develop servlet for generate Captcha code & add session name code

Generate Capta-code

import javax.servlet.*;
import java.io.*;
import java.awt.*;
import java.util.Random;
import java.awt.image.*;
import javax.imageio.*;
import javax.servlet.http.*;
public class capta extends HttpServlet
{

    final int LEN=10;
    BufferedImage image;
    Random rnd;
    public void doGet(HttpServletRequest req,HttpServletResponse rep)
    {
        try
        {
            image = new BufferedImage(200, 80, BufferedImage.TYPE_INT_RGB); 
            rnd=new Random();
            rep.setContentType("image/jpeg");
            String random_String=getRandomNumbers();
            HttpSession ses=req.getSession();
            ses.setAttribute("code",random_String);
            Graphics g = image.getGraphics();
            g.setFont(new Font("Maiandra GD",1,30));
            g.setColor(Color.blue); 
            g.drawString(random_String,3,50);
            g.dispose();
            /// it was here
            ImageIO.write(image, "jpg", rep.getOutputStream());
        }
        catch(Exception e)
        {
            
        }
    }
    private String getRandomNumbers()
    {
        StringBuffer str=new StringBuffer();
        for(int i=1;i<=9;i++)
        {
            str.append(new Integer(rnd.nextInt(9)).toString()); 
        }
        return str.toString();
    }

    public void doPost(HttpServletRequest req,HttpServletResponse rep)throws ServletException , IOException
    {
        doGet(req,rep);
    }

}

Use Generate capta-image in other servlet

import javax.servlet.*;
import java.io.*;
import javax.servlet.http.*;
public class capta_test extends HttpServlet
{

    
    public void doGet(HttpServletRequest req,HttpServletResponse rep)
    {
        PrintWriter out=null;
        try
        {
            String input=req.getParameter("txt_capta");
            out=rep.getWriter();            
            rep.setContentType("text/html");
            out.println("<html><head><title>Capta Test</title></head>");    
            out.println("<body>");  
            out.println("<h1> Capta  is Generated </h1>");
            
            out.println("<img src=\"http://localhost:8080/mahesh/capta\" />");
            HttpSession ses=req.getSession();
            
            String original=(String)ses.getAttribute("code");
            if(original!=null)
            {
                out.println("<h1>Original Value "+original+"</h1>");
            }
            ses.invalidate();
            out.println("</body>");     
            out.println("</html>"); 
        }
        catch(Exception e)
        {
            
        }
    }

    public void doPost(HttpServletRequest req,HttpServletResponse rep)throws ServletException , IOException
    {
        doGet(req,rep);
    }

}

Both servlet work fine but I am not getting the session value which is generate in Capta-code servelt(added in servlet)
I am getting session value which is generate in previous capta-image.

See output :
Output - 1

Output - 1

Output - 2

enter image description here

Output - 3

enter image description here

Thank you ..


Solution

  • Put the random number generation logic in capta_test servlet and put that number in session. Because you are rendering HTML, the capta servlet will be called after the page load like this and do not invalidate the session.

    Random number generator

    import javax.servlet.*;
    import java.io.*;
    import javax.servlet.http.*;
    public class capta_test extends HttpServlet
    {
    public void doGet(HttpServletRequest req,HttpServletResponse rep)
    {
        PrintWriter out=null;
        try
        {
            String original=getRandomNumbers();
            HttpSession ses=req.getSession(false);
            ses.setAttribute("code",random_String);
            String input=req.getParameter("txt_capta");
            out=rep.getWriter();            
            rep.setContentType("text/html");
            out.println("<html><head><title>Capta Test</title></head>");    
            out.println("<body>");  
            out.println("<h1> Capta  is Generated </h1>");
    
            out.println("<img src=\"http://localhost:8080/mahesh/capta\" />");
            out.println("<h1>Original Value "+original+"</h1>");
            out.println("</body>");     
            out.println("</html>"); 
        }
        catch(Exception e)
        {
    
        }
    }
    
    public void doPost(HttpServletRequest req,HttpServletResponse rep)throws ServletException , IOException
    {
        doGet(req,rep);
    }
    private String getRandomNumbers()
    {
        Random rnd=new Random();
        StringBuffer str=new StringBuffer();
        for(int i=1;i<=9;i++)
        {
            str.append(new Integer(rnd.nextInt(9)).toString()); 
        }
        return str.toString();
    }
    }
    

    Image generator servlet

    import javax.servlet.*;
    import java.io.*;
    import java.awt.*;
    import java.util.Random;
    import java.awt.image.*;
    import javax.imageio.*;
    import javax.servlet.http.*;
    public class capta extends HttpServlet
    {
    
    
    
      final int LEN=10;
    
    BufferedImage image;
    public void doGet(HttpServletRequest req,HttpServletResponse rep)
    {
        try
        {
            HttpSession ses=req.getSession(false);
    
            String random_String=(String)ses.getAttribute("code");
            image = new BufferedImage(200, 80, BufferedImage.TYPE_INT_RGB); 
            rep.setContentType("image/jpeg");
            Graphics g = image.getGraphics();
            g.setFont(new Font("Maiandra GD",1,30));
            g.setColor(Color.blue); 
            g.drawString(random_String,3,50);
            g.dispose();
            /// it was here
            ImageIO.write(image, "jpg", rep.getOutputStream());
        }
        catch(Exception e)
        {
    
        }
    }
    public void doPost(HttpServletRequest req,HttpServletResponse rep)throws ServletException , IOException
    {
        doGet(req,rep);
    }
    
    }