在前台页面有如下语句
<img onclick="this.src='/ran/random?random='+Math.random()" alt="验证码,点击图片更换" src="/ran/random?random=0.2868249340216069" width="86" height="40">
其中src 指向的地址不是一个img文件,而是一个转到SpringMVC的类中方法
src="/ran/random?random=0.2868249340216069"
方法如下:
@Controller
public class RandomCodeController {
@RequestMapping(value={"/ran/random"})
public void genericRandomCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
response.setHeader("Cache-Control", "private,no-cache,no-store");
response.setContentType("image/png");
HttpSession session = request.getSession();
int width = 85;
int height = 28;
BufferedImage image = new BufferedImage(width, height, 2);
Graphics2D g = image.createGraphics();
g.setComposite(AlphaComposite.getInstance(3, 1.0f));
Random random = new Random();
g.setColor(new Color(231, 231, 231));
g.fillRect(0, 0, width, height);
g.setFont(new Font("Microsoft YaHei", 2, 24));
String sRand = "";
for (int responseOutputStream = 0; responseOutputStream < 4; ++responseOutputStream) {
String rand = String.valueOf(random.nextInt(10));
sRand = sRand + rand;
g.setColor(new Color(121, 143, 96));
g.drawString(rand, 13 * responseOutputStream + 16, 23);
}
session.setAttribute("COMMON_RAND_CODE", (Object)sRand);
g.dispose();
ServletOutputStream var12 = response.getOutputStream();
ImageIO.write((RenderedImage)image, "png", (OutputStream)var12);
var12.close();
}
}
所以其实这个src相联系的是一个ServletOutputStream
这个地方我不太理解
ServletOutputStream如何和一个图片联系起来?
Non seulement les images, mais d'autres fichiers sont également transférés sous forme de flux. Le navigateur analyse le flux donné par l'arrière-plan en images.
Pour parler franchement, la façon dont l'image est affichée sur votre ordinateur est un flux de données via le réseau.
Il en va de même pour pointer vers des images ou des ressources spécifiques sur d'autres serveurs signifie que votre serveur Web lit le fichier correspondant sous la forme d'un flux puis l'envoie via le réseau. Ce à quoi le navigateur est connecté est un flux, et il ne peut juger que sur quoi est basé le fichier dans le flux
mime type
En pseudo-code, c'est simplement comme ça
Le code ci-dessus génère en fait une image, mais il n'écrit pas le fichier sur le disque dur, mais l'envoie directement au navigateur.
ImageIO.write(image, "png", output)
Cette phrase écrit en fait les données de l'objetimage
à l'emplacement correspondant. Si ce flux est une sortie de fichier, il sera écrit sur le disque dur, vous pouvez donc également le modifier.Il s'agit d'un problème avec la façon dont les flux de fichiers sont transmis dans les Servlets. ServletOutputStream est connecté au client du navigateur via HttpServletResponse.getOutputStream() convertit le fichier en flux de sortie. et une méthode de mise en œuvre spécifique, vous devez alors examiner le code source.
Je suppose que vous ne voulez pas étudier aussi profondément. Connaître simplement le processus général de transmission du flux de fichiers dans la structure B/S et comprendre les méthodes spécifiques d'implémentation du code et les règles de paramétrage. De plus, il est recommandé d'extraire le code de génération du code de vérification et d'écrire une méthode distincte, puis d'appeler la méthode RandomCodeController(), afin que la structure soit simple et claire