You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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");%>

其他需要修复的小问题

  1. Issuedbooks.java里输出表格的代码漏了闭合符号:out.println("</table")改成out.println("</table>")
  2. mybooks.java里重复定义了userid变量:String userid=rs.getString(2);和方法开头的String userid=request.getParameter("suserid");重名,修改为不同的变量名即可
  3. 所有SQL拼接都用了Statement,存在SQL注入风险,建议全部改成PreparedStatement预编译处理
  4. 数据库连接用完要调用close()关闭,避免连接泄漏

内容的提问来源于stack exchange,提问作者Shunmusiva

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.19 01:27:01