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'); } } }
原因分析
- Ajax请求是异步交互,后端返回的
redirect()不会自动触发页面跳转——Ajax会接收重定向响应,但不会执行页面跳转逻辑。 - 依赖前端传递的
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
相关产品推荐
相关产品推荐

