java登录验证码 用到spring框架

SpringBoot 集成 Spring Security(8)——短信验证码登录 经过前面七章的学习,我们已经算入门 Spring Security 了,下面我们学习如何对 Spring Security 进行扩展,来实现短信验证码方式登录。 注意: 为了方便讲解,本篇文章代码直接在 《SpringBoot集成Spring Security(1)——入门程序》 上进行开发。 并且为了省去与本篇主题无关的代码,短信验证码只是一个模拟。如果你需要具体的实际例子,在下面的源码中除了包... 阅读详情

 

1.前端代码

<span id="s1" class="errorinfo">${errorMessage}</span>
<span id="s1" class="errorinfo">${successMessage}</span>
<form " action="login.do" name="yzm" method="post" >
		<label >验证码:</label>
					<input type="text"   placeholder="请输入验证码" />					
						<img src="imgcode"   onclick="changeCode()" />	
					<input type="submit" name="" id="" value="登 录"  />					
	
		</form>

2.验证码控制器代码

 

package controller;

import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.util.Random;

import javax.imageio.ImageIO;
import javax.servlet.ServletOutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

@Controller
public class ImgCodeController {

	private static int WIDTH = 65;// 设置图片的宽度

	private static int HEIGHT = 22;// 设置图片的高度

	@RequestMapping("/imgcode")
	public void getimgcode(HttpServletRequest request,
			HttpServletResponse response) throws IOException {

		HttpSession session = request.getSession();
		session.removeAttribute("code");
		response.setContentType("image/jpeg");
		ServletOutputStream sos = response.getOutputStream();

		response.setHeader("Pragma", "No-cache");
		response.setHeader("Cache-Control", "no-cache");
		response.setDateHeader("Expires", 0);

		BufferedImage image = new BufferedImage(WIDTH, HEIGHT,
				BufferedImage.TYPE_INT_RGB);
		Graphics g = image.getGraphics();

		char[] rands = generateCheckCode();
		drawBackground(g);
		drawRands(g, rands);
		g.dispose();

		ByteArrayOutputStream bos = new ByteArrayOutputStream();
		ImageIO.write(image, "JPEG", bos);
		byte[] buf = bos.toByteArray();
		response.setContentLength(buf.length);
		sos.write(buf);
		bos.close();
		sos.close();
		session.setAttribute("code", new String(rands));
	}

	private void drawBackground(Graphics g) {
		g.setColor(new Color(0xDCDCDC));
		g.fillRect(0, 0, WIDTH, HEIGHT);
		for (int i = 0; i < 120; i++) {
			int x = (int) (Math.random() * WIDTH);
			int y = (int) (Math.random() * HEIGHT);
			int red = (int) (Math.random() * 255);
			int green = (int) (Math.random() * 255);
			int blue = (int) (Math.random() * 255);
			g.setColor(new Color(red, green, blue));
			g.drawOval(x, y, 1, 0);
		}
	}

	private void drawRands(Graphics g, char[] rands) {
		// g.setColor(Color.BLUE);
		Random random = new Random();
		int red = random.nextInt(110);
		int green = random.nextInt(50);
		int blue = random.nextInt(50);
		g.setColor(new Color(red, green, blue));
		g.setFont(new Font(null, Font.ITALIC | Font.BOLD, 18));
		g.drawString("" + rands[0], 1, 17);
		g.drawString("" + rands[1], 16, 15);
		g.drawString("" + rands[2], 31, 18);
		g.drawString("" + rands[3], 46, 16);
	}

	private char[] generateCheckCode() {
		String chars = "0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz";
		char[] rands = new char[4];
		for (int i = 0; i < 4; i++) {
			int rand = (int) (Math.random() * 62);
			rands[i] = chars.charAt(rand);
		}
		return rands;
	}

}

3.验证控制器代码

 

 
 package controller; 
 import org.springframework.stereotype.Controller;
 import org.springframework.web.bind.annotation.RequestMapping;
import javax.servlet.http.HttpServletRequest;

@Controller
public class LoginController {
@RequestMapping(value="login.do")
 public String loginq(HttpServletRequest request, String yzm) {

// 获取验证码
String code = (String) request.getSession().getAttribute("code");
if (!code.equalsIgnoreCase(yzm.toLowerCase())) {	
request.setAttribute("errorMessage", "验证码错误!");
return "/index";
}else{
request.setAttribute("successMessage", "正确");
return "/index";
}
}
}

 

实现效果图:

 

附件:(下面代码也能实现,显示的验证码形式不同,上面是点阵,下面是线)

VerifyCodeServlet.java类:

package com.spring.controller;
import java.awt.Color;         
import java.awt.Font;         
import java.awt.Graphics2D;         
import java.awt.image.BufferedImage;         
import java.util.Random;         
import javax.imageio.ImageIO;         
import javax.servlet.ServletException;         
import javax.servlet.ServletOutputStream;         
import javax.servlet.http.HttpServlet;         
import javax.servlet.http.HttpServletRequest;         
import javax.servlet.http.HttpServletResponse;         
import javax.servlet.http.HttpSession;  
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class VerifyCodeServlet extends HttpServlet {
  // 验证码图片的宽度。         
    private int width = 60;         
    // 验证码图片的高度。         
    private int height = 20;         
    // 验证码字符个数         
    private int codeCount = 4;         
    private int x = 0;         
    // 字体高度         
    private int fontHeight;         
    private int codeY;         
    char[] codeSequence = { 'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J',         
            'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W',         
            'X', 'Y', 'Z', '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };         
    /**       
     * 初始化验证图片属性       
     */        
    public void initxuan() throws ServletException {         
        // 从web.xml中获取初始信息         
        // 宽度         
        String strWidth ="80";         
        // 高度         
        String strHeight ="30";         
        // 字符个数         
        String strCodeCount = "4";         
        // 将配置的信息转换成数值         
        try {         
            if (strWidth != null && strWidth.length() != 0) {         
                width = Integer.parseInt(strWidth);         
            }         
            if (strHeight != null && strHeight.length() != 0) {         
                height = Integer.parseInt(strHeight);         
            }         
            if (strCodeCount != null && strCodeCount.length() != 0) {         
                codeCount = Integer.parseInt(strCodeCount);         
            }         
        } catch (NumberFormatException e) {         
        }         
        x = width / (codeCount + 1);         
        fontHeight = height - 2;         
        codeY = height - 4;         
    }   
    @RequestMapping(value="xuan/verifyCode",method=RequestMethod.GET)
    public void service(HttpServletRequest req, HttpServletResponse resp)         
            throws ServletException, java.io.IOException { 
        initxuan();
        // 定义图像buffer         
        BufferedImage buffImg = new BufferedImage(width, height,         
                BufferedImage.TYPE_INT_RGB);         
        Graphics2D g = buffImg.createGraphics();         
        // 创建一个随机数生成器类         
        Random random = new Random();         
        // 将图像填充为白色         
        g.setColor(Color.WHITE);         
        g.fillRect(0, 0, width, height);         
        // 创建字体,字体的大小应该根据图片的高度来定。         
        Font font = new Font("Fixedsys", Font.PLAIN, fontHeight);         
        // 设置字体。         
        g.setFont(font);         
        // 画边框。         
        g.setColor(Color.BLACK);         
        g.drawRect(0, 0, width - 1, height - 1);         
        // 随机产生160条干扰线,使图象中的认证码不易被其它程序探测到。         
        g.setColor(Color.BLACK);         
        for (int i = 0; i < 10; i++) {         
            int x = random.nextInt(width);         
            int y = random.nextInt(height);         
            int xl = random.nextInt(12);         
            int yl = random.nextInt(12);         
            g.drawLine(x, y, x + xl, y + yl);         
        }         
        // randomCode用于保存随机产生的验证码,以便用户登录后进行验证。         
        StringBuffer randomCode = new StringBuffer();         
        int red = 0, green = 0, blue = 0;         
        // 随机产生codeCount数字的验证码。         
        for (int i = 0; i < codeCount; i++) {         
            // 得到随机产生的验证码数字。         
            String strRand = String.valueOf(codeSequence[random.nextInt(36)]);         
            // 产生随机的颜色分量来构造颜色值,这样输出的每位数字的颜色值都将不同。         
            red = random.nextInt(255);         
            green = random.nextInt(255);         
            blue = random.nextInt(255);         
            // 用随机产生的颜色将验证码绘制到图像中。         
            g.setColor(new Color(red, green, blue));         
            g.drawString(strRand, (i + 1) * x, codeY);         
            // 将产生的四个随机数组合在一起。         
            randomCode.append(strRand);         
        }         
        // 将四位数字的验证码保存到Session中。         
        HttpSession session = req.getSession();         
        session.setAttribute("validateCode", randomCode.toString());         
        // 禁止图像缓存。         
        resp.setHeader("Pragma", "no-cache");         
        resp.setHeader("Cache-Control", "no-cache");         
        resp.setDateHeader("Expires", 0);         
        resp.setContentType("image/jpeg");         
        // 将图像输出到Servlet输出流中。         
        ServletOutputStream sos = resp.getOutputStream();         
        ImageIO.write(buffImg, "jpeg", sos);         
        sos.close();         
    }         
}

 

 

ResultServlet.java:

 

package com.spring.controller;
import java.io.IOException;         
import java.io.PrintWriter;         
import javax.servlet.ServletException;                
import javax.servlet.http.HttpServletRequest;         
import javax.servlet.http.HttpServletResponse;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class ResultServlet {
     @RequestMapping(value="resultServlet/validateCode",method=RequestMethod.POST)
     public void doPost(HttpServletRequest request, HttpServletResponse response)         
             throws ServletException, IOException {         
         response.setContentType("text/html;charset=utf-8");         
         String validateC = (String) request.getSession().getAttribute("validateCode");         
         String veryCode = request.getParameter("c");         
         PrintWriter out = response.getWriter();         
         if(veryCode==null||"".equals(veryCode)){         
             out.println("验证码为空");         
         }else{         
             if(validateC.equals(veryCode)){         
                 out.println("验证码正确");         
             }else{         
                 out.println("验证码错误");         
             }         
         }         
         out.flush();         
         out.close();         
     }         
}

jsp页面:

<%@ page language="java" contentType="text/html; charset=UTF-8"       
    pageEncoding="UTF-8"%>       
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">       
<html>       
    <head>       
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>test verify code</title>  
    </head>  
    <body>       
        <input id="veryCode" name="veryCode" type="text"/>       
        <img id="imgObj"  alt="" src="xuan/verifyCode"/>       
        <a href="#" onclick="changeImg()">换一张</a>       
        <input type="button" value="验证" onclick="isRightCode()"/>       
        <div id="info"></div>       
    </body>       
</html>
<script type="text/javascript">
 function changeImg(){     
    var imgSrc = $("#imgObj");     
    var src = imgSrc.attr("src");     
    imgSrc.attr("src",chgUrl(src));     
}     
//时间戳     
//为了使每次生成图片不一致,即不让浏览器读缓存,所以需要加上时间戳     
function chgUrl(url){     
    var timestamp = (new Date()).valueOf();     
    urlurl = url.substring(0,17);     
    if((url.indexOf("&")>=0)){     
        urlurl = url + "×tamp=" + timestamp;     
    }else{     
        urlurl = url + "?timestamp=" + timestamp;     
    }     
    return url;     
}     
function isRightCode(){     
    var code = $("#veryCode").attr("value");     
    code = "c=" + code;     
    $.ajax({     
        type:"POST",     
        url:"resultServlet/validateCode",     
        data:code,     
        success:callback     
    });     
}     
function callback(data){     
    $("#info").html(data);     
}  
</script>  

效果图:

 

 

 

Java实现手机验证码登录和SpringSecurity权限控制 Spring Security是 Spring提供的安全认证服务的框架。使用Spring Security可以帮助我们来简化认证和授权的过程。官网:https://spring.io/projects/spring-security。 阅读详情

相关推荐

spring security 一个验证码登录例子

看完shiro,在看spring security感觉快了很多,最开始看spring security的时候,非常晕,看完我觉得spring security做了太多事,以至于程序员都不知道,是怎么实现的,这样的 后果就是 当出现错误,或者需要修改的时候感觉无从下手。 个人理解,若有错误,请指正。 spring security跟shiro类似,都是使用过滤器来认证和授权,不同的

ry的专栏 2万+

一个开源好用的java验证码框架

提供的验证码工具是一个轻量级的 Java 库,常用于生成图形验证码。这个库基于 Kaptcha 开发,旨在为开发者提供更加简便、灵活的验证码生成与集成方法,主要用于 Java Web 应用中。

qyhua的专栏 2856

MATLAB新手也能懂:用MATPOWER 8.0b搞定电力系统潮流计算(附case9实战代码)

本文详细介绍了如何使用MATPOWER 8.0b在MATLAB中进行电力系统潮流计算,特别适合新手入门。通过case9实战案例,讲解了从安装配置到运行牛顿-拉夫逊法潮流计算的全过程,包括结果分析和常见问题处理,帮助读者快速掌握这一电力系统分析的核心技能。

weixin_26757925的博客 379

java登录验证码(框架版)

java后台做的验证码图片,算是比较方便的一种了,今天正好在新搭的框架里写了,使用的非常完美,哈哈,话不多说,开始上代码

dfBeautifulLive的博客 5946

Linux8.3上装Oracle 19c RAC,ssh互信总报INS-06006?别急着下补丁,试试这个临时替换scp的骚操作

本文针对在Linux 8.3上安装Oracle 19c RAC时遇到的SSH互信报错INS-06006问题,提供了一个无需官方补丁的临时解决方案。通过创建SCP包装脚本并添加-T参数,有效解决了OpenSSH 8.x版本与Oracle安装程序的兼容性问题,帮助用户顺利完成安装流程。

weixin_30764883的博客 401

SAP交货单过账避坑指南:序列号处理、Buffer清理与BAPI提交回滚的那些事儿

本文深入解析SAP交货单过账中的序列号处理、Buffer清理与BAPI提交回滚等关键问题,提供WS_DELIVERY_UPDATE和BAPI_OUTB_DELIVERY_CONFIRM_DEC的实战优化方案。通过详细的技术分析和最佳实践,帮助开发者避免常见陷阱,提升交货单处理的稳定性和效率。

weixin_31155097的博客 431

Java实现验证码功能

验证码一般用于登陆界面的防机器验证,但自已写一个验证码组件较为麻烦,我们可以用ValidateCode组件来实现,以下通过两个示例来演示ValidateCode的用法,最后附jar包,可自行下载。生成验证码,调用该方法可以重新生成验证码,实例化对象时会自动调用该方法生成一个默认的验证码,后续可再次调用生成。实例化对象,指定宽度和高度,默认验证码位数为5为位,障碍线为150;实例化对象,指定宽度、高度、验证码位数、障碍线数量;将生成的验证码图像写入输出流对象,可用于web端。

2301_77042303的博客 5537

VMware 15 虚拟机安装Ubuntu 18.04

这几年在自动化、计算机之间游来游去,最近又要做机器学习相关的课题,14年做的虚拟机实在不堪重用了,OK,我们重新开始。 VMware的安装就不再赘述了,目前最新版本是15.0.2,官方下载地址: https://my.vmware.com/en/web/vmware/info/slug/desktop_end_user_computing/vmware_workstation_pro/15_0...

略懂 2万+

一文搞定验证码(上部分)

tianai-captcha 验证码整体分为 生成器(ImageCaptchaGenerator)、校验器(ImageCaptchaValidator)、资源管理器(ImageCaptchaResourceManager) 其中生成器、校验器、资源管理器等都是基于接口模式实现 可插拔的,可以替换为自定义实现,灵活度高。这个方法是初始化资源的地方.初始化一些 系统的图片模板,系统的资源文件等。这就是验证码的重点方法之一.此方法里面有详细生成验证码的过程

longtime的博客 3448

Android-S无线模块前瞻

WiFi - mainlane非强制 S 采用反射的方法直接加载wifiservice,直接hook在systemserver上,无编译依赖。gms可以动态替换wifi服务。 R 采用直接启动service的方式,wifiservice仍然map在systemserver上。 WiFi - 11ad接口支持 11ad被wifi联盟商业化为WIGIG,提供短距的60GHZ载波,理论速度为当前5G 11ac的6倍。市面上基本没有手机支持,需要独立的芯片支撑此功能。 传输距离为3m以内,外界d.

头铁的伦的博客 1042

BCM-BCP-DRP-运维管理之故障管理——故障的分类与处理流程

ITSM Business Continuity Manage(BCM) BusinessContinuityPlan(BCP) 偏业务 DisasterRecoveryPlan(DRP) 偏IT 天塌了,考虑在天塌了的状态下做什么,怎么开展业务就是BCP; 天塌了,考虑怎么把天撑回去,就是DRP。 DRP+BCP+供应链管理+危机管理等就是BCM (业务连续性管...

mmgithub123的博客 2720

Java应用开发必备:使用 easy-captcha 组件生成验证码的详细介绍

最近系统开发在优化验证码的相关功能,第一反应就是有没有开源的第三方组件可以使用呢。在一番寻觅以后,还真发现一个好用的第三方验证码组件。是一个开源的Java库,用于生成和验证验证码,它的API上手难度低,可以生成包含数字字母中文和数字运算验证码,还有会动的GIF格式验证码哦,此外还允许开发者针对长度字符集字体颜色样式等方面进行自定义,可以满足大部分复杂场景。// 指定宽度为200,高度为100,验证码字符为5个。

Coder-文小白的博客 7154

恒玄BES调试笔记-BES2500如何打开COMPEXP

打开Compressor and expander会占用资源,这个根据个人项目需求而定吧!打开方法,以及参数修改如下: config\best2300a_ibrt_anc\target.mk SPEECH_RX_COMPEXP ?= 1 apps\audioplayers\bt_sco_chain_cfg_default.c #if defined(SPEECH_RX_COMPEXP) /*****************************************************

leezs的博客 705

spring boot实现验证码登录

内容比较简单,需要完整项目的朋友留下邮箱,给你们发。 直接看效果: 下面是实现步骤 1.验证码生成工具类(引用自网络) package com.laoxu.test.helloweb.util; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import j...

老徐的博客只有干货 2063

SAP Parallel Accounting(平行分类账业务)配置及操作手册(超详细的说明和测试)

非常详细的介绍了SAP 的平行分类账配置以及测试效果哦

nopicture的博客 4341

文档:亲测可用解决vnc灰屏,黑屏,鼠标大黑叉情况

主要解决vnc-viewer灰屏,黑屏,鼠标大黑叉等现象,详细见文档。

若依RuoYi整合短信验证码登录

背景:若依默认使用账号密码进行登录,但是咱们客户需要增加一个短信登录功能,即在不更改原有账号密码登录的基础上,整合短信验证码登录。

踮脚敲代码 1万+

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

spring boot3登录开发-图形验证码接口实现

上文我们已经整合好了jwt,本文我们开始实现图形验证码接口的实现。通过糊涂工具包的图形验证码工具完成获取验证码接口通过redis缓存key(验证码id)-value(验证码内容)

蒾酒的博客 7181

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

spring boot3登录开发-图形验证码账密登录逻辑实现

上文我们已经实现了图形验证码接口,本文我们实现登录逻辑通过用户登录DTO(数据传输对象)接收用户登录填写信息通过注解@NotNull、@Valid进行参数非空校验通过redis缓存的验证码信息与用户提交的比对验证通过全局异常处理处理参数为空、用户不存在、密码错误、验证码错误、用户被封禁等业务异常说白了就是登录代码可能会判断账号是否存在密码是否正确,当账号不存在或密码错误需要返回对应提示信息,这种类似情况多了你的代码就会很多if-return,代码就会很难看;那么通过自定义异常。

蒾酒的博客 7851

Spring Security实现短信登录

文章目录一、理论说明1.1 用户名密码登录逻辑1.2 短信验证码登录逻辑二、代码实战2.1 SmsAuthenticationToken2.2 SmsAuthenticationFilter2.3 SmsAuthenticationProviderhardcode的方式来模拟手机号查询用户信息2.4 成功与失败处理逻辑2.5 SmsCodeAuthenticationSecurityConfig将...

weixin_38927257的博客 3228

java实现验证码登录

一,场景:用户登录时需要输入验证码登录,如何实现用户通过验证码登录 二,实现逻辑 1,进入登录页面时,调用生成验证码接口,入参:当前时间戳(前端传入) 2,后台调用生成验证码接口,生成验证码,并以入参时间戳为 key,验证码为value,保存在redis,并设置有效时间为1分钟,超时需要重新输入 3,用户输入验证码,调用后台登录接口,入参:用户名,密码,验证码,key 4,登录时校验,比...

C18298182575的博客 5760

Java实现用户短信验证码登录

Java实现用户短信验证码登录

weixin_45314044的博客 3862

在 Spring Security 中定义多种登录方式,比如邮箱、手机验证码登录

自定义认证方式总体来说还是很简单的;需要从头重写的也就三个类,然后就是将其配置到Spring Security 中。如果需要再自定义手机号验证码登录,按照上述流程再走一遍就行。其实也是 copy 一份,然后进行小幅度的修改即可。

xxxzzzqqq_的博客 4316

spring security 实现短信登录---若依RuoYi整合短信验证码登录

仿照 UsernamePasswordAuthenticationToken 类,编写短信登录 token 验证。我们自己构造的这个SmsCodeAuthenticationToken 里面不需要传递密码,因为短信登录不需要注意看里面的两个构造函数,有鉴权 就是通过了验证,一般在jwt过滤器中使用有鉴权的这个构造器,第一次登录的时候调用的是没有鉴权的(一般就是已经登陆过了,发送请求的时候从解析出token的userid 去redis中取得认证信息)/*** 自定义短信登录token验证。

2201_75600005的博客 3677

Hutool图形验证码的使用——Spring和Vue前后端交互实现验证码登录

图形验证码在阻止恶意程序进行大量非法操作有着较为广泛的应用,同时,作为一种全自动的图灵测试,图形验证码确保只有人类才能完成指定任务,从而区分合法用户和机器模拟的请求。那么,如何在自己的项目中实现一个图形验证码呢?如何利用前后端的交互实现一个需要图形验证码的场景呢?下面,我将利用Hutool工具来实现登录过程中的图形验证码场景。Hutool官方文档。

记录了个人在学习生活中的所思所想,在反思自己的同时希望也能够帮到你 5881

【Spring Security系列】如何用Spring Security集成手机验证码登录?五分钟搞定!

在当今的互联网应用中,手机验证码登录已经成为一种常见的用户身份验证方式。相比传统的用户名密码登录方式,手机验证码具有使用方便、安全性较高的特点。对于开发者来说,如何在现有的系统中快速集成这一功能,尤其是在Spring Security框架下,可能是一个具有挑战性的任务。这篇文章将详细介绍如何利用Spring Security来实现手机验证码的注册和登录功能,帮助你在短时间内搞定这一需求。

2301_78976656的博客 1622

spring security 登录验证码

验证码网上有,可以参考下 先实现获取验证码 @GetMapping(value = "/verify-code") public String verityCode(HttpServletResponse response, HttpSession session) { Captcha captcha = new Captcha(); Buff...

征途人生&梦 916
上一篇: <context:component-scan>扫描@Component @Controller@Service注解的的类 <mvc:annotation-driven />启用注解
下一篇: getSession().getParameter();getSession( ).getAttribute;getSession().removeAttribute()讲解
前端蜗牛君
博客等级 码龄10年 274粉丝 158原创
评论 6
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值