web开发时使用xmlhttprequest向后端传递数据成功,后端向前端返回处理结果报错405



开发环境:

本地服务器:Tomcat

开发平台:IDEA

开发语言:前端HTML、后端java实现servlet




问题描述:

使用IDEA在web开发中,前端使用xmlhttprequest向后端servlet发送数据,并获取后端处理的结果时,网页中显示错误代码:405-方法不允许;但是后端可以正常获取到前端传入的数据,后端处理的结果也是正确的。

前端向后端传递参数以及获取后端处理结果的主要代码如下:

<script>
    // 前端提交数据给后端的函数
    function SubmitId(){
        let xmlHttp=new XMLHttpRequest();
        // 为了说明主要问题,这里让变量Id='android'
        let Id='android';
        ...
        // 设置回调函数
        xmlHttp.onreadystatechange=CallBack;
        // open中的true表示异步,ServletAction即在web.xml中注册的后端Servlet
        xmlHttp.open("post","ServletAction",true);
        // 设置POST请求的包头,类似于form表单,当为POST请求时
        // 需要设置编码类型为“application/x-www-form-urlencoded”,后端才可以正常获取前端数据
        xmlHttp.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
        xmlHttp.send("id="+Id);
        ...
    }
    ...
    // 回调函数
    function CallBack(){
        // readyStatus,从1执行到4,下面两if条件均用于判断服务器是否成功响应
        if(xmlHttp.readyState==4){
            if(xmlHttp.status==200){
                // 获取后端传给前端的结果
                let result=xmlHttp.responseText;
                console.log(result);
            }
        }else{
            alert(xmlHttp.readyState+"   "+xmlHttp.status);
        }
    }
</script>

 后端获取前端数据,并将处理结果传回前端的主要代码如下:

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws       
   IOException, ServletException {
        // 一旦继承父类的doPost(),就会导致405!
        super.doPost(req, resp);
        // 设置编码格式,防止前端传递的中文数据出现乱码
        resp.setContentType("text/html;charset=UTF-8");
        req.setCharacterEncoding("UTF-8");
        // 获取前端数据
        String id=req.getParameter("id");
        ...
        // 为了说明主要问题,中间省略了一些无关代码,这里也只对前端数据做简单处理
        resp.getWriter().write(id+"后端处理成功!");
        resp.getWriter().flush();
        resp.getWriter().close();

    }

问题就出在当后端将处理的结果传递给前端时,出现错误代码405,完整的报错报告如下:

405 (Method Not Allowed)

//该错误指向的代码是前端代码,如下:
xmlHttp.send("id="+Id);

 

解决方法:

删除后端servlet中doPost方法中的super.doPost(req,resp);




原因分析:

        既然后端获取到的前端数据和处理结果都是正确的,那么首先想到的可能是问题出现在后端向前端传递数据的过程中,然而,可以肯定后端向前端传递数据的方式是正确的。

        那么现在把问题转向那一行super.doPost(req,resp); 这是继承自父类的方法,进入父类中的doPost(req, resp):

 

// 这是父类HttpServlet.class中的doPost方法

protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String protocol = req.getProtocol();
        String msg = lStrings.getString("http.method_post_not_supported");
        // 这里出现了报错的405,我的理解是,进入这个方法后,如果浏览器使用的是Http 1.1协议,
        // 就会在resp中存入一个错误码:405,也就导致了405的报错
        if (protocol.endsWith("1.1")) {
            resp.sendError(405, msg);
        } else {
            resp.sendError(400, msg);
        }

    }

 



解决方案:

        那么问题找到了,只需要把我们直接的后端Servlet中的doPost方法中super.doPost(req,resp)删除即可。

        因为IDEA自动生成的doPost方法中自动添加了super.doPost(req,resp),导致了这个问题。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值