The last one said two ways to implement the verification code, let me talk about other methods.
(a) Implementation of Chinese verification Code
In fact, the implementation of Chinese verification code is almost the same as the alphanumeric, just the candidate letters and numbers to Chinese characters, and then the same random number of selected Chinese characters, the final output of the image. The Chinese character set chooses the commonly used Chinese character to be possible:
String base = "\u7684\u4e00\u4e86\u662f\u6211\u4e0d\u5728\u4eba\u4eec\u6709\u6765\u4ed6\u8fd9" + "\u4e0a\u7 740\u4e2a\u5730\u5230\u5927\u91cc\u8bf4\u5c31\u53bb\u5b50\u5f97\u4e5f\u548c "+" \u90a3\u8981\u4e0b\u770b\u5 929\u65f6\u8fc7\u51fa\u5c0f\u4e48\u8d77\u4f60\u90fd\u628a "+" \u597d\u8fd8\u591a\u6ca1\u4e3a\u53c8\u53ef\u5 bb6\u5b66\u53ea\u4ee5\u4e3b\u4f1a\u6837 "+" \u5e74\u60f3\u751f\u540c\u8001\u4e2d\u5341\u4ece\u81ea\u9762\u5 24d\u5934\u9053\u5b83 "+" \u540e\u7136\u8d70\u5f88\u50cf\u89c1\u4e24\u7528\u5979\u56fd\u52a8\u8fdb\u6210\u5 6de "+" \U4EC0\U8FB9\U4F5C\U5BF9\U5F00\U800C\U5DF1\U4E9B\U73B0\U5C71\U6C11\U5019\U7ECF\U53D1 "+ "\u5de5\u5411\u4e8b\u547d\u7ed9\u957f\u6c34\u51e0\u4e49\u4e09\u58f0\u4e8e\u9ad8\u624b" + "\u77e5\u7406\ u773c\u5fd7\u70b9\u5fc3\u6218\u4e8c\u95ee\u4f46\u8eab\u65b9\u5b9e\u5403 "+" \u505a\u53eb\u5f53\u4f4f\u542c\ u9769\u6253\u5462\u771f\u5168\u624d\u56db\u5df2\u6240 "+" \u654c\u4e4b\u6700\u5149\u4ea7\u60c5\u8def\u5206\u603b\u6761\u767d\u8bdd\ U4e1c\u5e2d "+" \u6b21\u4eb2\u5982\u88ab\u82b1\u53e3\u653e\u513f\u5e38\u6c14\u4e94\u7b2c\u4f7f\u5199 "+ "\u519b\u5427\u6587\u8fd0\u518d\u679c\u600e\u5b9a\u8bb8\u5feb\u660e\u884c\u56e0\u522b" + "\u98d e\u5916\u6811\u7269\u6d3b\u90e8\u95e8\u65e0\u5f80\u8239\u671b\u65b0\u5e26\u961f "+" \u5148\u529b\u5b8c\u537 4\u7ad9\u4ee3\u5458\u673a\u66f4\u4e5d\u60a8\u6bcf\u98ce\u7ea7 "+" \u8ddf\u7b11\u554a\u5b69\u4e07\u5c11\u76f 4\U610F\U591C\U6BD4\U9636\U8FDE\U8F66\U91CD "+" \u4fbf\u6597\u9a6c\u54ea\u5316\u592a\u6307\u53d8\u793e\u4f3 C\u58eb\u8005\u5e72\u77f3 "+" \u6ee1\u65e5\u51b3\u767e\u539f\u62ff\u7fa4\u7a76\u5404\u516d\u672c\u601d\u89e 3\U7ACB "+" \u6cb3\u6751\u516b\u96be\u65e9\u8bba\u5417\u6839\u5171\u8ba9\u76f8\u7814\u4eca\u5176 "+ "\u4e66\u5750\u63a5\u5e94\u5173\u4fe1\u89c9\u6b65\u53cd\u5904\u8bb0\u5c06\u5343\u627e "+" \u4e89\u9886\u6216\u5e08\u7ed3\u5 757\u8dd1\u8c01\u8349\u8d8a\u5b57\u52a0\u811a\u7d27 "+" \u7231\u7b49\u4e60\u9635\u6015\u6708\u9752\u534a\u7 06B\U6CD5\U9898\U5EFA\U8D76\U4F4D "+" \u5531\u6d77\u4e03\u5973\u4efb\u4ef6\u611f\u51c6\u5f20\u56e2\u5c4b\u7 9bb\u8272\u8138 "+" \u7247\u79d1\u5012\u775b\u5229\u4e16\u521a\u4e14\u7531\u9001\u5207\u661f\u5bfc\u665a "+ "\u8868\u591f\u6574\u8ba4\u54cd\u96ea\u6d41\u672a\u573a\u8be5\u5e76\u5e95\u6df1\u523b" + "\ u5e73\u4f1f\u5fd9\u63d0\u786e\u8fd1\u4eae\u8f7b\u8bb2\u519c\u53e4\u9ed1\u544a\u754c "+" \u62c9\u540d\u5440\ u571f\u6e05\u9633\u7167\u529e\u53f2\u6539\u5386\u8f6c\u753b\u9020 "+" \u5634\u6b64\u6cbb\u5317\u5fc5\u670d\ U96E8\U7A7F\U5185\U8BC6\U9A8C\U4F20\U4E1A\U83DC "+" \u722c\u7761\u5174\u5f62\u91cf\u54b1\u89c2\u82e6\u4f53\ U4f17\u901a\u51b2\u5408\u7834 "+" \U53CB\U5EA6\U672F\U996D\U516C\U65C1\U623F\U6781\U5357\U67AA\U8BFB\U6C99\U5C81\U7EBF "+ "\u91ce\u575a\u7a7a\u6536\u7b97\u81f3\u653f\u57ce\u52b3\u843d\u94b1\u7279\u56f4\u5f1f" + "\u80dc\u655 9\u70ed\u5c55\u5305\u6b4c\u7c7b\u6e10\u5f3a\u6570\u4e61\u547c\u6027\u97f3 "+" \u7b54\u54e5\u9645\u65e7\u795 e\u5ea7\u7ae0\u5e2e\u5566\u53d7\u7cfb\u4ee4\u8df3\u975e "+" \u4f55\u725b\u53d6\u5165\u5cb8\u6562\u6389\u5ff d\u79cd\u88c5\u9876\u6025\u6797\u505c "+" \u606f\u53e5\u533a\u8863\u822c\u62a5\u53f6\u538b\u6162\u53d4\u80c C\u7ec6 ";
Loop select Chinese characters, output image:
Random r = new random (); int index; StringBuffer sb = new StringBuffer (); for (int i = 0; i < 4; i++) {String ch = base.charat (R.nextint (Base.length ())) + " "; G.setcolor (new Color (R.nextint), R.nextint (188), R.nextint (255)); g.drawstring (CH, (i*15) +3); Sb.append (CH) ;} Request.getsession (). SetAttribute ("Piccode", sb.tostring ()); Imageio.write (BI, "JPG", Response.getoutputstream ());
Background processing Verify that the verification code is the same as the correct, the same through the session to obtain a verification code and user input comparison and then process the page. Note that I started in the implementation of always appear in Chinese garbled, I went online to check the original Tomcat under the request appears in Chinese garbled because GET request by default is encoded in ISO8859-1 format, Even if the request.setcharacterencoding is set on the page, some blogs suggest changing to Tomcat's server.xml, and some say that there are many ways to change the GET request to a POST request, and so on. Later I thought, since the request with ISO8859-1 code, I use Request.getparameter to get content and then to Utf-8 not be able to, and this is relatively simple, so I tried to do, so that solves the problem:
@Overrideprotected void doget (HttpServletRequest request, httpservletresponse response) throws Servletexception, IOException {String piccode = (string) request.getsession (). getattribute ("Piccode"); String Checkcode = Request.getparameter ("Checkcode"); Get requests are encoded by default in iso8859-1 format and need to be converted to Utf-8checkcode = new String (checkcode.getbytes ("iso8859-1"), "UTF-8"); Response.setcontenttype ("Text/html;charset=utf-8"); Set the format of this document to prevent garbled printwriter out = Response.getwriter (); if (Checkcode.equals (Piccode)) {out.println ("Verify code entered correctly! ");} else {out.print ("Captcha input Error! ");} Out.println (Checkcode); Out.flush (); Out.close ();}
The final effect is as follows:
(b) Arithmetic verification code
The arithmetic verification code is also similar. Generate a verification code with random number generated two operands, in the random selection operator, generally only use +,-,*, less use/, because with/may want to avoid the divisor of 0, if you want to appear multiplication, then the best two operands are set less than 10 (do you want to let users lose a verification code to use the calculator beside press Press?)! )。 At last, the result of the operation is saved by the session, and then the check is taken as equal, then processed:
char[] op = "+-". ToCharArray (); Random r = new random (), int index, LEN1 = op.length;int result = 0, Firstnum = 0, Secondnum = 0;char operation = ' 0 '; for ( int i = 0; I < 4; i++) {if (I! = 1) index = R.nextint (+), Else index = R.nextint (LEN1); G.setcolor (New Color (R.nextint (), R.nextint (188), R.nextint (255))); if (i = = 0) {g.drawstring (index+ "", (i*15) +3); firstnum = index;} else if (i = = 2) {g.drawstring (index+ "", (i*15) +3); secondnum = index;} else if (i = = 1) {g.drawstring (op[index]+ "", (i*15) +3); operation = Op[index];} else {g.drawstring ("=", (i*15) +3, 18);}} if (Operation = = ' + ') result = Firstnum+secondnum;else if (Operation = = '-') result = Firstnum-secondnum;else if (operatio n = = ' * ') result = Firstnum*secondnum;request.getsession (). SetAttribute ("result", result);
Final effect:
Full code See: Https://github.com/lingd3/Captcha
Java Implementation Verification Code (bottom)