Home Struts Struts2 Captcha Java Captcha in Struts 2 Application
Questions:Ask|Latest


 
 

Share on Google+Share on Google+

Java Captcha in Struts 2 Application

Advertisement
This Java Captcha Example demonstrates you how to develop a captcha Servlet and use in your Struts 2 application.

Java Captcha in Struts 2 Application

     

This Java Captcha Example demonstrates you how to develop a captcha Servlet and use in your Struts 2 application.

Developing Struts 2 Captcha Application
In this section we are going to develop Captcha Servlet and then use the same to validate Struts 2 based web applications. We have developed a Servlet that generates Captcha image. 

Let's see how our Captcha application works. 

Working of the application

  1. captcha.jsp:  This page contains the captcha image and one text field. 
  2. User reads the image text and then enters in the "Code" text field. After entering the value in the text field, user clicks on the "Verify"  command button.
  3. Then our Struts 2 action validates the user input and the session Captcha value.  If user enters the correct image code in the text filed, then action  forward to the "success.jsp" page. Otherwise, it gives an error and go to again the "captcha.jsp".

1. Index page
In the  index.html we have added a link to captcha.jsp. User can click on this link to go to the captcha form.

<html>
<head>
<title>Capcha Validation</title>
<style>
a:link{ color:red; text-decoration:underline; }
a:visited{ color:red; text-decoration:underline; }
a:hover{ color:green; text-decoration:none; }
a:active{ color:red; text-decoration:underline; }
</style>
</head>
<body>
<table>
<tr><td><a href="captcha.jsp">Captcha Application</a></td></tr>
</table>
</body>
</html>

2. Captcha Page
The GUI of the application consists of  Captcha page  (captcha.jsp). 
The captcha.jsp is used to display the valid code and a text box. 

<%@ taglib prefix="s" uri="/struts-tags" %>
<html>
<head>
<title>Capcha Validation</title>
<style>
.errorMessage {
color: red;
font-size: 0.8em;


.label {
color:#000000;
}
</style>
</head>
<body>
<table>
<tr>
<td>
<h1>Captcha Validation</h1>
<s:form action="doCaptcha" method="POST">
<s:actionerror /> 
<img src="Captcha.jpg" border="0">
<s:textfield label="Code" name="j_captcha_response" size="20" maxlength="10"/>
<s:submit value="Verify" align="center" />
</s:form>
</td>
</tr>
</table>
</body>
</html>

The code :
<s:actionerror />
displays action errors and field validation errors.

The code <s:form action="doLogin" method="POST"> generates the html form for the application.

The code :

<img src="Captcha.jpg" border="0">
<s:textfield label="Code" name="j_captcha_response" size="20" maxlength="10"/>

The submit button is generated through <s:submit value="Verify" align="center" /> code.

3. Servlet Class
Develop a Servlet class "RoseIndiaCaptcha.java" to create a Captcha image. Here is the code of RoseIndiaCaptcha.java Servlet class:

package com.roseindiaCaptcha.servlet;

import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.servlet.http.*;
import javax.servlet.*;
import java.io.*;
import java.awt.*;
import java.util.*;
import java.awt.font.TextAttribute;
 
public class RoseIndiaCaptcha extends HttpServlet {

  private int height=0;
  private int width=0;
    
  public static final String CAPTCHA_KEY = "captcha_key_name";

  public void init(ServletConfig config) throws ServletException {
    super.init(config);
   height=Integer.parseInt(getServletConfig().getInitParameter("height"));
     width=Integer.parseInt(getServletConfig().getInitParameter("width"));
  }

 
 protected void doGet(HttpServletRequest req, HttpServletResponse response) 
   throws IOException, ServletException {
    //Expire response
    response.setHeader("Cache-Control", "no-cache");
    response.setDateHeader("Expires", 0);
    response.setHeader("Pragma", "no-cache");
    response.setDateHeader("Max-Age", 0);
    
    BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); 
    Graphics2D graphics2D = image.createGraphics();
    Hashtable map = new Hashtable();
    Random r = new Random();
    String token = Long.toString(Math.abs(r.nextLong()), 36);
    String ch = token.substring(0,6);
    Color c = new Color(0.6662f, 0.4569f, 0.3232f);
    GradientPaint gp = new GradientPaint(30, 30, c, 15, 25, Color.white, true);
    graphics2D.setPaint(gp);
    Font font=new Font("Verdana", Font.CENTER_BASELINE , 26);
    graphics2D.setFont(font);
    graphics2D.drawString(ch,2,20);
    graphics2D.dispose();
    
    HttpSession session = req.getSession(true);
    session.setAttribute(CAPTCHA_KEY,ch);

    OutputStream outputStream = response.getOutputStream();
    ImageIO.write(image, "jpeg", outputStream);
    outputStream.close();



 }

}

4.Mapping  for Servlet class in web.xml

<servlet>
<servlet-name>Captcha</servlet-name>
   <display-name>Captcha</display-name>
  <servlet-class>com.roseindiaCaptcha.servlet.RoseIndiaCaptcha</servlet-class>
<init-param> 
<description>passing height</description> 
<param-name>height</param-name> 
<param-value>30</param-value> 
</init-param> 
<init-param> 
<description>passing height</description> 
<param-name>width</param-name> 
<param-value>120</param-value> 
</init-param> 
</servlet>

<servlet-mapping>
  <servlet-name>Captcha</servlet-name>
   <url-pattern>/Captcha.jpg</url-pattern>
</servlet-mapping>

5.Success page

After successful validation page  transfer to the "success.page"

<html>
<head>
<title>Capcha Validation</title>
</head>
<body>
<table><tr><td><h1>You are Succesfully Validate</h1></td></tr></table>
</body>
</html>

6.Developing Action Class
Now let's develop the action class to handle the Captcha validation request. 

The code  String c= (String)session.getAttribute(RoseIndiaCaptcha.CAPTCHA_KEY) is used to get the Captcha value stored in session and then validate it with the user input. Here is the code of the Action class.

package com.roseindiaCaptcha.action;
import com.opensymphony.xwork2.ActionSupport;
import java.util.Date;
import javax.servlet.http.*;
import javax.servlet.*;
import com.opensymphony.xwork2.ActionContext;
import com.roseindiaCaptcha.servlet.*;

public  class CaptchaAction  extends ActionSupport {
  public String execute() throws Exception {
      HttpServletRequest request  = (HttpServletRequest)
 ActionContext.getContext().get(org.apache.struts2.StrutsStatics.HTTP_REQUEST);
      Boolean isResponseCorrect = Boolean.FALSE;
      javax.servlet.http.HttpSession session = request.getSession();
      String parm = request.getParameter("j_captcha_response");
      String c= (String)session.getAttribute(RoseIndiaCaptcha.CAPTCHA_KEY) ;
      if(!parm.equals(c) ){
      addActionError("Invalid Code! Please try again!");
      return ERROR;
    }else{
    return SUCCESS;
    }
  }
}

   

7.Configuring action mapping (in struts.xml)
Now we will create action mapping in the struts.xml file. Here is the code to be added in the struts.xml:
<action name="doCaptcha" class="com.roseindiaCaptcha.action.CaptchaAction">
<result name="error">captcha.jsp</result>
<result>success.jsp</result>
</action>

In the above mapping the action "doCaptcha" is used to validates the user using action class (CaptchaAction.java).

Output : 


If invalid code the error message is display.

 


After successfully validation message :

   
Download the application

     
 

Advertisement

Liked it!  Share this Tutorial


Follow us on Twitter, or add us on Facebook or Google Plus to keep you updated with the recent trends of Java and other open source platforms.

Posted on: May 24, 2009

Ask Questions?    Discuss: Java Captcha in Struts 2 Application   View All Comments

Post your Comment


Your Name (*) :
Your Email :
Subject (*):
Your Comment (*):
  Reload Image
 
 
Comments
ray
June 10, 2011
Excellent Example! Thanks

This is what I call an excellent example. Thank you very much. Ray
anirudha
February 28, 2012
thanz

thanx dear......
Karthick
July 9, 2012
How can I refresh the captcha Image

Please give me some idea to refresh the captcha image without refreshing the whole page.
srinivasa.v
October 7, 2013
About struts2 captcha image

sir am using u r above captcha code but image is not dispalying why? plese help me....
shanks
December 8, 2013
Captcha implementation

Am getting error on click of verify button: plz suggest on the same. java.lang.reflect.InvocationTargetException sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) com.opensymphony.xwork2.DefaultActionInvocation.invokeAction(DefaultActionInvocation.java:441) com.opensymphony.xwork2.DefaultActionInvocation.invokeActionOnly(DefaultActionInvocation.java:280) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:243) com.opensymphony.xwork2.interceptor.DefaultWorkflowInterceptor.doIntercept(DefaultWorkflowInterceptor.java:165) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.validator.ValidationInterceptor.doIntercept(ValidationInterceptor.java:252) org.apache.struts2.interceptor.validation.AnnotationValidationInterceptor.doIntercept(AnnotationValidationInterceptor.java:68) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.ConversionErrorInterceptor.intercept(ConversionErrorInterceptor.java:122) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.ParametersInterceptor.doIntercept(ParametersInterceptor.java:195) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.StaticParametersInterceptor.intercept(StaticParametersInterceptor.java:179) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) org.apache.struts2.interceptor.MultiselectInterceptor.intercept(MultiselectInterceptor.java:75) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) org.apache.struts2.interceptor.CheckboxInterceptor.intercept(CheckboxInterceptor.java:94) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) org.apache.struts2.interceptor.FileUploadInterceptor.intercept(FileUploadInterceptor.java:235) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.ModelDrivenInterceptor.intercept(ModelDrivenInterceptor.java:89) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.ScopedModelDrivenInterceptor.intercept(ScopedModelDrivenInterceptor.java:130) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) org.apache.struts2.interceptor.debugging.DebuggingInterceptor.intercept(DebuggingInterceptor.java:267) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.ChainingInterceptor.intercept(ChainingInterceptor.java:126) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.PrepareInterceptor.doIntercept(PrepareInterceptor.java:138) com.opensymphony.xwork2.interceptor.MethodFilterInterceptor.intercept(MethodFilterInterceptor.java:87) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.I18nInterceptor.intercept(I18nInterceptor.java:165) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) org.apache.struts2.interceptor.ServletConfigInterceptor.intercept(ServletConfigInterceptor.java:164) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.AliasInterceptor.intercept(AliasInterceptor.java:179) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) com.opensymphony.xwork2.interceptor.ExceptionMappingInterceptor.intercept(ExceptionMappingInterceptor.java:176) com.opensymphony.xwork2.DefaultActionInvocation.invoke(DefaultActionInvocation.java:237) org.apache.struts2.impl.StrutsActionProxy.execute(StrutsActionProxy.java:52) org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:488) org.apache.struts2.dispatcher.FilterDispatcher.doFilter(FilterDispatcher.java:395) sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39) sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25) java.lang.reflect.Method.invoke(Method.java:597) org.apache.catalina.security.SecurityUtil$1.run(SecurityUtil.java:244) java.security.AccessController.doPrivileged(Native Method) javax.security.auth.Subject.doAsPrivileged(Subject.java:517) org.apache.catalina.security.SecurityUtil.execute(SecurityUtil.java:276) org.apache.catalina.security.SecurityUtil.doAsPrivilege(SecurityUtil.java:218)
DMCA.com