First import it yourself Vue and jQuery Wait for the bag you need , I won't put pictures here .

Because the tool class is too long, I put it at the end of the article

stay html Write basic request verification code
<input type="text" name="yzm" placeholder=" Fill in the verification code on the right "
data-validate="required: Please fill in the verification code on the right " v-model="yzm" /> <img src="/in/getImage"
alt="" width="100" height="32" class="passcode"
style="height:43px;cursor:pointer;" onclick="this.src=this.src+'?'">
src="/in/getImage"

Code means to request verification code through the path

οnclick="this.src=this.src+'?'"

This sentence The meaning of the code is to request to obtain the verification code again by clicking the event

Because this is a code fragment of a project, I attach the controller code that returns to login
@RequestMapping("login") public String login(Model model,HttpServletRequest
request){ return "/news/login"; }
Attached below Vue Code instance for

I also have parameters to pass here to judge whether the user name is successfully logged in
<script> var vm = new Vue({ el:"#app", data:{ uname:"", pwd:"", yzm:"" },
methods:{ login:function () {
$.post("/in/doLogin",{uname:this.uname,pwd:this.pwd,yzm:this.yzm},function
(data) { if (data.info==1){ alert(data.success);
window.location.href="/in/index"; } else { alert(data.success); } }); },//login
}, }); </script>
This should be the step to get the captcha code , meanwhile We should give it a value session
/** * Verification code generation * @param request * @param response * @throws IOException */
@RequestMapping("getImage") public void authImage(HttpServletRequest request,
HttpServletResponse response) throws IOException { response.setHeader("Pragma",
"No-cache"); response.setHeader("Cache-Control", "no-cache");
response.setDateHeader("Expires", 0); response.setContentType("image/jpeg"); //
Generating random strings String verifyCode = VerifyCodeUtils.generateVerifyCode(4); //
Save session session HttpSession session = request.getSession(true); // Delete previous
session.removeAttribute("verCode"); session.removeAttribute("codeTime");
session.setAttribute("verCode", verifyCode.toLowerCase());
session.setAttribute("codeTime", LocalDateTime.now()); // Generate pictures int w = 100, h =
30; OutputStream out = response.getOutputStream();
VerifyCodeUtils.outputImage(w, h, out, verifyCode); }
Here we click submit to judge whether the verification code and user name password are correct
@RequestMapping("doLogin") @ResponseBody public JSONObject
doLogin(HttpServletRequest request){ String uname =
request.getParameter("uname"); String pwd = request.getParameter("pwd"); String
yzm = request.getParameter("yzm").toLowerCase(); System.out.println(uname+"
"+pwd); User user = userService.findByUnameAndPwd(uname,pwd); HttpSession
session = request.getSession(); JSONObject data = new JSONObject();
System.out.println(session.getAttribute("verCode")); if
(!yzm.equals(session.getAttribute("verCode"))){ data.put("info","0");
data.put("success"," Verification code error "); }else if (user==null || user.equals("")){
data.put("success"," Wrong user name or password "); data.put("info","0"); }else {
session.setAttribute("uname",uname); data.put("success"," Login successful ");
data.put("info","1"); } return data; }
This is a small judgment of writing . For reference only !

At the end of the paper, I will give you a code of the tool class
package com.msfh.news.until; import java.awt.Color; import java.awt.Font;
import java.awt.Graphics; import java.awt.Graphics2D; import
java.awt.RenderingHints; import java.awt.geom.AffineTransform; import
java.awt.image.BufferedImage; import java.io.File; import
java.io.FileOutputStream; import java.io.IOException; import
java.io.OutputStream; import java.util.Arrays; import java.util.Random; import
javax.imageio.ImageIO; public class VerifyCodeUtils{
// Use to Algerian typeface , If not in the system, you need to install fonts , The font displays only uppercase , Removed 1,0,i,o A few confusing characters public static final
String VERIFY_CODES = "23456789ABCDEFGHJKLMNPQRSTUVWXYZ"; private static Random
random = new Random(); /** * Generating captcha using system default character source * @param verifySize Captcha length * @return
*/ public static String generateVerifyCode(int verifySize){ return
generateVerifyCode(verifySize, VERIFY_CODES); } /** * Generate captcha using specified source * @param
verifySize Captcha length * @param sources Captcha character source * @return */ public static String
generateVerifyCode(int verifySize, String sources){ if(sources == null ||
sources.length() == 0){ sources = VERIFY_CODES; } int codesLen =
sources.length(); Random rand = new Random(System.currentTimeMillis());
StringBuilder verifyCode = new StringBuilder(verifySize); for(int i = 0; i <
verifySize; i++){ verifyCode.append(sources.charAt(rand.nextInt(codesLen-1)));
} return verifyCode.toString(); } /** * Generate random captcha file , And return the verification code value * @param w * @param h
* @param outputFile * @param verifySize * @return * @throws IOException */
public static String outputVerifyImage(int w, int h, File outputFile, int
verifySize) throws IOException{ String verifyCode =
generateVerifyCode(verifySize); outputImage(w, h, outputFile, verifyCode);
return verifyCode; } /** * Output random captcha image stream , And return the verification code value * @param w * @param h * @param os
* @param verifySize * @return * @throws IOException */ public static String
outputVerifyImage(int w, int h, OutputStream os, int verifySize) throws
IOException{ String verifyCode = generateVerifyCode(verifySize); outputImage(w,
h, os, verifyCode); return verifyCode; } /** * Generate specified captcha image file * @param w * @param
h * @param outputFile * @param code * @throws IOException */ public static void
outputImage(int w, int h, File outputFile, String code) throws IOException{
if(outputFile == null){ return; } File dir = outputFile.getParentFile();
if(!dir.exists()){ dir.mkdirs(); } try{ outputFile.createNewFile();
FileOutputStream fos = new FileOutputStream(outputFile); outputImage(w, h, fos,
code); fos.close(); } catch(IOException e){ throw e; } } /** * Output specified captcha picture stream *
@param w * @param h * @param os * @param code * @throws IOException */ public
static void outputImage(int w, int h, OutputStream os, String code) throws
IOException{ int verifySize = code.length(); BufferedImage image = new
BufferedImage(w, h, BufferedImage.TYPE_INT_RGB); Random rand = new Random();
Graphics2D g2 = image.createGraphics();
g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);
Color[] colors = new Color[5]; Color[] colorSpaces = new Color[] { Color.WHITE,
Color.CYAN, Color.GRAY, Color.LIGHT_GRAY, Color.MAGENTA, Color.ORANGE,
Color.PINK, Color.YELLOW }; float[] fractions = new float[colors.length];
for(int i = 0; i < colors.length; i++){ colors[i] =
colorSpaces[rand.nextInt(colorSpaces.length)]; fractions[i] = rand.nextFloat();
} Arrays.sort(fractions); g2.setColor(Color.GRAY);// Set border color g2.fillRect(0, 0, w,
h); Color c = getRandColor(200, 250); g2.setColor(c);// Set background color g2.fillRect(0, 2,
w, h-4); // Draw interference line Random random = new Random(); g2.setColor(getRandColor(160,
200));// Sets the color of the line for (int i = 0; i < 20; i++) { int x = random.nextInt(w - 1);
int y = random.nextInt(h - 1); int xl = random.nextInt(6) + 1; int yl =
random.nextInt(12) + 1; g2.drawLine(x, y, x + xl + 40, y + yl + 20); } // add noise
float yawpRate = 0.05f;// Noise rate int area = (int) (yawpRate * w * h); for (int i =
0; i < area; i++) { int x = random.nextInt(w); int y = random.nextInt(h); int
rgb = getRandomIntColor(); image.setRGB(x, y, rgb); } shear(g2, w, h, c);//
Distort the picture g2.setColor(getRandColor(100, 160)); int fontSize = h-4; Font font = new
Font("Algerian", Font.ITALIC, fontSize); g2.setFont(font); char[] chars =
code.toCharArray(); for(int i = 0; i < verifySize; i++){ AffineTransform affine
= new AffineTransform(); affine.setToRotation(Math.PI / 4 * rand.nextDouble() *
(rand.nextBoolean() ? 1 : -1), (w / verifySize) * i + fontSize/2, h/2);
g2.setTransform(affine); g2.drawChars(chars, i, 1, ((w-10) / verifySize) * i +
5, h/2 + fontSize/2 - 10); } g2.dispose(); ImageIO.write(image, "jpg", os); }
private static Color getRandColor(int fc, int bc) { 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); } private static int getRandomIntColor() { int[] rgb =
getRandomRgb(); int color = 0; for (int c : rgb) { color = color << 8; color =
color | c; } return color; } private static int[] getRandomRgb() { int[] rgb =
new int[3]; for (int i = 0; i < 3; i++) { rgb[i] = random.nextInt(255); }
return rgb; } private static void shear(Graphics g, int w1, int h1, Color
color) { shearX(g, w1, h1, color); shearY(g, w1, h1, color); } private static
void shearX(Graphics g, int w1, int h1, Color color) { int period =
random.nextInt(2); boolean borderGap = true; int frames = 1; int phase =
random.nextInt(2); for (int i = 0; i < h1; i++) { double d = (double) (period
>> 1) * Math.sin((double) i / (double) period + (6.2831853071795862D * (double)
phase) / (double) frames); g.copyArea(0, i, w1, 1, (int) d, 0); if (borderGap)
{ g.setColor(color); g.drawLine((int) d, i, 0, i); g.drawLine((int) d + w1, i,
w1, i); } } } private static void shearY(Graphics g, int w1, int h1, Color
color) { int period = random.nextInt(40) + 10; // 50; boolean borderGap = true;
int frames = 20; int phase = 7; for (int i = 0; i < w1; i++) { double d =
(double) (period >> 1) * Math.sin((double) i / (double) period +
(6.2831853071795862D * (double) phase) / (double) frames); g.copyArea(i, 0, 1,
h1, 0, (int) d); if (borderGap) { g.setColor(color); g.drawLine(i, (int) d, i,
0); g.drawLine(i, (int) d + h1, i, h1); } } } }
 

Technology