点击提交按钮后URL变为/login/login的原因排查(附角色认证代码)
为什么点击提交按钮后URL变成/login/login?
这种情况几乎都是相对路径的拼接问题导致的,我来帮你拆解几个最常见的原因和解决办法:
1. 表单的action属性用了相对路径
假设你的登录页面是通过/login路径访问的(比如LoginServlet映射到/login),如果表单的action写的是:
<form action="login" method="post">
那浏览器会把这个相对路径拼在当前页面的路径后面,也就是/login + login = /login/login。
解决办法:给action加上根路径前缀,用绝对路径:
<form action="${pageContext.request.contextPath}/login" method="post">
或者直接用斜杠开头的绝对路径(注意如果你的应用有上下文路径,最好用EL表达式获取,避免硬编码):
<form action="/your-app-context/login" method="post">
2. 过滤器里的重定向用了相对路径
看你贴的过滤器代码,应该是在检查session未登录时会重定向到登录页面吧?如果你的重定向代码是这样的:
response.sendRedirect("login");
那同样会出现相对路径拼接的问题——如果当前请求的路径是/some-page,重定向后会变成/some-page/login,但如果是从/login路径触发的过滤,就会变成/login/login。
解决办法:重定向时用绝对路径,加上上下文路径:
String contextPath = request.getContextPath(); response.sendRedirect(contextPath + "/login");
这样不管当前在哪个路径,都会跳转到正确的/your-app-context/login。
3. Servlet映射路径的潜在冲突
如果你的LoginServlet的映射是@WebServlet("/login"),同时你还有一个名为login的文件夹(里面放了静态登录页面),也可能导致路径解析混乱,但这种情况比较少见,优先检查前两个原因。
最后,你可以先排查表单的action路径,这是最常见的触发点,然后再看过滤器里的重定向逻辑,应该就能解决问题啦!
内容的提问来源于stack exchange,提问作者Mohendra
相关产品推荐
相关产品推荐

