滑块验证码(java版)

下图为京东验证码:

和其他验证码一样,图片分为两部分,一部分为缺口,一部分为背景,将缺口移动到背景上对应部分即可。

我们首先来获取图片:

请求并不复杂,appid可请求首页取到或直接写死,校验得e并不影响登录及图片校验,可随机生成或直接写死。

我们再来看看返回值:

很明显,bg和patch分别对应滑块和背景图片:

可以看到滑块为png格式,但是图片大小仅仅只有滑块那么大,也就是说返回值里面肯定有来确定滑块Y轴方向的参数。

也就是y:37这个参数估计是表示滑块Y轴的位置。

我们可以用ps打开背景图片定位一下y=37的位置,发现正好是滑块的顶部。

所以这里我们只需对图片二值化后,定位小图在大图中的三个角坐标值都是黑色即可找出阴影x的位置了:

接下来我们看看滑动后的请求:

参数也不复杂,c和s可以请求首页取到,关键就剩下一个d,明显是加密过的,而且绝对是和轨迹相关。

那我们就追溯一下这个d:

这样就找到了轨迹加密方法了,我们可以看到传入是一个array,返回则是加密后的字符串。

现在就只需构造轨迹array即可。

我们先看看array是长什么样子的:

一看结构,肯定就是x,y坐标+当前时间戳组成。

多试几次就能发现,第一行是表示验证码在当前窗口的位置。

所以我们只需要模拟第一行之后的即可。

生成轨迹的方法网上也有很多了,这里随便写一个:

加密方法解决还是参考之前提到过的,直接调用js的方法,然后将我们构造的轨迹数组传入,即可得到参数d了。

这样就可得到验证成功返回值了:

jsonp_012041562394977534({"message":"success","nextVerify":"NULL_VERIFY","success":"1","validate":"d0ca79997123423886a84852f5837f44"})

本文参考:https://blog.csdn.net/qq_21189053/article/details/84775194 

非常感谢该作者

Java滑块验证码可以通过以下步骤实现: 1. 创建一个JPanel作为验证码的容器,设置布局为BorderLayout。 2. 在JPanel的中央区域添加一个JPanel,作为滑块验证码的背景区域,设置布局为FlowLayout。 3. 在背景区域添加一个JLabel,用于显示验证码的文字。 4. 在背景区域添加一个JPanel,作为滑块区域,设置布局为FlowLayout。 5. 在滑块区域添加一个JLabel,用于显示滑块图片。 6. 在滑块区域添加一个JPanel,作为滑块拖动区域,设置布局为FlowLayout。 7. 在滑块拖动区域添加一个JLabel,用于显示滑块拖动图片。 8. 在滑块区域添加鼠标监听器,实现滑块的拖动。 9. 在JPanel中添加一个按钮,用于重置验证码。 10. 将验证码的字符串和拖动距离等信息保存到Session中,方便后续验证。 示例代码如下: ```java import java.awt.*; import java.awt.event.*; import javax.swing.*; public class SliderCaptcha extends JPanel { private String captchaText; private int dragDistance; public SliderCaptcha() { setLayout(new BorderLayout()); // 创建背景区域 JPanel backgroundPanel = new JPanel(new FlowLayout()); add(backgroundPanel, BorderLayout.CENTER); // 创建验证码文字 captchaText = "ABCD"; JLabel captchaLabel = new JLabel(captchaText); captchaLabel.setFont(new Font("Arial", Font.BOLD, 24)); backgroundPanel.add(captchaLabel); // 创建滑块区域 JPanel sliderPanel = new JPanel(new FlowLayout()); backgroundPanel.add(sliderPanel); // 创建滑块图片 ImageIcon sliderIcon = new ImageIcon("slider.png"); JLabel sliderLabel = new JLabel(sliderIcon); sliderPanel.add(sliderLabel); // 创建滑块拖动区域 JPanel dragPanel = new JPanel(new FlowLayout()); dragPanel.setPreferredSize(new Dimension(sliderIcon.getIconWidth(), sliderIcon.getIconHeight())); sliderPanel.add(dragPanel); // 创建滑块拖动图片 ImageIcon dragIcon = new ImageIcon("drag.png"); JLabel dragLabel = new JLabel(dragIcon); dragPanel.add(dragLabel); // 添加鼠标监听器,实现滑块的拖动 sliderPanel.addMouseListener(new MouseAdapter() { private Point dragStartPoint; public void mousePressed(MouseEvent e) { dragStartPoint = e.getPoint(); } public void mouseReleased(MouseEvent e) { int x = e.getX() + sliderPanel.getX() - dragStartPoint.x; if (x > dragDistance) { JOptionPane.showMessageDialog(null, "验证成功!"); } else { JOptionPane.showMessageDialog(null, "验证失败,请重试!"); } } }); // 创建重置按钮 JButton resetButton = new JButton("重置"); resetButton.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { captchaText = "ABCD"; dragDistance = (int) (Math.random() * 100 + 50); dragLabel.setLocation(dragDistance, dragLabel.getY()); } }); add(resetButton, BorderLayout.SOUTH); // 初始化滑块拖动距离 dragDistance = (int) (Math.random() * 100 + 50); dragLabel.setLocation(dragDistance, dragLabel.getY()); } public static void main(String[] args) { JFrame frame = new JFrame("滑块验证码"); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setSize(400, 200); frame.setLocationRelativeTo(null); frame.setContentPane(new SliderCaptcha()); frame.setVisible(true); } } ```
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值