Tomcat10环境下AJAX POST请求Servlet返回405不支持GET方法求助
问题根因
你碰到的405错误和请求地址错误的核心原因是表单默认提交行为被触发,没有执行你的AJAX逻辑:
你把搜索按钮放在了<form>标签内部,button标签在form里默认是submit类型,点击后会自动触发表单的GET提交,提交地址就是当前页面的地址(也就是登录Servlet的地址),参数会直接拼在URL后面,所以才会出现你说的http://localhost:8080/library/UserLogin?search=java的请求,而你的UserLogin Servlet只实现了doPost方法,自然就返回405不支持GET方法的错误。
具体解决方案
1. 阻止表单默认提交
两种方案二选一即可:
- 给搜索按钮加上
type="button"属性,修改为:
<button type="button" id="getbook"><i class="fas fa-search"></i></button>
- 或者在AJAX的click事件里阻止默认行为:
$("#getbook").click(function(e){ e.preventDefault(); // 阻止表单默认提交 // 剩下的原有逻辑不变 });
2. 修复suserid变量的引用问题
你在JSP里定义的suserid是Java服务端变量,JS无法直接读取,需要把值输出到JS上下文里,在JSP的script标签开头加一行:
var suserid = '<%= (String)request.getAttribute("userid") %>';
3. 修正AJAX传参格式
你现在的AJAX直接传值,后端getParameter无法识别参数名,需要改成键值对格式:
- 搜索图书的AJAX修改data字段:
$.ajax({ type:'POST', url:'Issuedbooks', data: {search: search}, // 改成键值对格式 // 剩下逻辑不变 });
- 查询我的图书的AJAX修改data字段:
$.ajax({ type:'POST', url:'mybooks', data: {suserid: userid}, // 改成键值对格式 // 剩下逻辑不变 });
4. 可选:修改登录后地址栏显示问题
你登录后地址栏还是登录Servlet地址,是因为用了forward转发,本质还是同一个请求。如果要改成显示JSP地址,需要把登录成功的转发改成重定向,同时把userid存入session避免丢失:
// UserLogin.java登录成功的逻辑修改 if(rs.next()){ request.getSession().setAttribute("userid",userid); response.sendRedirect("userlogin.jsp"); }
然后userlogin.jsp里取值的时候从session取即可:
<%String suserid=(String)session.getAttribute("userid");%>
其他需要修复的小问题
- Issuedbooks.java里输出表格的代码漏了闭合符号:
out.println("</table")改成out.println("</table>") - mybooks.java里重复定义了userid变量:
String userid=rs.getString(2);和方法开头的String userid=request.getParameter("suserid");重名,修改为不同的变量名即可 - 所有SQL拼接都用了Statement,存在SQL注入风险,建议全部改成PreparedStatement预编译处理
- 数据库连接用完要调用
close()关闭,避免连接泄漏
内容的提问来源于stack exchange,提问作者Shunmusiva
相关产品推荐
相关产品推荐

