富瀏覽器程序設計實例 -頁面控制 - 登錄與驗證碼
登錄與驗證涉及8個文件,羅列如下:
login.jscheckCode.cssLoginAction.javaLoginService.javaLoginServiceImpl.javaLoginDao.javaLoginDaoImpl.javaUser.java
在登錄的模塊中首先應當驗證驗證碼的正確性,然后在查閱數據庫內容。如果僅僅是簡單的登錄驗證,實際上和Session并沒有關系,但是如果你要控制頁面,不讓他隨便跳轉,這就和Session有關了。舉例來說:登錄頁是login.jsp,登錄完成,借助struts你會跳轉到對應的頁面。但是如果你直接在地址欄輸入你要去的頁面,你可以直接進入。這在很多系統中是不允許的。為了達到這個目的,我們需要對頁面進行攔截和過濾,Servlet中提供了一個類是Filter類,專門做這件事。在這里先介紹登錄與驗證的實現方法,過濾的功能 將在《頁面Filter攔截與過濾》介紹,因為有些可寫的。這篇文章是對《SSH2+ExtJS4.2.1+MySql示例程序》系列博客的完善,在這篇博客中提供的源代碼也將更新,但源地址連接會保留。新的源代碼中將會增加對登錄、驗證和頁面攔截與過濾的功能。
針對源代碼在CSDN中的積分設置仍然是20分,分成兩個壓縮包,每個10分。這樣設置的原因是:1.CSDN初始20分,如果你只是個伸手黨,沒有開源精神,不做貢獻,你的CSDN積分肯定不夠20分,那么資源不會分享給你;2.下載資源,評論下,系統會返還你的積分,也就是說對你并沒有損失;3.作者耗費精力從無到有,算是另一種收獲吧。
在login()方法中ajaxJson()方法是向服務器發送消息的
對前臺腳本的處理
關于Struts2的屬性映射原理,頁面中定義的屬性只要和對應要訪問的Action中的屬性相同即可,這里相同指大小寫也要一致。在ExtJS中 定義的name:'username',屬性,在Action中也要有對應的字段。從請求的頁面將要發送的值傳送到Action中是通過Struts2來做的,Struts2就像一個信息傳遞的使者。知道該這么用就好,沒必要深究太多。
相關資源將會在12月2日之前更新,在《SSH2+ExtJS4.2.1+MySql示例程序》下面會給出新的資源鏈接。針對用戶登錄與頁面控制是一組完整的邏輯,這篇文章先介紹登錄與驗證,今天晚上在更新《頁面Filter攔截與過濾》的內容,如果對您有幫助,幫忙點個贊~
在login()方法中ajaxJson()方法是向服務器發送消息的
- /**
- * trim()方法用于去除空格
- * 1. 判斷驗證碼正確性
- * 2. 判斷用戶名在數據庫中是否存在
- * 3. 判斷密碼是否正確
- */
- public void login()
- {
- String msg = "";
- // 判斷驗證碼正確性
- String actionCheckCode = (String) ActionContext.getContext().getSession().get("getRandomNum");
- if ( !pageCheckCode.equals(actionCheckCode) )
- {
- msg = "{success:false,failMessage:'驗證碼有誤'}";
- }
- else
- {
- try
- {
- // 判斷用戶名在數據庫中是否存在
- user = loginService.get(User.class, "username", username.trim());
- if (user != null)
- {
- // if ( passwordMd5.trim().equals(user.getPassword().trim()) ) // TODO 2013-11-18
- if ( password.trim().equals(user.getPassword().trim()) )
- {
- msg = "{success:true}";
- this.userSession();
- }
- else{
- msg = "{success:false,failMessage:'密碼不正確'}";
- }
- }
- else {
- msg = "{success:false,failMessage:'系統無此用戶'}";
- }
- }
- catch (Exception e)
- {
- msg = "{success:false, failMessage:'登錄失敗,請確認網絡或數據庫是否正常!'}";
- }
- }
- ajaxJson(msg);
- }
驗證碼生成方法,作為LoginAction.java中的一個獨立方法,當你在瀏覽器地址欄中輸入如下連接的時候,頁面中會出現一個圖片,圖片中包含驗證碼
http://localhost:8099/system/login!sendCheckCode.action
http://localhost:8099/system/login!sendCheckCode.action
- /**
- * 生 成隨機驗證碼 這是一個獨立的 Action 方法
- */
- public void sendCheckCode() throws IOException
- {
- //設置頁面不緩存
- HttpServletResponse response = getUTFResponse(); //ServletActionContext.getResponse();
- response.setHeader("Pragma", "No-cache");
- response.setHeader("Cache-Control", "no-cache");
- response.setHeader("Content-Type", "image/jpeg");
- response.setDateHeader("Expires", 0);
- // 在內存中創建圖象
- 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));
- // 隨機產生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);
- }
- // 取隨機產生的認證碼(4位數字)
- String randomNum = "";
- for (int i = 0; i < 4; i++)
- {
- String getRandomNum = String.valueOf(random.nextInt(10));
- randomNum += getRandomNum;
- // 將認證碼顯示到圖象中
- g.setColor(new Color(20 + random.nextInt(110), 20 + random.nextInt(110), 20 + random.nextInt(110)));
- // 調用函數出來的顏色相同,可能是因為種子太接近,所以只能直接生成
- g.drawString(getRandomNum, 13 * i + 6, 16);
- }
- System.out.println("randomNum = " + randomNum);
- // 將認證碼存入SESSION
- ActionContext.getContext().getSession().put("getRandomNum", randomNum);
- // 圖象生效
- g.dispose();
- OutputStream output = response.getOutputStream();
- try
- {
- // 輸出圖象到頁面
- ImageIO.write(image, "JPEG", output);
- }
- finally {
- output.flush();
- output.close();
- }
- }
- //獲得隨機顏色 給定范圍獲得隨機顏色
- // java.awt.Color
- 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);
- }
后臺查詢用戶調用的方法:
- /**
- * 根據屬性名和屬性值獲取實體對象.
- *
- * @param clazz 實體對象類型
- * @param propertyName 屬性名稱
- * @param value 屬性值
- * @return 實體對象
- */
- @SuppressWarnings("unchecked")
- public <T> T get(Class<T> clazz, String propertyName, Object value)
- {
- Assert.hasText(propertyName, "propertyName must not be empty");
- Assert.notNull(value, "value is required");
- String hql = "from " + clazz.getName() + " as model where model." + propertyName + " = ?";
- return (T) getSession().createQuery(hql).setParameter(0, value).uniqueResult();
- }
- }
對前臺腳本的處理
- var loginForm = Ext.create('Ext.FormPanel',
- {
- height:100,
- width:300,
- frame:true,
- baseCls:'x-plain',
- items:
- [
- {
- xtype:'textfield',
- value:'a',
- name:'username', // 要對應LoginAction里的username
- fieldLabel:'用戶名',
- labelWidth:60,
- width:250,
- padding:'5 20 5 20',
- allowBlank:false,
- blankText:'用戶名不能為空',
- msgTarget:'side'
- },
- {
- xtype:'textfield',
- value:'a',
- name:'password',
- itemId:'password',
- inputType:'password',
- fieldLabel:'密 碼',
- labelWidth:60,
- width:250,
- padding:'10 20 5 20',
- allowBlank:false,
- blankText:'密碼不能為空',
- msgTarget:'side'
- },
- {
- xtype:'textfield', // 隱藏字段 用于將密碼銘文加密
- itemId:'passwordMd5',
- name:'passwordMd5',
- width:0,
- hidden:true
- },
- checkcode
- ]
- });
關于Struts2的屬性映射原理,頁面中定義的屬性只要和對應要訪問的Action中的屬性相同即可,這里相同指大小寫也要一致。在ExtJS中 定義的name:'username',屬性,在Action中也要有對應的字段。從請求的頁面將要發送的值傳送到Action中是通過Struts2來做的,Struts2就像一個信息傳遞的使者。知道該這么用就好,沒必要深究太多。
相關資源將會在12月2日之前更新,在《SSH2+ExtJS4.2.1+MySql示例程序》下面會給出新的資源鏈接。針對用戶登錄與頁面控制是一組完整的邏輯,這篇文章先介紹登錄與驗證,今天晚上在更新《頁面Filter攔截與過濾》的內容,如果對您有幫助,幫忙點個贊~
本文由用戶 Yangcl 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!