按照我的理解,可以的,代碼生成器是跨平臺(tái),而且是跨語(yǔ)言的(至少是跨文本語(yǔ)言的,UML暫時(shí)不好說(shuō),)。
堅(jiān)守“ 做人真誠(chéng) · 做事靠譜 · 口碑至上 · 高效敬業(yè) ”的價(jià)值觀,專業(yè)網(wǎng)站建設(shè)服務(wù)10余年為成都成都石涼亭小微創(chuàng)業(yè)公司專業(yè)提供成都定制網(wǎng)頁(yè)設(shè)計(jì)營(yíng)銷網(wǎng)站建設(shè)商城網(wǎng)站建設(shè)手機(jī)網(wǎng)站建設(shè)小程序網(wǎng)站建設(shè)網(wǎng)站改版,從內(nèi)容策劃、視覺(jué)設(shè)計(jì)、底層架構(gòu)、網(wǎng)頁(yè)布局、功能開(kāi)發(fā)迭代于一體的高端網(wǎng)站建設(shè)服務(wù)。
代碼生成器作為一種開(kāi)發(fā)工具,一般不直接作為程序的一部分,通常也不直接或間接(如通過(guò)AOP)被程序調(diào)用,他是通過(guò)編程的方式生成所需要的代碼,然后將生成的代碼作為源文件,復(fù)制到開(kāi)發(fā)工具的代碼區(qū),然后進(jìn)行編譯。由于代碼生成器是在編譯之前運(yùn)行的,因此它可以跨語(yǔ)言,你不但可以用代碼生成器生成高級(jí)語(yǔ)言,也可以生成匯編語(yǔ)言,甚至機(jī)器碼(0、1代碼)。
但編寫(xiě)代碼生成器是一個(gè)難點(diǎn),它需要你了解目標(biāo)編程語(yǔ)言的語(yǔ)法。如果別人已經(jīng)把你需要的代碼生成器寫(xiě)好了,你只需按要求使用即可,此時(shí)就不需要了解目標(biāo)編程語(yǔ)言的語(yǔ)法。
JNI是通過(guò)Java調(diào)用C語(yǔ)言(或其他語(yǔ)言,一般是C),它的實(shí)現(xiàn)機(jī)制與代碼生成器不同(JNI是通過(guò)代碼調(diào)用實(shí)現(xiàn)功能,而代碼生成器是生成代碼,復(fù)制代碼進(jìn)行使用),由于C是底層語(yǔ)言,一些底層操作單靠Java無(wú)法實(shí)現(xiàn),所以才需要JNI。
以上是我對(duì)代碼生成器的個(gè)人理解,雖然提問(wèn)時(shí)間已過(guò)了很久,但依然希望能對(duì)你及其他網(wǎng)友有所幫助。
代碼生成階段的目標(biāo)代碼和具體計(jì)算機(jī)的結(jié)構(gòu)有關(guān),如指令格式、字長(zhǎng)以及寄存器的個(gè)數(shù)和種類,并與指令的語(yǔ)義和所用操作系統(tǒng)等都密切相關(guān),特別是高級(jí)語(yǔ)言的語(yǔ)義功能復(fù)雜,并且計(jì)算機(jī)硬件結(jié)構(gòu)多樣性都給代碼生成的理論研究帶來(lái)很大的復(fù)雜性,因此實(shí)際實(shí)現(xiàn)起來(lái)是非常困難的。所以難得生成一款后端的代碼生成器,當(dāng)然是想讓它可以獨(dú)立出來(lái),被多次組裝參與其他編譯器的生產(chǎn)過(guò)程。對(duì)這種機(jī)器的所有編譯程序在分析階段都生成MSIL,在實(shí)現(xiàn)一個(gè)編譯程序時(shí),盡量把編譯過(guò)程的大量工作放在代碼生成階段,即MSIL到目標(biāo)程序的翻譯上,以減輕不同語(yǔ)言翻譯的分析任務(wù)。因不管多少種高級(jí)語(yǔ)言,MSIL到目標(biāo)程序的代碼生成只需做一次即可。
原理,在servlet中隨機(jī)生成一個(gè)4位數(shù)字1000-9999
然后把這數(shù)字寫(xiě)入session
輸出一個(gè)圖片,上面寫(xiě)有這四個(gè)數(shù)字
在服務(wù)器端根據(jù)用戶輸入的數(shù)字和
session中的值比較。
注意比較結(jié)束后要清空session中的值
有很多人問(wèn)到驗(yàn)證碼的作用。
我作個(gè)簡(jiǎn)單的解釋。
驗(yàn)證碼的作用:有效防止這種問(wèn)題對(duì)某一個(gè)特定注冊(cè)用戶用特定程序暴力破解方式進(jìn)行不斷的登陸嘗試,實(shí)際上是用驗(yàn)證碼是現(xiàn)在很多網(wǎng)站通行的方式(比如招商銀行的網(wǎng)上個(gè)人銀行,騰訊的QQ社區(qū)),我們利用比較簡(jiǎn)易的方式實(shí)現(xiàn)了這個(gè)功能。雖然登陸麻煩一點(diǎn),但是對(duì)社區(qū)還來(lái)說(shuō)這個(gè)功能還是很有必要,也很重要。但我們還是提醒大家主要保護(hù)自己的密碼,盡量使用混雜了數(shù)字、字母、符號(hào)在內(nèi)的6位以上密碼,不要使用諸如1234之類的簡(jiǎn)單密碼或者與用戶名相同、類似的密碼。
還有就是注冊(cè)時(shí)發(fā)表文章時(shí)加驗(yàn)證碼,就防人用注冊(cè)機(jī),無(wú)限的自動(dòng)注冊(cè),
package com.schoolwx.util;
import java.io.*;
import java.util.*;
import com.sun.image.codec.jpeg.*;
import javax.servlet.*;
import javax.servlet.http.*;
import java.awt.*;
import java.awt.image.*;
public class getImg extends HttpServlet {
private Font mFont=new Font("宋體", Font.PLAIN,12);//設(shè)置字體
//處理post
public void doPost(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
doGet(request,response);
}
public void doGet(HttpServletRequest request,HttpServletResponse response)
throws ServletException,IOException {
//取得一個(gè)1000-9999的隨機(jī)數(shù)
String s="";
int intCount=0;
intCount=(new Random()).nextInt(9999);//
if(intCount1000)intCount+=1000;
s=intCount+"";
//對(duì)session付值。
HttpSession session=request.getSession (true);
session.setAttribute("getImg",s);
response.setContentType("image/gif");
ServletOutputStream out=response.getOutputStream();
BufferedImage image=new BufferedImage(35,14,BufferedImage.TYPE_INT_RGB);
Graphics gra=image.getGraphics();
//設(shè)置背景色
gra.setColor(Color.yellow);
gra.fillRect(1,1,33,12);
//設(shè)置字體色
gra.setColor(Color.black);
gra.setFont(mFont);
//輸出數(shù)字
char c;
for(int i=0;i4;i++) {
c=s.charAt(i);
gra.drawString(c+"",i*7+4,11); //7為寬度,11為上下高度位置
}
JPEGImageEncoder encoder=JPEGCodec.createJPEGEncoder(out);
encoder.encode(image);
out.close();
}
}
登錄頁(yè)面login.jsp示例代碼:
%@ page language="java" import="java.util.*" pageEncoding="utf-8"%
%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%
!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
html
head
base href="%=basePath%"
titleMy JSP 'login.jsp' starting page/title
meta http-equiv="pragma" content="no-cache"
meta http-equiv="cache-control" content="no-cache"
meta http-equiv="expires" content="0"
meta http-equiv="keywords" content="keyword1,keyword2,keyword3"
meta http-equiv="description" content="This is my page"
!--
link rel="stylesheet" type="text/css" href="styles.css"
--
/head
%
String incode = (String)request.getParameter("code");
String rightcode = (String)session.getAttribute("rCode");
if(incode != null rightcode != null){
if(incode.equals(rightcode)){
out.println("驗(yàn)證碼輸入正確!");
}else{
out.println("驗(yàn)證碼輸入不正確,請(qǐng)重新輸入!");
}
}
%
body
form action="login.jsp" method="post"
用戶名:
input type="text" name="username"/br/
密碼:
input type="password" name="password"/br/
驗(yàn)證碼:
img src="number.jsp"/
input type="text" name="code"/
input type="submit" value="登錄"/
/form
/body
/html
驗(yàn)證碼頁(yè)面number.jsp代碼:
%@ page contentType="image/jpeg" language="java" import="java.util.*,java.awt.*,java.awt.image.*,javax.imageio.*" pageEncoding="utf-8"%
%!
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);
}
%
%
//設(shè)置頁(yè)面不緩存
response.setHeader("Pragma","no-cache");
response.setHeader("Cache-Control","no-catch");
response.setDateHeader("Expires",0);
//在內(nèi)存中創(chuàng)建圖象
int width = 60;
int height = 20;
BufferedImage image = new BufferedImage(width,height,BufferedImage.TYPE_INT_RGB);
//創(chuàng)建圖象
Graphics g = image.getGraphics();
//生成隨機(jī)對(duì)象
Random random = new Random();
//設(shè)置背景色
g.setColor(getRandColor(200,250));
g.fillRect(0,0,width,height);
//設(shè)置字體
g.setFont(new Font("Tines Nev Roman",Font.PLAIN,18));
//隨機(jī)產(chǎn)生干擾線
g.setColor(getRandColor(160,200));
for(int i = 0; i 255; i++){
int x = random.nextInt(width);
int y = random.nextInt(height);
int xl = random.nextInt(12);
int yl = random.nextInt(12);
}
//隨機(jī)產(chǎn)生認(rèn)證碼,4位數(shù)字
String sRand = "";
for(int i = 0; i 4; i++){
String rand = String.valueOf(random.nextInt(10));
sRand += rand;
//將認(rèn)證碼顯示到圖象中
g.setColor(new Color(20 + random.nextInt(110),20 + random.nextInt(110),20 + random.nextInt(110)));
g.drawString(rand,13*i+6,16);
}
session.setAttribute("rCode",sRand);
//圖像生效
g.dispose();
//輸出圖像到頁(yè)面
ImageIO.write(image,"JPEG",response.getOutputStream());
out.clear();
out = pageContext.pushBody();
%
這是我以前做的一個(gè)小項(xiàng)目時(shí)用到md5寫(xiě)的
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
//將用戶密碼進(jìn)行md5加密?? 并返回加密后的32位十六進(jìn)制密碼
public class MD5Util {
public static String md5(String password) {
try {
// 獲取md5對(duì)象
MessageDigest md = MessageDigest.getInstance("md5");
// 獲取加密后的密碼并返回十進(jìn)制字節(jié)數(shù)組
byte[] bytes = md.digest(password.getBytes());
// 遍歷數(shù)組得到每個(gè)十進(jìn)制數(shù)并轉(zhuǎn)換成十六進(jìn)制
StringBuffer sb = new StringBuffer();
for (byte b : bytes) {
// 把每個(gè)數(shù)轉(zhuǎn)成十六進(jìn)制 存進(jìn)字符中
sb.append(toHex(b));
}
String finish = sb.toString();
return finish;
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
throw new RuntimeException(e);
}
}
// 十進(jìn)制轉(zhuǎn)十六進(jìn)制方法
private static String toHex(byte b) {
int target = 0;
if (b 0) {
target = 255 + b;
} else {
target = b;
}
int first = target / 16;
int second = target % 16;
return Hex[first] + Hex[second];
}
static String[] Hex = { "0", "1", "2", "3", "4", "5", "6", "7", "8", "9",
"a", "b", "c", "d", "e", "f" };
/*public static void main(String[] args) {
String a = MD5Util.md5("1234");
System.out.println(a);
}*/
}
說(shuō)起驗(yàn)證碼,關(guān)系它的是安全性,再聯(lián)系到你的時(shí)效性,這就非session(本身是客戶端的唯一使用服務(wù)器資源的憑證,而且是有時(shí)效限制的,用戶長(zhǎng)期未訪問(wèn)服務(wù)器,這個(gè)session是就會(huì)被主動(dòng)注銷掉)不能當(dāng)此大任了,可用性不在話下,至于你說(shuō)的加密這是畫(huà)蛇添足了。
依樓上所言,未免誤人,服務(wù)器端是必須保存這個(gè)驗(yàn)證碼的,就像我給你了一個(gè)驗(yàn)證碼,你可以使用,我自己也得備份一下和你比對(duì),不然那不就變成了:你說(shuō)你的驗(yàn)證碼是對(duì)的,你已經(jīng)驗(yàn)證過(guò)了,我就信任你了,那就等于沒(méi)有密碼,客戶端的一切安全認(rèn)證都是不足為信的!