You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Laravel如何防止刷新页面触发短信发送功能?

解决Laravel刷新页面重复发送短信的问题

这个问题其实挺常见的——现在你的index方法是通过GET请求访问的,刷新浏览器时会重复发送相同的GET请求,自然就会重复触发短信发送逻辑。给你两种靠谱的解决方案,按需选择:

方案一:使用PRG模式(推荐)

PRG(Post/Redirect/Get)是Web开发里解决重复提交问题的标准方案,核心思路是:用POST请求处理短信发送逻辑,处理完成后重定向到GET页面,这样刷新时只会请求展示页面,不会重复执行发送操作。

步骤1:修改路由

把原来的GET路由拆分成POST处理路由和GET展示路由:

// 处理短信发送的POST路由
Route::post('/send-sms', [YourController::class, 'sendSms'])->name('send.sms');
// 展示欢迎页面的GET路由
Route::get('/welcome', [YourController::class, 'showWelcome'])->name('welcome');

步骤2:拆分控制器方法

把原来的index方法拆成处理发送和展示页面两个部分:

use Illuminate\Http\Request;

public function sendSms(Request $request) {
    // 获取用户信息(这里假设用户已登录,根据你的实际业务调整)
    $user = auth()->user();
    $phoneNumber = $user['mobile_phone'];
    $smsMessage = $user['smsMessage'];
    
    // 执行短信发送
    SendTextMessage::SendMessage($phoneNumber, $smsMessage);
    
    // 可选:添加发送成功的提示信息
    session()->flash('success', '短信已成功发送至你的手机!');
    
    // 重定向到欢迎页面
    return redirect()->route('welcome');
}

public function showWelcome() {
    // 直接返回欢迎视图
    return view('welcome');
}

步骤3:前端触发POST请求

在页面里用表单或者AJAX触发发送请求,比如用表单:

<form method="POST" action="{{ route('send.sms') }}">
    @csrf <!-- Laravel的CSRF令牌,必须加 -->
    <button type="submit">发送验证短信</button>
</form>

方案二:Session标记法(适合必须用GET的场景)

如果业务上必须用GET请求访问这个页面,可以通过Session记录短信是否已经发送过,刷新时检查标记跳过发送逻辑:

public function index() {
    $user = auth()->user();
    $phoneNumber = $user['mobile_phone'];
    $smsMessage = $user['smsMessage'];
    
    // 生成唯一的Session键,比如结合用户ID避免不同用户互相影响
    $smsSentKey = 'sms_sent_' . $user->id;
    
    // 检查Session中是否存在已发送的标记
    if (!session()->has($smsSentKey)) {
        // 执行短信发送
        SendTextMessage::SendMessage($phoneNumber, $smsMessage);
        // 设置Session标记,5分钟后自动过期(避免用户长时间刷新再次发送)
        session()->put($smsSentKey, true, 300);
    }
    
    return view('welcome');
}

这个方法的原理是:第一次访问时发送短信并写入Session标记,后续刷新时Session里已经有标记,就会跳过发送逻辑。

内容的提问来源于stack exchange,提问作者Novice

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.09 18:33:01