Thanks Mr. Carlo , I very much surprised after seeing that i getting too much help from all around. I am very glad after getting the such a good response. now I have became the fan of this google groups.
Thanks for your support and kindness, ones again i want to say very very thank you and all the groups members. your friend Ankit On Apr 15, 1:55 am, Carlo <carlo.michelu...@gmail.com> wrote: > Hi Ankit, > > Maybe, I can help you. > > I write below the code than I use to do Captcha check. > > In the form panel: > > ######### > FormPanel form = new FormPanel(); > .... > VerticalPanel vp = new VerticalPanel(); > > HorizontalPanel hp = new HorizontalPanel(); > hp.setSpacing(10); > > codeCheck = new TextField<String>(); > codeCheck.setFieldLabel("Controllo"); > codeCheck.setAllowBlank(false); > > verifyImage = new Image("verify.png"); > hp.add(verifyImage); > hp.setCellHorizontalAlignment(verifyImage, > HasAlignment.ALIGN_RIGHT); > hp.setCellWidth(verifyImage, "170px"); > > final Button clickImage = new Button("New image"); > clickImage.addSelectionListener(new > SelectionListener<ButtonEvent>() > { > @Override > public void componentSelected(ButtonEvent ce) { > codeCheck.setValue(""); > int rand = Random.nextInt(); > String url = "verify.png?rand=" + rand; > verifyImage.setUrl(url); > } > }); > hp.add(clickImage); > > vp.add(hp); > > HTML info = new HTML("Write in the check field the sequence of > characters in the image."); > info.setStyleName("x-label"); > vp.add(info); > > panel.add(vp); > > panel.add(codeCheck); > > errorCaptcha = new HTML(""); > errorCaptcha.setStyleName("x-label"); > errorCaptcha.addStyleName("x-label-red"); > vp.add(errorCaptcha); > > Button btn = new Button("Check"); > btn.addSelectionListener(new SelectionListener<ButtonEvent>() > { > @Override > public void componentSelected(ButtonEvent ce) { > if (!panel.isValid() || > codeCheck.getValue()==null) { > return; > } > service.checkCode(codeCheck.getValue(), new > AsyncCallback<String>() { > public void onFailure(Throwable > caught) { > > MessageBox.alert("error",caught.getMessage(),null); > } > public void onSuccess(String result) { > if > (((String)result).equals("Sorry please enter correct code for > verification.")){ > > errorCaptcha.setHTML(result); > return; > } else { > > errorCaptcha.setHTML(""); > } > } > }); > // panel.submit(); // this is your form > submit > } > }); > panel.addButton(btn); > > ############## > Now, the GWT RPC servlet code (it's very simple): > ############## > > public String checkCode(String entercode) > { > session = getThreadLocalRequest().getSession(); > String code = > (String)session.getAttribute("verification.code"); > String attempt = entercode; > String msg = ""; > > if (code!=null && code.equals(attempt)){ > msg = "Correct verification code"; > } else { > msg = "Sorry please enter correct code for > verification."; > } > return msg; > } > > ############## > In the reality the url "verify.png" for the image is a servlet, and > you must define this into web.xml: > ############## > > <servlet> > <servlet-name>VerificationServlet</servlet-name> > > <servlet-class>com.yourpackage.server.VerificationServlet</servlet- > class> > </servlet> > > <servlet-mapping> > <servlet-name>VerificationServlet</servlet-name> > <url-pattern>/verify.png</url-pattern> > </servlet-mapping> > > ############## > Now the code about VerificationServlet: > ############## > package com.yourpackage.server; > > import java.io.*; > import javax.servlet.ServletContext; > import javax.servlet.*; > import javax.servlet.http.HttpServlet; > import javax.servlet.http.HttpServletRequest; > import javax.servlet.http.HttpServletResponse; > import javax.servlet.http.HttpSession; > > public class VerificationServlet extends HttpServlet > { > private static final long serialVersionUID = 1L; > HttpSession session; > > ServletContext context = null; > > public void init(ServletConfig config) throws ServletException > { > super.init(config); > context = config.getServletContext(); > } > > @Override > protected void doGet(HttpServletRequest request, > HttpServletResponse response) throws ServletException, IOException > { > session = request.getSession(true); > response.setHeader("Pragma", "public"); > response.setHeader("cache-control", "max-age=0,no-cache, no- > store,must-revalidate, proxy-revalidate, s-maxage=0"); > response.setDateHeader("Expires", 0); > response.setContentType("image/png"); > > ImageVerification verification = new > ImageVerification(response.getOutputStream()); > String code = verification.getVerificationValue(); > session.setAttribute("verification.code", code); > > response.flushBuffer(); > } > > } > > ############## > And the last is the code about ImageVerification: > ############## > package com.yourpackage.server; > > import java.awt.Color; > import java.awt.Font; > import java.awt.Graphics2D; > import java.awt.geom.AffineTransform; > import java.awt.image.BufferedImage; > import java.io.IOException; > import java.io.OutputStream; > import java.util.Random; > import java.util.UUID; > > import javax.imageio.ImageIO; > > /** > * ImageVerification is a simple utility class for > * creating an image verification PNG file that will > * allow you to make sure that only a human can read > * the alphanumeric values and enter them into a text > * field during verification. <P> > * > */ > public class ImageVerification > { > private String value; > > public ImageVerification (OutputStream out) throws IOException > { > this(50,120,out); > } > public ImageVerification (int height, int width, OutputStream out) > throws IOException > { > BufferedImage bimage = new BufferedImage(width, height, > BufferedImage.TYPE_INT_RGB); > Random rand=new Random(System.currentTimeMillis()); > Graphics2D g = bimage.createGraphics(); > > // create a random color > Color color = new Color(rand.nextInt(255), rand.nextInt(255), > rand.nextInt(255)); > > // the the background to the random color to fill the > // background and make it darker > g.setColor(color.darker()); > g.fillRect(0, 0, width, height); > > // set the font > g.setFont(new Font("arial",Font.BOLD,36)); > > // generate a random value > this.value = > UUID.randomUUID().toString().replace("-","").substring(0,5); > > int w = (g.getFontMetrics()).stringWidth(value); > int d = (g.getFontMetrics()).getDescent(); > int a = (g.getFontMetrics()).getMaxAscent(); > > int x = 0, y =0; > > // randomly set the color and draw some straight lines through > it > for (int i = 0; i < height; i += 5) > { > g.setColor(new Color(rand.nextInt(255), rand.nextInt(255), > rand.nextInt(255))); > g.drawLine(x, y + i, width, y+i); > } > > // reset x and y > x=0; > y=0; > > // randomly set the color of the lines and just draw think at > an angle > for (int i = 0; i < height; i += 5) > { > g.setColor(new Color(rand.nextInt(255), rand.nextInt(255), > rand.nextInt(255))); > g.drawLine(x, y + d - i, width + w, height + d - i); > } > > // randomly set the color and make it really bright for more > readability > g.setColor(new Color(rand.nextInt(255), rand.nextInt(255), > rand.nextInt(255)).brighter().brighter()); > > // we need to position the text in the center of the box > x = width/2 - w/2; > y = height/2 + a/2 - 2; > > // affine transform is used to rock the text a bit > AffineTransform fontAT = new AffineTransform(); > int xp = x-2; > // walk through each character and rotate it randomly > for (int c=0;c<value.length();c++) > { > // apply a random radian either left or right (left is > half since it's too far back) > int rotate = rand.nextInt(20); > fontAT.rotate(rand.nextBoolean() ? > Math.toRadians(rotate) : -Math.toRadians(rotate/2)); > Font fx = new Font("arial", Font.BOLD, > 36).deriveFont(fontAT); > g.setFont(fx); > String ch = String.valueOf(value.charAt(c)); > int ht = rand.nextInt(3); > // draw the string and move the y either up or down > slightly > g.drawString(ch, xp, y + (rand.nextBoolean()?-ht:ht)); > // move our pointer > xp+=g.getFontMetrics().stringWidth(ch) + 2; > } > > // write out the PNG file > ImageIO.write(bimage, "png", out); > //System.out.println("DONE WRITYING NEW IMAGHE"); > > // make sure your clean up the graphics object > g.dispose(); > } > /** > * return the value to check for when the user enters it in. Make > sure you > * store this off in the session or something like a database and > NOT in the > * form of the webpage since the whole point of this exercise is > to ensure that > * only humans and not machines are entering the data. > * > * @return > */ > public String getVerificationValue () > { > return this.value; > } > > } > > ################ > Ok, this is all. > > I hope this could help you. > > Hi > Carlo -- You received this message because you are subscribed to the Google Groups "Google Web Toolkit" group. To post to this group, send email to google-web-tool...@googlegroups.com. To unsubscribe from this group, send email to google-web-toolkit+unsubscr...@googlegroups.com. For more options, visit this group at http://groups.google.com/group/google-web-toolkit?hl=en.