本文转载自:http://www.javake.com.cn/frontend/js/20130922/6783.html,作者:eric
login.js:
//定义验证码控件 Ext.define('CheckCode',{ extend: 'Ext.form.field.Text', alias: 'widget.checkcode', inputTyle:'codefield', codeUrl:Ext.BLANK_IMAGE_URL, isLoader:true, onRender:function(ct,position){ this.callParent(arguments); this.codeEl = ct.createChild({ tag: 'img', src: Ext.BLANK_IMAGE_URL}); this.codeEl.addCls('x-form-code'); this.codeEl.on('click', this.loadCodeImg, this); if (this.isLoader) this.loadCodeImg(); }, alignErrorIcon: function() { this.errorIcon.alignTo(this.codeEl, 'tl-tr', [2, 0]); }, //如果浏览器发现url不变,就认为图片没有改变,就会使用缓存中的图片,而不是重新向服务器请求,所以需要加一个参数,改变url loadCodeImg: function() { this.codeEl.set({ src: this.codeUrl + '?id=' + Math.random() }); } }); Ext.onReady( function(){ var checkcode = Ext.create('CheckCode',{ cls : 'key', fieldLabel : '验证码', name : 'CheckCode', id : 'CheckCode', allowBlank : false, isLoader:true, blankText : '验证码不能为空', codeUrl: 'getCode', width : 150 }); var form = Ext.create( 'Ext.form.Panel', { frame:true, title:'用户登录', width:300, height:170, //渲染到页面中的loginForm层中 renderTo:'loginForm', //是否可以拖动 draggable:true, //使buttons中的button居中显示 buttonAlign:'center', fieldDefaults:{ //居左 labelAlign:'center', //宽度 labelWidth:50, //anchor: '90%', //错误提示显示在一边(side),还可以配置为under、title、none msgTarget: 'side' }, items:[ { xtype:'textfield', fieldLabel:'用户名', name:'name', //不允许为空 allowBlank:false, blankText:'用户名不能为空' }, { xtype:'textfield', fieldLabel:'密 码', name:'password', inputType:'password', allowBlank:false, blankText:'密码不能为空' }, checkcode ], buttons:[ { text:'登录', width:80, height:30, handler:function(){ //获取当前的表单form var form = this.up('form').getForm(); //判断否通过了表单验证,如果不能空的为空则不能提交 if(form.isValid()){ //alert("可以提交"); form.submit( { clientValidation:true, waitMsg:'请稍候', waitTitle:'正在验证登录', url:'user_login', success:function(form,action){ //登录成功后的操作,这里只是提示一下 Ext.MessageBox.show({ width:150, title:"登录成功", buttons: Ext.MessageBox.OK, msg:action.result.msg }) }, failure:function(form,action){ Ext.MessageBox.show({ width:150, title:"登录失败", buttons: Ext.MessageBox.OK, msg:action.result.msg }) } } ) } } }, { text:'取消', width:80, height:30, handler:function(){ //点击取消,关闭登录窗口 var form = this.up('form'); form.close(); } } ] } ) } ) 为了布局验证码位置,需要定义一个style.css [css] view plaincopy #CheckCode{ float:left;} .x-form-code{width:75px;height:25px;vertical-align:middle;cursor:pointer; float:left; margin-left:7px;} 生成验证码的类:YanZhengMa.java:(英语学的不好,用拼音了。。。。) [java] view plaincopy package action; import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.image.BufferedImage; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.IOException; import java.util.Random; import com.sun.image.codec.jpeg.ImageFormatException; import com.sun.image.codec.jpeg.JPEGCodec; import com.sun.image.codec.jpeg.JPEGImageEncoder; public class YanZhengMa { static String strCode = null; public static final char[] CHARS = {'2','3','4','5','6','7','8','9','A','B','C','D','E','F','G','H','J','K','L','M','N','P','Q','R','S','T','U','V','W','X','Y','Z'}; public static Random random = new Random(); //获取六位随机数 public static String getRandomString() { StringBuffer buffer = new StringBuffer(); for (int i = 0;i<4;i++) { buffer.append(CHARS[random.nextInt(CHARS.length)]); } strCode = buffer.toString(); System.out.println("4位随机数:"+strCode); return strCode; } //获取随机颜色 public static Color getRandomColor() { return new Color(random.nextInt(255),random.nextInt(255),random.nextInt(255)); } //返回某颜色的反色 public static Color getReverseColor(Color c) { return new Color(255 - c.getRed(), 255 - c.getGreen(), 255 - c.getBlue()); } //创建图片 public ByteArrayInputStream createImage() { String randomString = getRandomString();//获取随机字符串 int width = 80;//设置图片的宽度 int height = 30;//高度 Color color = getRandomColor();//获取随机颜色,作为背景色 Color reverse = getReverseColor(color);//获取反色,用于前景色 //创建一个彩色图片 BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB); Graphics2D g = image.createGraphics();//获取绘制对象 g.setFont(new Font(Font.SANS_SERIF, Font.BOLD, 23));//设置字体 g.setColor(color);//设置颜色 g.fillRect(0, 0, width, height);//绘制背景 g.setColor(reverse);//设置颜色 g.drawString(randomString, 5, 23); //最多绘制100个噪音点 for (int i = 0,n = random.nextInt(100); i < n; i++) { g.drawRect(random.nextInt(width), random.nextInt(height), 1, 1); } //返回验证码图片的流格式 ByteArrayInputStream bais = convertImageToStream(image); return bais; } //将BufferedImage转换成ByteArrayInputStream private static ByteArrayInputStream convertImageToStream(BufferedImage image){ ByteArrayInputStream inputStream = null; ByteArrayOutputStream bos = new ByteArrayOutputStream(); JPEGImageEncoder jpeg = JPEGCodec.createJPEGEncoder(bos); try { jpeg.encode(image); byte[] bts = bos.toByteArray(); inputStream = new ByteArrayInputStream(bts); } catch (ImageFormatException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } return inputStream; } } 然后定义验证码请求的Action:YanZhengMaAction.java: [java] view plaincopy package action; import java.io.ByteArrayInputStream; import java.util.Map; import org.apache.struts2.interceptor.SessionAware; import com.opensymphony.xwork2.ActionSupport; public class YanZhengMaAction extends ActionSupport implements SessionAware { private ByteArrayInputStream bais; YanZhengMa yanZhengMa = null; String strCode = null; private Map session; public String getCode(){ yanZhengMa = new YanZhengMa(); bais = yanZhengMa.createImage(); strCode = yanZhengMa.strCode; System.out.println("YanZhengMaAction>randomCode:"+strCode); //放入session,在login的时候需要用到验证 session.put("randomCode", strCode); return SUCCESS; } public ByteArrayInputStream getBais() { return bais; } public void setBais(ByteArrayInputStream bais) { this.bais = bais; } public void setSession(Map<String, Object> arg0) { this.session = arg0; } }
登录验证类:UserAction.java:
package action; import java.io.ByteArrayInputStream; import java.util.Map; import org.apache.struts2.interceptor.SessionAware; import com.opensymphony.xwork2.ActionSupport; public class UserAction extends ActionSupport implements SessionAware { //接收name,必须与js中的textfield的name相同,否则取不到值 private String name; private String password; //得到页面传来的验证码 private String CheckCode; private Map session; //定义一个msg变量,可用于存放错误信息,然后传到前台 //用于告诉前台时候登录成功 private boolean success; public String login(){ //得到生成的验证码 String strCode = (String) session.get("randomCode"); System.out.println("UserAction>randomCode:"+strCode); if("admin".equals(name) && "admin".equals(password) && CheckCode.toLowerCase().equals(strCode.toLowerCase())){ success = true; }else{ success = false; } return SUCCESS; }
效果图:
相关推荐
Extjs4文件上传,后台struts2
ExtJS4.0MVC学习,适合初学者。
Extjs4 MVC 官方实例整合 未改动 未删减 部署即可运行 下载部署到tomcat服务器即可运行,官方实例未删减
Extjs4+MVC+struts2后台管理系统,
一个extjs4应用例子,extjs4 mvc+struts实现grid简单功能,附带jar包.
Extjs4 MVC小实例根据The MVC Application Architecture做的
Extjs4 MVC开发笔记源码,此源码已经将命名空间修改为Soyi,由于涉及到一些公司信息,将所有数据库中的数据清除,由于时间仓促。只有备案管理的grid是可以使用的,其他的功能,按照备案管理的文件照猫画虎即可实现。 ...
extjs4 MVC2 TreePanel动态JSON实现 extjs4 MVC2 TreePanel动态JSON实现
extjs4mvc 事例讲解的非常好关于extjs4mvc的分层结构
ExtJS4 MVC演示项目
基于springmvc与extjs4mvc所实现的权限管理
ExtJs 4 用了一段时间了,今天研究了下ExtJs4的MVC机制,感觉还挺好,建议大家尝试,所以就写了一个demo,帮助那些对ExtJs还不是很懂,或者想用ExtJs4却又不知道怎么做好的朋友。。。多余话不说了大家如果有什么不...
eclipse下EXTJS4+STRUTS2+JAVA增删改查的完整例子
只要将解压的文件直接放置到myeclipse的webroot下面,启动tomcat访问。简单的EXTJS mvc框架,设计 store,model,controller,view,window等等,同时展示了一些基本的点击显示、修改等等操作,需要的同学自行下载
最新版本,ExtJS6 MVC 精简示例!!!,一个可以参考的小例子!
extjs4 前端mvc模式 货物处理的crud
本例采用ASP.NET MVC3 +EXTJS4 MVC 框架,完美实现了EXTJS4动态加载JS文件,对ASP.NET MVC3及EXTJS4 MVC 各应用要点进行了应用。对于想采用ASP.NET MVC3 +EXTJS4 MVC 框架的学习者有很好的帮助,快速掌握MVC框架,本...
Extjs4登录功能+验证码+struts2
是用extjs mvc写的,controller里面会配置model store view,然后mode和store的关系,相信大家也很清楚了,store里面会用到model,当然也可以不用,和原来的extjs3.x是一样的,用field来表示,其实是换汤不换药而已...