在webwork中使用自定义的Result生成动态验证图片这个动态图片的实现原理是在servlet的response中写入一个ImageOutputStream,并由servlet容器将其转成图片,在非webwork的实现中,可以直接操作response,但是在webwork中,要想直接操作response的output则必须使用不需要对response操作的result类型 不可以用普通的dispatcherResult在response的outputStream中写入东西,否则将覆盖所有的dispatcher的jsp页面 private HttpSession session;
/** * @see com.opensymphony.webwork.dispatcher.WebWorkResultSupport#doExecute(java.lang.String, * com.opensymphony.xwork.ActionInvocation) */ @Override protected void doExecute(String finalLocation, ActionInvocation invocation) throws Exception { HttpServletRequest request = (HttpServletRequest) invocation.getInvocationContext().get( ServletActionContext.HTTP_REQUEST); HttpServletResponse response = (HttpServletResponse) invocation.getInvocationContext().get( ServletActionContext.HTTP_RESPONSE); response.setHeader("Pragma", "No-cache"); response.setHeader("Cache-Control", "no-cache"); response.setDateHeader("Expires", 0); VerifyImage verify = new VerifyImage(); OutputStream os = response.getOutputStream(); String str = verify.GetImage(os); session = request.getSession(true); session.setAttribute("rand", str); } 在xwork.xml中配置result-type: <result-types> <result-type name="image" class="com.bnt.afp.action.verify.ImageResult"/> </result-types> 添加一个生成图片的action: <action name="imageAction" class="com.bnt.afp.action.verify.ImageAction"> <result name="success" type="image"/> </action> 在需要生成验证图片的地方这样调用: <img border=0 src="imageAction.action">
public String execute() throws IOException
{ return SUCCESS; }
//获取生成的图片,返回生成的验证码,并将ImageOutputStream写入 public String GetImage(OutputStream outputStream){ int width=60, 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)); 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); } 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); } g.dispose(); try { ImageIO.write(image, "JPEG", outputStream); outputStream.flush(); return sRand; } catch (IOException e) { e.printStackTrace(); return "fail"; } } public 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); } |
|