解决YII提交POST表单出现400错误,以及ajax post请求时出现400问题

POST表单400错误:

正确做法:

Add this in the head section of your layout:

<?= Html::csrfMetaTags() ?>

--------------------------------- 

不推荐的做法,以下做法是取消CSRF令牌验证:

Add this in your controller:

public $enableCsrfValidation = false;

别的方法:

原来是csrf验证的问题,因为表单是自己写的,在Yii框架中,为了防止csrf攻击,对post的表单数据封装了CSRF令牌验证。
解决办法关闭csrf验证
方法一、在配资文件中关闭

‘components‘=>array(
        ‘request‘=>array(
            // Enable Yii Validate CSRF Token
            ‘enableCsrfValidation‘ => true,
        ),
),

使用Yii表单生成页面的时候,如果表单的提交方式为POST,是都会在页面中添加一个隐藏字段,这个隐藏字段就是CSRF令牌验证字段
用户在提交表单的同时,将该字段提交给服务器端,Yii框架会将该有客户端提交过来的隐藏字段和客户端提交过来的Cookie中的YII_CSRF_TOKEN值进行比较。
相同则通过继续执行,不相同则会抛出400异常:"The CSRF token could not be verified."。
所以就出现了上面的问题,如果是自己写的表单,可以在视图页面的表单添加隐藏的令牌验证字段
方法二、在表单中增加隐藏的验证字段

<input name="_csrf" type="hidden" id="_csrf" value="<?= Yii::$app->request->csrfToken ?>">

如果不想csrf验证就将方法一的true修改为false,这样YII就不会做post表单验证处理。

Ajax POST 的400错误:

最近在做看电影啦 的时候也要用到ajax post。所以又在网上寻找答案。终于,无意之中在Yii from找到这个答案()YII_CSRF_TOKEN 这个东西,因为我开启了 enableCsrfValidation’=>true  ,所以在进行请求的时候会加上csrf的验证。所以在ajax 进行ajax post请求的时候就无法通过验证了。

解决办法: 只要请求的时候手动加上 YII_CSRF_TOKEN 就行了!

例如:

//发送ajax $.ajax({ type: "post", dataType: ‘json‘, url: "index.php?r=Movie/InsertFavorite", data:{‘movie_id‘:‘<?php echo $_GET[‘id‘]?>‘,‘YII_CSRF_TOKEN‘:‘<?php echo ii::app()->request->csrfToken>‘}, cache: false, error: function (XMLHttpRequest, textStatus, errorThrown) { alert(errorThrown); }, success:function(data){ var result=eval("("+data+")"); alert(data) }, }); 

时间: 2024-08-24 22:15:11

解决YII提交POST表单出现400错误,以及ajax post请求时出现400问题的相关文章

php 解决和避免form表单重复提交的方法

在提交表单的时候,可能遇到网速等导致页面突然加载变慢,用户重复地点击提交按钮,将在数据库产生多条数据,导致不可控情况. 比如下面的情况就会导致表单重复提交: 点击提交按钮两次. 点击刷新按钮. 使用浏览器后退按钮重复之前的操作,导致重复提交表单. 使用浏览器历史记录重复提交表单. 浏览器重复的HTTP请求. 网页被恶意刷新. 下面是几种解决的方法: 一:利用js设置按钮点击后变成灰色 $(document).ready(function(){ $(input:submit).click(){ s

WP Mail SMTP插件解决Contact Form 7表单提交失败问题

WP Mail SMTP插件解决Contact Form 7表单提交失败问题 WP Mail SMTP是一款非常优秀的解决WordPress主机因为不支持或者是禁用了mail()函数,导致无法实现在线邮件收发功能的插件,这里在详细介绍下有关"WP Mail SMTP插件来解决Contact Form 7表单提交失败问题"的具体方法. 本文以阿里云服务器和QQ邮箱的SMTP为例. 1. 设置WP Mail SMTP插件,如下图所示: ? ? 其中的,1处的 From Email 和 2处

按下回车默认提交form表单问题

最近开发中碰到一个问题,项目中有几个列表展示页面,允许用户通过查询条件模糊查询数据.用户录入关键字后点击回车会调用查询方法根据关键字查询,原先功能没有问题,但是最近发现在查询输入框中按下回车会直接刷新页面不调用查询方法.检查发现有人在查询模块新增了一个form表单,找了很多和form表单相关资料才发现当form表单内只有一个type="text"类型的<input>标签时按下回车默认会提交form表单.解决方法很简单就是在form表单内新增一个隐藏的type="t

禁止button标签提交form表单,变成普通按钮

button有个type属性,属性值可为button.submit.reset button=普通按钮,直接点击不会提交表单submit=提交按钮,点击后会提交表单reset=表单复位 当button的type属性值为button时,仅做为一个普通的按钮,并不会提交该表单,此时你可以通过js脚本来提交,而form中不需要加onsubmit事件.

Jquery提交form表单

前台代码 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="Js_submit.aspx.cs" Inherits="Ctrip.Corp.Report.OfflineSite.CorpReportSetting.Js_submit" %> 2 3 <html xmlns="http://www.w3.org/1999/xhtml

服务端Json数据+js表单数据提交的 表单交互插件(base-form.js)

我们在做表单的查看.编辑里涉及两个点: 点1,提交Form表单到服务器,保存到数据库 点2,页面显示Form表单里的所有字段 如果表单的字段很多,这两个点会有两个问题: 1,提交Form时,如何少量代码.快速获取表单的所有数据? 2,页面显示Form表单时,如何自动给表单的所有字段自动赋值,而不要一个一个属性地写代码? 针对这两个问题,我有一个推荐的做法,下面以Demo举例: 1)index.html或index.jsp里写一个form表单,引入jquery.js: <srcript type=

ajax 提交序列化表单

1.提交序列化表单+参数: var a = $.param({'address':address,'delivity':delivity,'payment':payment}) + '&' + $('#card_form').serialize(): 2.提交多个序列化表单: var form1 = $('#form1').serialize(): var form2 = $('#form2').serialize(): var form3 = $('#form3').serialize():

jquery ajax提交整个表单参数

转自 : http://www.jb51.net/article/35085.htm function submit(){ var formData=$("form").serialize();  $.ajax({  type: "POST",  url: "/index.aspx",  processData:true,  data:formData,  success: function(data){  $("#result&quo

使用ajax提交form表单,包括ajax文件上传 转http://www.cnblogs.com/zhuxiaojie/p/4783939.html

使用ajax提交form表单,包括ajax文件上传 前言 使用ajax请求数据,很多人都会,比如说: $.post(path,{data:data},function(data){ ... },"json"); 又或者是这样的ajax $.ajax({ url:"${pageContext.request.contextPath}/public/testupload", type:"post", data:{username:username},