【虎.无名】登录处理常用到一个生成随机校验码图片的处理。下面是一套简单的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是一种基于Java技术构建Web应用程序的框架,它结合了Servlet、JSP(JavaServer Pages)和JavaBean等技术,提供了强大的服务器端编程能力。在这个"java web实现手机短信验证码登录实例源码"中,我们可以深入...
在“21天学习javaweb”的教程中,我们将会深入探索Java Web开发的核心概念和技术。这个课程可能是为初学者设计的,旨在帮助他们在21天内建立起对Java Web开发的全面理解。Java Web开发是利用Java语言进行服务器端...
Java技术在Web环境中的应用广泛,尤其在网络商店销售系统中,它的优势在于跨平台性、安全性以及强大的企业级开发支持。本项目是一个基于Java技术的Web环境下的网络商店销售系统,旨在提供一个全面、安全且易于维护的...
1. **添加Kaptcha依赖库**:Kaptcha是一个用于生成验证码图像的开源工具。需要将其依赖添加到POM文件中,例如: ```xml <groupId>com.github.penggle</groupId> <artifactId>kaptcha <version>2.3.2 ``` 2...
5. **Servlet与JSP**:在Java Web应用中,Servlet通常用来接收和处理Ajax请求,而JSP可以用于动态生成响应内容,两者结合可以实现前后端分离。 6. **RESTful API设计**:为了使Ajax请求更有效,通常会设计遵循REST...
5. **JSP和Servlet**:前端展示可能使用了JavaServer Pages(JSP)和Servlet技术,它们是Java Web应用中的标准视图层技术。 6. **RESTful API设计**:为了实现前后端分离,项目可能遵循了REST(Representational ...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
在Java后端开发中,网上商城系统通常涉及到用户管理、商品展示、购物车、订单处理等一系列功能。 【描述】:“使用Java语言开发出来的网上商城项目的后端API接口程序”说明了这个项目重点在于后端服务的实现,通过...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...
Struts2的插件,用来增加验证码的支持,使用时只需要用一个 JSP 标签 (<jcaptcha:image label="Type the text "/> ) 即可,直接在 struts.xml 中进行配置,使用强大的 JCaptcha来生成验证码图片。 Java 命令行解析...