`
zeroliu
  • 浏览: 196506 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

在Web中动态生成验证码:Servlet和Rest模式

阅读更多
【虎.无名】登录处理常用到一个生成随机校验码图片的处理。下面是一套简单的servlet实现,但是似乎还不支持中文字符串。于是对齐做了一些改进。
参考原型:http://blog.csdn.net/zhanngle/archive/2007/12/03/1913402.aspx 在Web中动态生成验证码
相关资源:http://zeroliu.iteye.com/admin/blogs/240006【虎.无名】自定义Java的REST行为分发器
http://zeroliu.iteye.com/admin/blogs/246182在Web中动态生成验证码:Servlet和Rest模式
http://hi.baidu.com/zeorliu/blog/item/281caf5141ce241e367abe82.html用Servlet动态生成随机验证码(摘) zt
改进:
1,图形中的文字不支持中文,需要修改Font设置:
//Font f = new Font("Times New Roman",Font.PLAIN,18);//不支持中文
//g.setFont(new Font("Times New Roman",Font.PLAIN,18)));//不支持中文
g.setFont(new Font("MyFont", Font.ITALIC, fontSize*3/2));
2,定义多种输出方法,增加参数定义图片和字体的大小;
public static void nextJpg(OutputStream os,String code, int width, int height, int fontSize) throws IOException;
public static String nextJpg(String jpg_name, String code,int width,int height, int fontSize) throws IOException;
public static void nextJpg(HttpServletResponse response, String code, int width, int height, int fontSize) throws IOException;
3,允许多种输出(tableId=10,36,62)
private static char[] charstable10;//存放[0-9]10个字符,在随机生成key时使用
private static char[] charstable36;//存放[0-9,a-z] 36个字符,在随机生成key时使用
private static char[] charstable62;//存放[0-9,a-z,A-Z] 62个字符,在随机生成key时使用
4,改为Rest模式,使用自定义的REST实现,(tableId=10,36,62,codeLen为输出随即码长度)
/rest/jpg/{tableId}/{codeLen} = com.infothunder.restpay.ResourceJpg
5,(TODO)输出多种图片格式,不限于jpg图片,资源定义如下:
#/rest/jpg/{cTab}/{cLen}/{m} = com.infothunder.restpay.ResourceJpg
/rest/jpg/{cTab}/{cLen}/{m} = com.infothunder.restpay.ResourceJpgSms
6,使用方式:
/rest/jpg/10/8/m.jpg 只有[0..9]数字,输出jpg格式
/rest/jpg/62/4/m.png 含数字和大小写[0-9,a-z,A-Z],输出png格式
/rest/jpg/36/6/mobileNo.sms 定义ResourceJpgSms扩展,可以通过短信发送检验码,而不是图片检验码,mobileNo为手机号

参考Servlet定义:
public class RandomServlet extends HttpServlet{
	private static final long serialVersionUID = 4281511561201577496L;
	public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		String randCode = RandomUtils.nextStr36(4);//nextStr62 nextStr10
		RandomUtils.nextJpg(response, randCode, 75, 20, 18);
		request.getSession().setAttribute("RANDOM_CODE", randCode);			
		System.out.println("# RandomServlet.doGet().nextJpg() = "+randCode);
	}
	public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { 
		doGet(request,response); 
	} 
}

参考Rest资源定义
public class ResourceJpg extends ResourceBase {
	private final static Logger _log = LoggerFactory.getLogger(ResourceJpg.class);
	protected final static int fontSize = 20;
	@Override public String getIdName() {
		//return "codeLen";//(如果未定义,则会调用doList而不是doShow)
		return "m";//(如果未定义,则会调用doList而不是doShow)
	}
	@Override public void doShow(HttpServletRequest req, HttpServletResponse res, Map uriAttr, String id) throws IOException, ServletException{
		String uri = Util.getMapValue(uriAttr, "URI", "");
		int cTab = Util.getMapValue(uriAttr, "cTab", 62);//==(62|36|10)
		int cLen = Util.getMapValue(uriAttr, "cLen", 4);//支持后缀 rest/jpg/10/4/m.jpg
		//int cLen = Integer.parseInt(id);//去掉了.xml后缀
		if (cLen<4)	cLen = 4;
		String randCode = null; 
		if (cTab==10) {			
			randCode = RandomUtils.nextStr10(cLen);
		}else if (cTab==36) {
			randCode = RandomUtils.nextStr36(cLen);
		}else {
			randCode = RandomUtils.nextStr62(cLen);
		}
		String ext = this.getUriAttribute("EXT", null);
		if (".jpg".equalsIgnoreCase(ext) || ".jpeg".equalsIgnoreCase(ext)) {
			RandomUtils.nextImage(res, randCode, cLen*(fontSize-2), fontSize, fontSize-2, "jpeg");
		}else if (".png".equalsIgnoreCase(ext)) {
			RandomUtils.nextImage(res, randCode, cLen*(fontSize-2), fontSize, fontSize-2, "png");
		}else if (".bmp".equalsIgnoreCase(ext)) {
			RandomUtils.nextImage(res, randCode, cLen*(fontSize-2), fontSize, fontSize-2, "bmp");
		}else {//和jpg等效 >> 为了方便扩展,调用子方法;
			this.doShowExt(req, res, uriAttr, id, ext, randCode);
		}
		req.getSession().setAttribute("RANDOM_CODE", randCode);
		_log.debug("# doShow({}).nextImage() = "+randCode, uri, ext);
	}
	@Override public void doList(HttpServletRequest req, HttpServletResponse res, Map uriAttr) throws IOException, ServletException{
		_log.debug("# doList()...{}", uriAttr);
	}
	protected void doShowExt(HttpServletRequest req, HttpServletResponse res, Map uriAttr, String id, String ext, String randCode) throws IOException, ServletException{
		int codeLen = randCode.length();
		RandomUtils.nextJpg(res, randCode, codeLen*(fontSize-2), fontSize, fontSize-2);
		//_log.debug("# doShowExt()...{}", randCode);
	}
}
分享到:
评论

相关推荐

    java web实现手机短信验证码登录实例源码.rar

    Java Web是一种基于Java技术构建Web应用程序的框架,它结合了Servlet、JSP(JavaServer Pages)和JavaBean等技术,提供了强大的服务器端编程能力。在这个"java web实现手机短信验证码登录实例源码"中,我们可以深入...

    21天学习javaweb

    在“21天学习javaweb”的教程中,我们将会深入探索Java Web开发的核心概念和技术。这个课程可能是为初学者设计的,旨在帮助他们在21天内建立起对Java Web开发的全面理解。Java Web开发是利用Java语言进行服务器端...

    java技术的web环境下的网络商店销售系统

    Java技术在Web环境中的应用广泛,尤其在网络商店销售系统中,它的优势在于跨平台性、安全性以及强大的企业级开发支持。本项目是一个基于Java技术的Web环境下的网络商店销售系统,旨在提供一个全面、安全且易于维护的...

    SSO CAS Server 二次开发说明文档

    1. **添加Kaptcha依赖库**:Kaptcha是一个用于生成验证码图像的开源工具。需要将其依赖添加到POM文件中,例如: ```xml &lt;groupId&gt;com.github.penggle&lt;/groupId&gt; &lt;artifactId&gt;kaptcha &lt;version&gt;2.3.2 ``` 2...

    Ajax+Java开发实例源文件

    5. **Servlet与JSP**:在Java Web应用中,Servlet通常用来接收和处理Ajax请求,而JSP可以用于动态生成响应内容,两者结合可以实现前后端分离。 6. **RESTful API设计**:为了使Ajax请求更有效,通常会设计遵循REST...

    java+mysql实现网上商城项目源码,包含前台+后台

    5. **JSP和Servlet**:前端展示可能使用了JavaServer Pages(JSP)和Servlet技术,它们是Java Web应用中的标准视图层技术。 6. **RESTful API设计**:为了实现前后端分离,项目可能遵循了REST(Representational ...

    java开源包11

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    网上商城,网上商城怎么注册,Java

    在Java后端开发中,网上商城系统通常涉及到用户管理、商品展示、购物车、订单处理等一系列功能。 【描述】:“使用Java语言开发出来的网上商城项目的后端API接口程序”说明了这个项目重点在于后端服务的实现,通过...

    java开源包1

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    java开源包2

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    java开源包3

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    java开源包6

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    java开源包5

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    java开源包10

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    java开源包4

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    java开源包8

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    java开源包7

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    java开源包9

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    java开源包101

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

    Java资源包01

    Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (&lt;jcaptcha:image label="Type the text "/&gt; ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...

Global site tag (gtag.js) - Google Analytics