webwork登録検証コードの実現


無駄話は言わないで、直接コードをかけます.ネットで見つけたのです.自分で整理しました.へへ
jsp:
<input type="text" name="random" size="5" value=""/><img src="rand.action" onclick="changeValidateCode(this)" title="         "/>
 
js:
<script type="text/javascript">   
	    function changeValidateCode(obj) {   
	           //           ,        
	        var timenow = new Date().getTime();   
	           //             ,                
	        //             ,            ,          。   
	        obj.src="rand.action?d="+timenow;   
	    }   
	</script>
 
ここではエピソードを言いますが、私のシステムはスクリーンセーバーInterceptorを使っていますので、ランド・actionを呼び出した時にずっとブロックされていました.結果、このacitonに対するブロックが配置ファイルから削除されました.
 
javaコード:
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.imageio.stream.ImageOutputStream;

import com.opensymphony.xwork.ActionContext;
import com.opensymphony.xwork.ActionSupport;

  
public class RandomPictureAction extends ActionSupport {   
  
    private static final long serialVersionUID = -6950908478971552308L;      
    private ByteArrayInputStream inputStream;    
    String str;
         
    public String execute() throws Exception {   
           
      //               
       int width = 65, height = 20;      
     
       BufferedImage image = new BufferedImage(width, height,BufferedImage.TYPE_INT_RGB);      
     
       //              
       Graphics g = image.getGraphics();      
     
        //            
       Random random = new Random();      
    
        //            
       g.setColor(getRandColor(200, 250));      
       g.fillRect(0, 0, width, height);      
     
       //           
       g.setFont(new Font("Times New Roman", Font.PLAIN, 18));      
         
       //     155    ,                        
       g.setColor(getRandColor(160, 200));      
       for (int i = 0; i < 155; i++) {   
           int x = random.nextInt(width);      
           int y = random.nextInt(height);      
           int xl = random.nextInt(12);      
           int yl = random.nextInt(12);      
           g.drawLine(x, y, x + xl, y + yl);      
       }      
         
        //          (6   )      
        String sRand = "";      
        for (int i = 0; i < 4; i++) {      
           String rand = String.valueOf(random.nextInt(10));      
           sRand += rand;      
           //                 
           g.setColor(new Color(20 + random.nextInt(110), 20 + random      
                    .nextInt(110), 20 + random.nextInt(110)));      
            //            ,          ,              
            g.drawString(rand, 13 * i + 6, 16);      
        }      
         
        //       SESSION      
        ActionContext.getContext().getSession().put("rand", sRand);   
        //this.getRequest().setAttribute("rand", sRand);   
        this.str = sRand;   
        System.out.println("rand="+sRand);   
        //           
        g.dispose();      
        ByteArrayOutputStream output = new ByteArrayOutputStream();      
        ImageOutputStream imageOut = ImageIO.createImageOutputStream(output);      
        ImageIO.write(image, "JPEG", imageOut);      
        imageOut.close();      
        ByteArrayInputStream input = new ByteArrayInputStream(output   .toByteArray());      
        this.setInputStream(input);      
        return SUCCESS;   
     }      
         
    /*    
     *               
     */     
    private Color getRandColor(int fc, int bc) {      
        Random random = new Random();      
        if (fc > 255)      
            fc = 255;      
        if (bc > 255)      
            bc = 255;      
        int r = fc + random.nextInt(bc - fc);      
        int g = fc + random.nextInt(bc - fc);      
        int b = fc + random.nextInt(bc - fc);      
        return new Color(r, g, b);      
    }      
           
    public void setInputStream(ByteArrayInputStream inputStream) {      
        this.inputStream = inputStream;      
    }      
     
    public ByteArrayInputStream getInputStream() {      
        return inputStream;      
    }

	/**
	 * @return the str
	 */
	public String getStr()
	{
		return str;
	}

	/**
	 * @param str the str to set
	 */
	public void setStr(String str)
	{
		this.str = str;
	}   
}  
 
 
対応するxworkプロファイル:
 	<!--    ——   -->
    <action name="rand" class="com.payeasy.merchantmanage.action.RandomPictureAction">    
        <result name="success" type="stream">  
        <param name="contentType">image/jpeg</param>     
        <param name="inputName">inputStream</param>  
        </result>  
        <interceptor-ref name="loginStack"/>  
    </action> 
 
最後に提出した登録検証処理クラスに検証コードのチェックを書き込みます.
			//	  session          	
			String arandom=(String)(ActionContext.getContext().getSession().get("rand"));
			if(arandom.equals(this.getRandom()))
			{
				vPass = "Y";
			}