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

Laravel中JQuery Ajax POST登录请求返回404错误求助

问题分析与解决方案

先看你控制台里的请求URL:http://127.0.0.1:8000/dashboard/%7B%7B%20url('/dashboard/login')%20%7D%7D,这说明Blade模板语法没有被Laravel解析,直接作为字符串传到了前端,导致请求地址错误,自然返回404。另外还有几个潜在问题需要一起解决,咱们一步步来:

1. 修复Blade语法不解析的问题

Blade的{{ ... }}语法只有在.blade.php文件里才会被Laravel解析。如果你的JS代码是写在外部.js文件里,Blade是不会处理这些文件的。解决方法有两种:

方法一:把JS代码放到Blade模板文件里

确保你的Ajax代码是写在.blade.php视图文件中(比如resources/views/dashboard/login.blade.php),这样Laravel会自动解析{{ url('/dashboard/login') }}生成正确的URL。

方法二:在Blade模板中定义全局变量,外部JS调用

如果一定要把JS写在外部文件,可以在Blade模板的<head>里先定义URL变量:

<script>
    const loginUrl = "{{ url('/dashboard/login') }}";
</script>
<script src="{{ asset('js/your-external-script.js') }}"></script>

然后在外部JS里用loginUrl作为请求地址:

$.ajax({
 url: loginUrl,
 // ...其他配置
});

2. 添加CSRF令牌(必填)

Laravel默认会验证所有POST请求的CSRF令牌,没有的话会返回419错误(即使路由正确)。你需要在Ajax请求里带上令牌:

方法一:利用表单自动携带令牌

先确保你的登录表单里有CSRF令牌字段(Laravel的@csrf指令会自动生成):

<form id="loginForm">
    @csrf
    <!-- 用户名、密码输入框 -->
</form>

如果你的Ajax是绑定在表单提交事件上,$(this).serialize()会自动包含_token字段,这时候就没问题了。

方法二:手动添加令牌或设置全局请求头

如果JS不是绑定在表单事件上,可以手动在请求数据里加令牌:

$.ajax({
 url: loginUrl,
 method: "post",
 data: {
     username: $('#username').val(),
     password: $('#password').val(),
     _token: "{{ csrf_token() }}" // 直接在Blade里获取令牌
 },
 success: function(result) {
  console.log(result);
 }
});

或者在Blade模板里设置全局Ajax请求头,让所有POST请求自动带令牌:

<script>
    $.ajaxSetup({
        headers: {
            'X-CSRF-TOKEN': "{{ csrf_token() }}"
        }
    });
</script>

3. 优化控制器代码(避免潜在错误)

你的login方法里有几个需要改进的地方:

  • 使用get()返回的是集合,直接取$sa[0]如果没找到用户会报错,应该用first()获取单个模型实例;
  • 返回数组不如返回JSON响应,Laravel的response()->json()更规范;
  • 解密密码之前要先判断用户是否存在,避免空对象报错。

优化后的控制器代码:

public function login(Request $request) {
    $username = $request->username;
    $password = $request->password;

    // 用first()获取单个用户,不存在则返回null
    $sa = MsServiceAdvisor::where('username', $username)->first();

    if (!$sa) {
        return response()->json([
            'status' => 'username not found'
        ], 404); // 返回对应HTTP状态码更规范
    }

    $loginPassword = Crypt::decryptString($sa->password);

    if ($loginPassword == $password) {
        return response()->json([
            'status' => 'success',
            'username' => $sa->username,
            'nama' => $sa->nama,
        ]);
    } else {
        return response()->json([
            'status' => 'wrong password'
        ], 401); // 密码错误返回401未授权状态码
    }
}

4. 确认路由配置

如果你用的是web.php里的路由,请求地址/dashboard/login是正确的;如果用api.php的路由,需要注意api.php里的路由默认会加上/api前缀,所以请求地址应该是/api/ms-sa/login,要对应修改Ajax的URL。

现在把这些步骤都调整后,应该就能解决404和后续可能出现的问题了。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 08:53:37