2013-03-06 3 views
2

У меня есть разработки сервлетов для генерации Captcha код & добавить имя сеанса кодJava Servlet сессии поддерживать

Генерация Capta-код

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); 
    } 

} 

Использование Сформировать capta-изображение в другой сервлет

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); 
    } 

} 

Оба сервлет работают нормально, но я не получаю значение сеанса, которое генерируется в Capta-code servelt (добавлено в сервлет)
Я получаю значение сеанса, которое генерируется в предыдущем capta-изображении.

См выход:
Выход - 1

Output - 1

Выход - 2

enter image description here

Выход - 3

enter image description here

Спасибо ..

+1

Почему вы думаете/ожидать, что сервлет CAPTCHA изображение проходит перед тест CAPTCHA, HTML сервлета? Как браузер когда-либо попадет в сервлет-образчик изображения, прежде чем получить его URL-адрес в элементе '', который присутствует в HTML-выходном файле, создаваемом тестовым HTML-сервлетом captcha? Попытайтесь мыслить логически. – BalusC

+0

Кстати, это довольно плохой алч. Весь captcha является статическим ожиданием цифр. Очень легко написать небольшую программу OCR, чтобы найти цифры и интегрировать в бота. – BalusC

+0

@BalusC Я получил его, но как я могу запустить этот сервлет первым, который генерирует изображение. – mcacorner

ответ

1

Помещенные случайную логику генерации числа в capta_test сервлета и поместить эту цифру в сессии. Поскольку вы обрабатываете HTML, после загрузки страницы будет вызван сервлет capta, и это не приведет к аннулированию сеанса.

Генератор случайных чисел

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(); 
} 
} 

генератор изображения сервлет

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); 
} 

} 
1

Ваш поток программы неправильно, значение сеанса является недействительным, так как capta_test servlet is called even before the capta servlet.

Посмотрите на этот простой учебник. Надеюсь, что это поможет вам двигаться в правильном пути

Captcha in JSP and Servlet