AJAX 在 Spring 中获取返回 404
Posted
技术标签:
【中文标题】AJAX 在 Spring 中获取返回 404【英文标题】:AJAX get returns 404 in Spring 【发布时间】:2020-03-09 14:11:16 【问题描述】:帮帮我 index.jsp
$("#btn-submit").click(function ()
var username=document.getElementById("username");
var password=document.getElementById("password");
$.ajax(
url:"login",
contentType: 'application/json;charset=utf-8',
dataType: 'text',
headers: 'X-CSRF-TOKEN': $('meta[name="csrf-token"]').attr('content'),
data:
username:username.value,
password:password.value
,
type: 'get',
success: function (response)
if (response=="1")
alert(response);
else alert(response);
,
error: function (x, e)
console.log(e)
);
);
LoginController.java
@RequestMapping("/login")
@Controller
public class LoginController
@Autowired
private UserService userService;
@RequestMapping(value = "/login" , method = RequestMethod.GET)
@ResponseBody
public int checkValid(@RequestParam("username") String username,@RequestParam("password") String password, HttpServletRequest request, HttpServletResponse response, Locale locale, Model model)
try
if (userService.findByUserName(username).equals(hashPass(password)))
return 1;
catch (NoSuchAlgorithmException e)
e.printStackTrace();
return 0;
return 0;
public String hashPass(String pass) throws NoSuchAlgorithmException
MessageDigest md = MessageDigest.getInstance("SHA-256");
byte[] hashInBytes = md.digest(pass.getBytes(StandardCharsets.UTF_8));
// bytes to hex
StringBuilder sb = new StringBuilder();
for (byte b : hashInBytes)
sb.append(String.format("%02x", b));
return sb.toString();
spring-config-servlet.xml
<?xml version="1.0" encoding="UTF-8"?>
http://www.springframework.org/schema/jdbc/spring-jdbc-4.3.xsd http://www.springframework.org/schema/mvchttp://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://www.springframework.org/schema/beanshttp://www.springframework.org/schema/beans/spring-beans.xsd http://www.springframework.org/schema/contexthttp://www.springframework.org/schema/context/spring-context-4.3.xsd http://www.springframework.org/schema/txhttp://www.springframework.org/schema/tx/spring-tx-4.3.xsd"> /WEB-INF/pages/ .jsp /resources/jdbc.properties
<!-- Enable Annotation based Declarative Transaction Management -->
<tx:annotation-driven proxy-target-class="true"
transaction-manager="transactionManager" />
<!-- Creating TransactionManager Bean, since JDBC we are creating of type
DataSourceTransactionManager -->
<bean id="transactionManager"
class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<bean id="postsDAO" class="com.blog.dao.impl.PostsDAO">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
<bean id="postsService" class="com.blog.service.impl.PostsService">
<property name="postsDAO" ref="postsDAO"/>
</bean>
<bean id="userDAO" class="com.blog.dao.impl.UserDAO">
<property name="jdbcTemplate" ref="jdbcTemplate"/>
</bean>
<bean id="userService" class="com.blog.service.impl.UserService">
<property name="userDAO" ref="userDAO"/>
</bean>
我使用tomcat 9 错误:加载资源失败:服务器响应http://localhost:8080/Blog_war_exploded/login?username=root&password=root,状态为404()
【问题讨论】:
【参考方案1】:看看你的错误:你正在访问http://localhost:8080/Blog_war_exploded/login
,但你实际上想访问http://localhost:8080/login
。
原因是您将 URL 指定为 login
而不是 /login
,因此它是相对于当前“目录”而不是根目录。
更改代码以使用/login
应该可以解决它:
$.ajax(
url: "/login",
...
)
附带说明,通过 GET 请求执行此操作不是一个好主意 - 除其他外,密码将以明文形式存储在服务器日志中。您应该改用 POST 请求。
更新:
此外,您似乎对/login
使用两个 请求映射,因此您最终会得到/login/login
。查看how to use @RequestMapping
properly。
尝试将第二个(方法级别)更改为 @RequestMapping(value = "/" , method = RequestMethod.GET)
或只是 @RequestMapping("/")
。
【讨论】:
/login
,而不是/ login
。 “没用”是什么意思?请分享到底发生了什么,我确定错误消息是不同的。
编辑后出现错误:GET localhost:8080/login?username=1&password=1 404 sorry for bad english
您是否在我更新的答案中也尝试了第二个修复?关于请求映射。【参考方案2】:
我认为这个问题与您在控制器级别和方法级别上的 RequestMapping 定义有关。
控制器级别的第一次登录,意味着如果你想访问这个控制器中的任何服务,你的请求必须以“/login”开头
@RequestMapping("/login")
@Controller
public class LoginController
第二次登录在方法级别,表示要调用/login下的/login服务。
@RequestMapping(value = "/login" , method = RequestMethod.GET)
@ResponseBody
public int checkValid(@RequestParam("username") String username,@RequestParam("password") String password, HttpServletRequest request, HttpServletResponse response, Locale locale, Model model)
所以在 /login 控制器下调用 /login 服务的有效 URL 是:/login/login
因此,您的网址 /login 未找到
您可以在控制器级别删除第一个 /login,或者使用 ajax 请求中的 /login/login...
【讨论】:
以上是关于AJAX 在 Spring 中获取返回 404的主要内容,如果未能解决你的问题,请参考以下文章
获取 JWT 后,带有 Spring Boot 后端的 Angular 在现有路由上返回 404
获取 https://localhost/myapp/saml/sso 重定向会引发 404 错误 - Spring MVC/Okta