img标签的src属性等于servlet名,求详细的解释

时间:2023-01-29 23:23:13
在用Ajax实现图片验证码时,都是<img src="servlet名"> ,这样就能访问到对应的servlet。不知道其中的原理。求助求助。。。。。。

9 个解决方案

#1


servlet会返回一个图片的名字,浏览器根据图片名字再到服务器端取这个图片。
这样算来来回各跑了两趟?

#2


servlet使用java gui api生成图片,得到图片二进制字节流,返回浏览器渲染

#3


引用 1 楼 xxhhbb1538 的回复:
servlet会返回一个图片的名字,浏览器根据图片名字再到服务器端取这个图片。
这样算来来回各跑了两趟?


确实是跑了两次,在IE7中就把那个servlet执行了两次,但是再firefox中就只执行了一次servlet。
但是这个过程浏览器是具体怎么执行的呢?

#4


引用 2 楼 litiebiao2012 的回复:
servlet使用java gui api生成图片,得到图片二进制字节流,返回浏览器渲染

<img src="servlet名">浏览器是如何解析的呢?

#5


1.servlet生成一个图片
2.你直接输入servlet的连接看一下,就是一个图片,和我们自己发布到服务器的一样。
3.页面加载时,会访问这个servelt连接,自然就会生成一个图片

#6


这要看你src="servlet名"里的servlet是给谁用的了。也就是给服务器,还是浏览器。

#7


楼主想知道的有点深奥。。不懂哎

#8


求大侠们指点迷津啊。。。。。 img标签的src属性等于servlet名,求详细的解释

#9


servlet中输出一个流(java.io.InputStream )就可以了,
private char mapTable[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

/**
 * 生成随机的注册验证码图像
 * @param request
 * @param response
 * */
public void bringCode(HttpServletRequest request, HttpServletResponse response) {
try {
int width = 65, height = 24;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics graphics = image.getGraphics();// 获取图形上下文
graphics.setColor(getRandColor(180, 250));// 设定背景色(最多色调255)
graphics.fillRect(0, 0, width, height);
graphics.setColor(Color.black);// 画边框
graphics.drawRect(0, 0, width - 1, height - 1);
String randCode = "";// 取随机产生的认证码
for (int i = 0; i < 4; ++i) {// 4代表4位验证码,如果要生成更多位的认证码,则加大数值
randCode += mapTable[(int) (mapTable.length * Math.random())];
}
graphics.setColor(Color.black);// 将认证码显示到图像中,如果要生成更多位的认证码,增加drawString语句
graphics.setFont(new Font("Atlantic Inline", Font.PLAIN, 18));
String str = randCode.substring(0, 1);
graphics.drawString(str, 8, 17);
str = randCode.substring(1, 2);
graphics.drawString(str, 20, 15);
str = randCode.substring(2, 3);
graphics.drawString(str, 35, 18);
str = randCode.substring(3, 4);
graphics.drawString(str, 45, 15);
Random rand = new Random();// 随机产生30个干扰点
for (int i = 0; i < 30; i++) {
int x = rand.nextInt(width);
int y = rand.nextInt(height);
graphics.drawOval(x, y, 1, 1);
}
graphics.dispose();// 释放图形上下文
request.getSession().setAttribute(FrameConfig.checkCode, randCode);// 认证码保存在session中
OutputStream output = response.getOutputStream();
ImageIO.write(image, "JPEG", output);// 输出图像到页面
image.flush();
output.close();
} catch (Exception e) {
e.printStackTrace();
}
}

关键代码:
ImageIO.write(image, "JPEG", output);// 输出图像到页面

#1


servlet会返回一个图片的名字,浏览器根据图片名字再到服务器端取这个图片。
这样算来来回各跑了两趟?

#2


servlet使用java gui api生成图片,得到图片二进制字节流,返回浏览器渲染

#3


引用 1 楼 xxhhbb1538 的回复:
servlet会返回一个图片的名字,浏览器根据图片名字再到服务器端取这个图片。
这样算来来回各跑了两趟?


确实是跑了两次,在IE7中就把那个servlet执行了两次,但是再firefox中就只执行了一次servlet。
但是这个过程浏览器是具体怎么执行的呢?

#4


引用 2 楼 litiebiao2012 的回复:
servlet使用java gui api生成图片,得到图片二进制字节流,返回浏览器渲染

<img src="servlet名">浏览器是如何解析的呢?

#5


1.servlet生成一个图片
2.你直接输入servlet的连接看一下,就是一个图片,和我们自己发布到服务器的一样。
3.页面加载时,会访问这个servelt连接,自然就会生成一个图片

#6


这要看你src="servlet名"里的servlet是给谁用的了。也就是给服务器,还是浏览器。

#7


楼主想知道的有点深奥。。不懂哎

#8


求大侠们指点迷津啊。。。。。 img标签的src属性等于servlet名,求详细的解释

#9


servlet中输出一个流(java.io.InputStream )就可以了,
private char mapTable[] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };

/**
 * 生成随机的注册验证码图像
 * @param request
 * @param response
 * */
public void bringCode(HttpServletRequest request, HttpServletResponse response) {
try {
int width = 65, height = 24;
BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
Graphics graphics = image.getGraphics();// 获取图形上下文
graphics.setColor(getRandColor(180, 250));// 设定背景色(最多色调255)
graphics.fillRect(0, 0, width, height);
graphics.setColor(Color.black);// 画边框
graphics.drawRect(0, 0, width - 1, height - 1);
String randCode = "";// 取随机产生的认证码
for (int i = 0; i < 4; ++i) {// 4代表4位验证码,如果要生成更多位的认证码,则加大数值
randCode += mapTable[(int) (mapTable.length * Math.random())];
}
graphics.setColor(Color.black);// 将认证码显示到图像中,如果要生成更多位的认证码,增加drawString语句
graphics.setFont(new Font("Atlantic Inline", Font.PLAIN, 18));
String str = randCode.substring(0, 1);
graphics.drawString(str, 8, 17);
str = randCode.substring(1, 2);
graphics.drawString(str, 20, 15);
str = randCode.substring(2, 3);
graphics.drawString(str, 35, 18);
str = randCode.substring(3, 4);
graphics.drawString(str, 45, 15);
Random rand = new Random();// 随机产生30个干扰点
for (int i = 0; i < 30; i++) {
int x = rand.nextInt(width);
int y = rand.nextInt(height);
graphics.drawOval(x, y, 1, 1);
}
graphics.dispose();// 释放图形上下文
request.getSession().setAttribute(FrameConfig.checkCode, randCode);// 认证码保存在session中
OutputStream output = response.getOutputStream();
ImageIO.write(image, "JPEG", output);// 输出图像到页面
image.flush();
output.close();
} catch (Exception e) {
e.printStackTrace();
}
}

关键代码:
ImageIO.write(image, "JPEG", output);// 输出图像到页面