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
相关产品推荐
相关产品推荐

