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

Laravel仅登录用户可添加心愿单:未登录时无法跳转登录页求助

问题

我希望仅登录用户可将商品添加至心愿单,当前通过user_id实现逻辑:当user_id为null时跳转至登录页。但控制台显示user_id为null时,点击心愿单图标(通过Ajax传递user_id)却无法触发跳转,需解决该问题。

前端代码

<script>
  $(document).ready(function () {
        myFunction();
        function myFunction() {
            @if(Auth::check())
        var user_id = {{ Auth::id() }};
    @else
        var user_id = null; // or any other default value
    @endif
    console.log(user_id);
            var search = $('#search').val();
            var categoryId = $('#selectcategory').val();
            var subcat_id = $('#selectsubcat').val();
            $.ajax({
                type: 'GET',
                dataType: 'json',
                url: '{{ url('/productsCat') }}',
                data: {
                    search: search,
                         cat_id: categoryId,
                        sub_cat_id: subcat_id
                },
                success: displayProducts   
            });
          // Function to handle adding to wishlist
      function addToWishlist() {
        $.ajaxSetup({
          headers: {
            'X-CSRF-TOKEN': '{{ csrf_token() }}'
          }
        });

        var product_id = $(this).data('productid');
        $.ajax({
          type: 'POST',
          url: '/post_wishlist',
          data: {
            product_id: product_id,
            user_id: user_id
          },
          success: function(response) {
            location.reload();
          }
        });
      }

      // Bind click event to add to wishlist button
      $(document).on('click', '.addtowishlist', addToWishlist);
    }
        $('#search').keyup(myFunction);
        $('#selectsubcat').on('change', myFunction);
        $('#selectcategory').on('change', function () {
            $('#selectsubcat').val(null);
            myFunction();
        });
    });
</script>

Laravel控制器代码

public function post_wishlist(Request $request)
{
    if ($request->ajax()) {
        $data = $request->all();
        $pid = $data['product_id'];
        $userid = $data['user_id'];
        if ($userid == null) {
            return redirect()->route('login');
        }
    }
}
原因分析
  1. Ajax请求是异步交互,后端返回的redirect()不会自动触发页面跳转——Ajax会接收重定向响应,但不会执行页面跳转逻辑。
  2. 依赖前端传递的user_id存在安全隐患,前端数据可被篡改,不能作为用户登录状态的判断依据。
解决方案

前端修改:提前拦截未登录请求

在发送Ajax前先判断user_id,直接跳转到登录页,减少无效请求:

function addToWishlist() {
  // 提前判断未登录状态,直接跳转
  if (user_id === null) {
    window.location.href = "{{ route('login') }}";
    return;
  }
  
  $.ajaxSetup({
    headers: {
      'X-CSRF-TOKEN': '{{ csrf_token() }}'
    }
  });

  var product_id = $(this).data('productid');
  $.ajax({
    type: 'POST',
    url: '/post_wishlist',
    data: {
      product_id: product_id,
      user_id: user_id
    },
    success: function(response) {
      // 兼容后端返回的重定向指令
      if (response.redirect) {
        window.location.href = response.redirect;
      } else {
        location.reload();
      }
    }
  });
}

后端修改:用Auth判断登录状态,返回JSON让前端处理跳转

不要依赖前端传递的user_id,直接用Laravel内置的Auth组件验证登录状态,并返回JSON格式的响应:

public function post_wishlist(Request $request)
{
    if ($request->ajax()) {
        // 用Laravel Auth直接判断用户是否登录,安全可靠
        if (!Auth::check()) {
            return response()->json(['redirect' => route('login')]);
        }
        
        $data = $request->all();
        $pid = $data['product_id'];
        $userid = Auth::id(); // 从Auth获取真实的用户ID,避免前端篡改
        
        // 执行添加心愿单的业务逻辑
        // ...
        
        return response()->json(['success' => true]);
    }
}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.16 09:47:37