登录表单提交思考

文章讲述了在Vue前端开发中,未配置
标签action属性导致表单提交失败的问题,以及如何配置action为后端控制器接口并解决Content-Type不支持的错误。作者提供了使用axios发送异步请求和表单设计调整的方法。
摘要由CSDN通过智能技术生成


一、未配置action,提交表单

1.前端代码

        前端登录表单设计:

<body>
     <div id="app">
         <!--登录表单-->
         <!--未配置action=""属性,相当于执行为空-->
         <form method="post">
         用户名:<input type="text" placeholder="请输入用户名:" v-model="loginUserVO.userName"/><br/>
         密码:<input type="password" placeholder="请输入密码:" v-model="loginUserVO.password"/><br/>
         <button @click="submitLogin">登录</button>
         </form>
     </div>
</body>

2.前端vue设计,发送axios请求

        前端vue设计:

<script src="js/vue.js"></script>
<script src="js/axios.min.js"></script>
<script>
    axios.defaults.baseURL = 'http://localhost:8088/';//设置前缀地址
    //解决统一响应数据操作
    axios.interceptors.response.use(function (response) {
        return response.data;
    }, function (error) {
        return Promise.reject(error);
    });

    var mv = new Vue({
        el : "#app",
        data : {
              /** 登录对象 */
            loginUserVO : {
                userName : undefined,
                password : undefined
            }
        },
        methods:{
            submitLogin() {
                axios({
                    method: 'post',
                    url: 'user/login',
                    data: this.loginUserVO
                }).then((resp) => {
                    console.log(resp)
                    if (resp.code === 200) {
                      /** 登录成功后续逻辑 */
                    }
                });
            }
        },
        created(){},
        mounted(){}
    })
</script>

3.出现的问题

        浏览器测试是否发送请求:

浏览器测试发送请求

        很显然浏览器测试后发现并未发送请求。其中原因是<form>标签中就算没有显示配置action=""属性,表单提交数据也会通过cation执行属性指定路径,但我们又没有配置属性值,所以action默认为空值,这样就相当于没有请求对应controller接口方法,所以并没有发送请求,浏览器检查也就获取不到对应的请求。

二、配置action为后端controller接口方法绝对路径,提交表单

1.前端代码

        前端登录表单设计:

<body>
     <div id="app">
         <!--登录表单-->
         <!--配置action=""为后端controller方法接口绝对路径-->
         <form method="post" action="http://localhost:8088/user/login">
         用户名:<input type="text" placeholder="请输入用户名:" v-model="loginUserVO.userName"/><br/>
         密码:<input type="password" placeholder="请输入密码:" v-model="loginUserVO.password"/><br/>
         <button @click="submitLogin">登录</button>
         </form>
     </div>
</body>

2.前端vue设计,发送axios请求

        前端vue设计:

<script src="js/vue.js"></script>
<script src="js/axios.min.js"></script>
<script>
    axios.defaults.baseURL = 'http://localhost:8088/';//设置前缀地址
    //解决统一响应数据操作
    axios.interceptors.response.use(function (response) {
        return response.data;
    }, function (error) {
        return Promise.reject(error);
    });

    var mv = new Vue({
        el : "#app",
        data : {
              /** 登录对象 */
            loginUserVO : {
                userName : undefined,
                password : undefined
            }
        },
        methods:{
            submitLogin() {
                axios({
                    method: 'post',
                    url: 'user/login',
                    data: this.loginUserVO
                }).then((resp) => {
                    console.log(resp)
                    if (resp.code === 200) {
                      /** 登录成功后续逻辑 */
                    }
                });
            }
        },
        created(){},
        mounted(){}
    })
</script>

3.出现的问题

        浏览器测试提交表单数据,报错状态码为:415,报错原因为:不支持的媒体类型(Unsupported Media Type)是一种 HTTP 协议的错误状态代码,表示服务器由于不支持其有效载荷的格式,从而拒绝接受客户端的请求。此处是表示前端请求头中Content-type指定格式不支持而导致的报错。

Resolved [org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded;charset=UTF-8' not supported]

 三、对于以上两种情况,解决方法(不止这一种方法解决,还有很多其他方式,作者只根据目前自己代码给出了以下解决方法)

 1.前端代码

         前端登录表单设计:

<body>
     <div id="app">
         <!--登录表单-->
         <!--<form method="post" action="http://localhost:8088/user/login">-->
         用户名:<input type="text" placeholder="请输入用户名:" v-model="loginUserVO.userName"/><br/>
         密码:<input type="password" placeholder="请输入密码:" v-model="loginUserVO.password"/><br/>
         <button @click="submitLogin">登录</button>
         <!--</form>-->
     </div>
</body>

2.前端vue设计,发送axios请求

        前端vue设计:

<script src="js/vue.js"></script>
<script src="js/axios.min.js"></script>
<script>
    axios.defaults.baseURL = 'http://localhost:8088/';//设置前缀地址
    //解决统一响应数据操作
    axios.interceptors.response.use(function (response) {
        return response.data;
    }, function (error) {
        return Promise.reject(error);
    });

    var mv = new Vue({
        el : "#app",
        data : {
              /** 登录对象 */
            loginUserVO : {
                userName : undefined,
                password : undefined
            }
        },
        methods:{
            submitLogin() {
                axios({
                    method: 'post',
                    url: 'user/login',
                    data: this.loginUserVO
                }).then((resp) => {
                    console.log(resp)
                    if (resp.code === 200) {
                      /** 登录成功后续逻辑 */
                    }
                });
            }
        },
        created(){},
        mounted(){}
    })
</script>

3.解决问题

        表单设计不使用<form>标签,只使用<input>标签表示登录的输入数据,给按钮绑定对应的点击事件,发送axios请求,异步请求后端controller方法接口

        解决原理 :未定义<form>标签就不会默认执行action属性的指定路径,而是通过按钮点击事件发送请求,请求后端controller方法接口。

        我们可以看到,浏览器测试提交数据后,请求成功,并且响应返回对应数据。


  • 17
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值