web开发时使用xmlhttprequest向后端传递数据成功,后端向前端返回处理结果报错405
目录
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)
,导致了这个问题。