本文目錄一覽:
JSP實例:Java實現隨機驗證碼功能實例
現在許多系統的註冊 登錄或者發布信息模塊都添加的隨機碼功能 就是為了避免自動註冊程序或者自動發布程序的使用
驗證碼實際上就是隨機選擇一些字符以圖片的形式展現在頁面上 如果進行提交操作的同時需要將圖片上的字符同時提交 如果提交的字符與服務器session保存的不同 則認為提交信息無效 為了避免自動程序分析解析圖片 通常會在圖片上隨機生成一些干擾線或者將字符進行扭曲 增加自動識別的難度
在這裡 我們使用servlet來實現隨機驗證碼的實現
package servlet; import java awt Color; import java awt Font; import java awt Graphics D; import java awt image BufferedImage; import java util Random; import javax imageio ImageIO; import javax servlet ServletException; import javax servlet ServletOutputStream; import javax servlet import javax servlet import javax servlet import javax servlet /** * 生成隨機驗證碼 * @author bitiliu * */ public class ValidateCodeServlet extends HttpServlet { private static final long serialVersionUID = L; //驗證碼圖片的寬度 private int width= ; //驗證碼圖片的高度 private int height= ; //驗證碼字符個數 private int codeCount= ; private int x= ; //字體高度 private int fontHeight; private int codeY; char[] codeSequence = { A B C D E F G H I J K L M N O P Q R S T U V W X Y Z }; /** * 初始化驗證圖片屬性 */ public void init() throws ServletException { //從web xml中獲取初始信息 //寬度 String strWidth=this getInitParameter(“width”); //高度 String strHeight=this getInitParameter(“height”); //字符個數 String strCodeCount=this getInitParameter(“codeCount”); //將配置的信息轉換成數值 try { if(strWidth!=null strWidth length()!= ) { width=Integer parseInt(strWidth); } if(strHeight!=null strHeight length()!= ) { height=Integer parseInt(strHeight); } if(strCodeCount!=null strCodeCount length()!= ) { codeCount=Integer parseInt(strCodeCount); } } catch(NumberFormatException e) {} x=width/(codeCount+ ); fontHeight=height ; codeY=height ; } protected void service(HttpServletRequest req HttpServletResponse resp) throws ServletException java io IOException { //定義圖像buffer BufferedImage buffImg = new BufferedImage( width height BufferedImage TYPE_INT_RGB); Graphics D g = buffImg createGraphics(); //創建一個隨機數生成器類 Random random = new Random(); //將圖像填充為白色 g setColor(Color WHITE); g fillRect( width height); //創建字體 字體的大小應該根據圖片的高度來定 Font font = new Font(“Fixedsys” Font PLAIN fontHeight); //設置字體 g setFont(font); //畫邊框 g setColor(Color BLACK); g drawRect( width height ); //隨機產生 條幹擾線 使圖象中的認證碼不易被其它程序探測到 g setColor(Color BLACK); for(int i = ; i ; i++) { int x = random nextInt(width); int y = random nextInt(height); int xl = random nextInt( ); int yl = random nextInt( ); g drawLine(x y x + xl y + yl); } //randomCode用於保存隨機產生的驗證碼 以便用戶登錄後進行驗證 StringBuffer randomCode = new StringBuffer(); int red = green = blue = ; //隨機產生codeCount數字的驗證碼 for (int i = ; i codeCount; i++) { //得到隨機產生的驗證碼數字 String strRand = String valueOf(codeSequence[random nextInt( )]); //產生隨機的顏色分量來構造顏色值 這樣輸出的每位數字的顏色值都將不同 red = random nextInt( ); green = random nextInt( ); blue = random nextInt( ); //用隨機產生的顏色將驗證碼繪製到圖像中 g setColor(new Color(red green blue)); g drawString(strRand (i + ) * x codeY); //將產生的四個隨機數組合在一起 randomCode append(strRand); } // 將四位數字的驗證碼保存到Session中 HttpSession session = req getSession(); session setAttribute(“validateCode” randomCode toString()); // 禁止圖像緩存 resp setHeader(“Pragma” “no cache”); resp setHeader(“Cache Control” “no cache”); resp setDateHeader(“Expires” ); resp setContentType(“image/jpeg”); //將圖像輸出到Servlet輸出流中 ServletOutputStream sos = resp getOutputStream(); ImageIO write(buffImg “jpeg” sos); sos close(); } }
需要在web xml中聲明servlet
servlet servlet nameValidateCodeServlet/servlet name servlet class servlet ValidateCodeServlet/servlet class init param param namewidth/param name param value /param value /init param init param param nameheight/param name param value /param value /init param init param param namecodeCount/param name param value /param value /init param /servlet servlet mapping servlet nameValidateCodeServlet/servlet name url pattern/validateCodeServlet/url pattern /servlet mapping
需要引用的頁面可以這樣來寫
ccid_file values=”validateCodeServlet” width= / /
lishixinzhi/Article/program/Java/JSP/201311/19913
java如何實現發送短信驗證碼功能?
1、創建一個Http的模擬請求工具類,然後寫一個POST方法或者GET方法
/** * 文件說明 * @Description:擴展說明 * @Copyright: XXXX dreamtech.com.cn Inc. All right reserved * @Version: V6.0 */package com.demo.util; import java.io.IOException;import java.util.Map; import org.apache.commons.httpclient.HttpClient;import org.apache.commons.httpclient.HttpException;import org.apache.commons.httpclient.SimpleHttpConnectionManager;import org.apache.commons.httpclient.methods.GetMethod;import org.apache.commons.httpclient.methods.PostMethod; /** * @Author: feizi * @Date: XXXX年XX月XX日 XX:XX:XX * @ModifyUser: feizi * @ModifyDate: XXXX年XX月XX日 XX:XX:XX * @Version:V6.0 */public class HttpRequestUtil { /** * HttpClient 模擬POST請求 * 方法說明 * @Discription:擴展說明 * @param url * @param params * @return String * @Author: feizi * @Date: XXXX年XX月XX日 XX:XX:XX * @ModifyUser:feizi * @ModifyDate: XXXX年XX月XX日 XX:XX:XX */ public static String postRequest(String url, MapString, String params) { //構造HttpClient的實例 HttpClient httpClient = new HttpClient(); //創建POST方法的實例 PostMethod postMethod = new PostMethod(url); //設置請求頭信息 postMethod.setRequestHeader(“Connection”, “close”); //添加參數 for (Map.EntryString, String entry : params.entrySet()) { postMethod.addParameter(entry.getKey(), entry.getValue()); } //使用系統提供的默認的恢復策略,設置請求重試處理,用的是默認的重試處理:請求三次 httpClient.getParams().setBooleanParameter(“http.protocol.expect-continue”, false); //接收處理結果 String result = null; try { //執行Http Post請求 httpClient.executeMethod(postMethod); //返回處理結果 result = postMethod.getResponseBodyAsString(); } catch (HttpException e) { // 發生致命的異常,可能是協議不對或者返回的內容有問題 System.out.println(“請檢查輸入的URL!”); e.printStackTrace(); } catch (IOException e) { // 發生網絡異常 System.out.println(“發生網絡異常!”); e.printStackTrace(); } finally { //釋放鏈接 postMethod.releaseConnection(); //關閉HttpClient實例 if (httpClient != null) { ((SimpleHttpConnectionManager) httpClient.getHttpConnectionManager()).shutdown(); httpClient = null; } } return result; } /** * HttpClient 模擬GET請求 * 方法說明 * @Discription:擴展說明 * @param url * @param params * @return String * @Author: feizi * @Date: XXXX年XX月XX日 XX:XX:XX * @ModifyUser:feizi * @ModifyDate: XXXX年XX月XX日 XX:XX:XX */ public static String getRequest(String url, MapString, String params) { //構造HttpClient實例 HttpClient client = new HttpClient(); //拼接參數 String paramStr = “”; for (String key : params.keySet()) { paramStr = paramStr + “” + key + “=” + params.get(key); } paramStr = paramStr.substring(1); //創建GET方法的實例 GetMethod method = new GetMethod(url + “?” + paramStr); //接收返回結果 String result = null; try { //執行HTTP GET方法請求 client.executeMethod(method); //返回處理結果 result = method.getResponseBodyAsString(); } catch (HttpException e) { // 發生致命的異常,可能是協議不對或者返回的內容有問題 System.out.println(“請檢查輸入的URL!”); e.printStackTrace(); } catch (IOException e) { // 發生網絡異常 System.out.println(“發生網絡異常!”); e.printStackTrace(); } finally { //釋放鏈接 method.releaseConnection(); //關閉HttpClient實例 if (client != null) { ((SimpleHttpConnectionManager) client.getHttpConnectionManager()).shutdown(); client = null; } } return result; }}
2、在創建一個類,生成驗證碼,然後傳遞相應的參數(不同的短信平台接口會有不同的參數要求,這個一般短信平台提供的接口文檔中都會有的,直接看文檔然後按要求來即可)
/** * 文件說明 * @Description:擴展說明 * @Copyright: XXXX dreamtech.com.cn Inc. All right reserved * @Version: V6.0 */package com.demo.util; import java.net.URLEncoder;import java.util.HashMap;import java.util.Map; /** * @Author: feizi * @Date: XXXX年XX月XX日 XX:XX:XX * @ModifyUser: feizi * @ModifyDate: XXXX年XX月XX日 XX:XX:XX * @Version:V6.0 */public class SendMsgUtil { /** * 發送短信消息 * 方法說明 * @Discription:擴展說明 * @param phones * @param content * @return * @return String * @Author: feizi * @Date: 2015年4月17日 下午7:18:08 * @ModifyUser:feizi * @ModifyDate: 2015年4月17日 下午7:18:08 */ @SuppressWarnings(“deprecation”) public static String sendMsg(String phones,String content){ //短信接口URL提交地址 String url = “短信接口URL提交地址”; MapString, String params = new HashMapString, String(); params.put(“zh”, “用戶賬號”); params.put(“mm”, “用戶密碼”); params.put(“dxlbid”, “短信類別編號”); params.put(“extno”, “擴展編號”); //手機號碼,多個號碼使用英文逗號進行分割 params.put(“hm”, phones); //將短信內容進行URLEncoder編碼 params.put(“nr”, URLEncoder.encode(content)); return HttpRequestUtil.getRequest(url, params); } /** * 隨機生成6位隨機驗證碼 * 方法說明 * @Discription:擴展說明 * @return * @return String * @Author: feizi * @Date: 2015年4月17日 下午7:19:02 * @ModifyUser:feizi * @ModifyDate: 2015年4月17日 下午7:19:02 */ public static String createRandomVcode(){ //驗證碼 String vcode = “”; for (int i = 0; i 6; i++) { vcode = vcode + (int)(Math.random() * 9); } return vcode; } /** * 測試 * 方法說明 * @Discription:擴展說明 * @param args * @return void * @Author: feizi * @Date: XXXX年XX月XX日 XX:XX:XX * @ModifyUser:feizi * @ModifyDate: XXXX年XX月XX日 XX:XX:XX */ public static void main(String[] args) {// System.out.println(SendMsgUtil.createRandomVcode());// System.out.println(“ecb=12”.substring(1)); System.out.println(sendMsg(“18123456789,15123456789”, “尊敬的用戶,您的驗證碼為” + SendMsgUtil.createRandomVcode() + “,有效期為60秒,如有疑慮請詳詢XXX-XXX-XXXX【XXX中心】”)); }
然後執行一下,一般的情況下參數傳遞正確,按照接口文檔的規範來操作的話,都會發送成功的,手機都能收到驗證碼的,然後可能會出現的問題就是:發送的短信內容有可能會出現中文亂碼,然後就會發送不成功,按照短信平台的要求進行相應的編碼即可。一般都會是UTF-8編碼。
java短信驗證碼如何驗證
先創建一個驗證碼,通過短信代理髮送到用戶指定的手機,待用戶提交後做對比,看驗證碼是否一致。
整體流程:
用戶輸入手機號碼,點擊獲取驗證碼
服務器創建驗證碼,並通過短信代理商發送到用戶手機
用戶查看驗證碼,輸入提交
服務器進行確認,反饋成功或者失敗。
原創文章,作者:LOAL,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/133533.html