后台生成验证码 前台img点击onclick事件 路径后加随机数 get请求

<img onclick="changeCode(this)" id="codeJPG" alt="" src="/code/image" style="cursor:pointer;">
function changeCode(obj) {
    obj.src = "/code/image?" + Math.random();
}

路径后面一定要加随机数,get请求时,会缓存请求。当下一次请求的地址和请求参数不变时,浏览器会使用缓存,而不触发请求。所以要在地址后面加一个动态改变的内容,每点击一次,就请求一次。
后台代码:
@RestController

public class ValidateCodeController {
    public static final String SESSION_KEY = "SESSION_KEY_IMAGE_CODE";
    /**
     * 引入 session
     */
    private SessionStrategy sessionStrategy = new HttpSessionSessionStrategy();

    @Resource
    private ValidateCodeGenerator imageCodeGenerator;
    @GetMapping("/code/image")
    public void createCode(HttpServletRequest request, HttpServletResponse response) throws IOException {
        ImageCode imageCode = imageCodeGenerator.createCode(new ServletWebRequest(request));
        //将随机数 放到Session中
        sessionStrategy.setAttribute(new ServletWebRequest(request),SESSION_KEY,imageCode);
        //写给response 响应
        ImageIO.write(imageCode.getImage(),"JPEG",response.getOutputStream());
    }
    }
public interface ValidateCodeGenerator {
    /**
     * 创建验证码
     */
    ImageCode  createCode(ServletWebRequest request);
   }
public class ImageCodeGenerator implements ValidateCodeGenerator{

    private static Logger LOG = LoggerFactory.getLogger(ImageCodeGenerator.class);

    @Resource
    private JavaMailSender mailSender;

    /**
     * 引入 Security 配置属性类
     */
    private SecurityProperties securityProperties;

    private static final String[] VALIDATECODECHAR = {"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","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","1","2","3","4","5","6","7","8","9","0"};

    @Override
    public ImageCode createCode(ServletWebRequest request) {
        //如果请求中有 width 参数,则用请求中的,否则用 配置属性中的
        int width = ServletRequestUtils.getIntParameter(request.getRequest(),"width",securityProperties.getCode().getImage().getWidth());
        //高度(宽度)
        int height = ServletRequestUtils.getIntParameter(request.getRequest(),"height",securityProperties.getCode().getImage().getHeight());
        //图片验证码字符个数
        int length = securityProperties.getCode().getImage().getLength();
        //过期时间
        int expireIn = securityProperties.getCode().getImage().getExpireIn();

        BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);

        Graphics g = image.getGraphics();

        Random random = new Random();

        g.setColor(new Color(232, 245, 243));
        g.fillRect(0, 0, width, height);
        g.setFont(new Font("微软雅黑", Font.BOLD, 23));
        g.setColor(new Color(232, 245, 243));
        String sRand = "";
        int condeLength = VALIDATECODECHAR.length;
        for (int i = 0; i < length; i++) {
            int j = (int) Math.floor(Math.random() * condeLength);
            sRand += VALIDATECODECHAR[j];
            g.setColor(getRandColor());
            int x = 10 + i * 20;//文字在canvas上的x坐标
            int y = (int) (20 + Math.random() * 8);//文字在canvas上的y坐标
            g.drawString(VALIDATECODECHAR[j], x, y);
        }

        for (int i = 0; i <= length + 1; i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int xl = (int) (Math.random() * height);
            int yl = (int) (Math.random() * width);
            g.setColor(getRandColor());
            g.drawLine(x, y, x + yl, y + xl);
        }

        for (int i = 0; i <= 30; i++) {
            int x = random.nextInt(width);
            int y = random.nextInt(height);
            int xl = (int) (Math.random() * height);
            int yl = (int) (Math.random() * width);
            g.setColor(getRandColor());
            g.drawLine(x, y, x + 1, y + 1);
        }

        g.dispose();

        return new ImageCode(image, sRand, expireIn);
    }

    /**
     * 生成随机背景条纹
     */
    private Color getRandColor() {
        int r = (int) Math.floor(Math.random() * 256);
        int g = (int) Math.floor(Math.random() * 256);
        int b = (int) Math.floor(Math.random() * 256);
        return new Color(r, g, b);
    }

    public SecurityProperties getSecurityProperties() {
        return securityProperties;
    }

    public void setSecurityProperties(SecurityProperties securityProperties) {
        this.securityProperties = securityProperties;
    }
    }
@Configuration
public class ValidateCodeBeanConfig {

    @Autowired
    private SecurityProperties securityProperties;

    @Bean
    @ConditionalOnMissingBean(name = "imageCodeGenerator")
    /**
     *
     *
     *
     * 在触发 ValidateCodeGenerator 之前会检测有没有imageCodeGenerator这个bean。
     */
    public ValidateCodeGenerator imageCodeGenerator(){
        ImageCodeGenerator codeGenerator = new ImageCodeGenerator();
        codeGenerator.setSecurityProperties(securityProperties);
        return codeGenerator;
    }

}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值