Netbeans环境下Shiro根路径/登录失败,访问login.jsp正常的原因及解决办法
问题原因&解决方案
咱们先把问题的根儿找出来:
当你启动应用后,地址栏显示/但页面是login.jsp,这是因为Web容器(比如Tomcat)的欢迎页配置把/做了内部转发,但浏览器地址栏的URL没更新。而你的Shiro配置里authc.loginUrl = /login.jsp,意味着Shiro只认/login.jsp这个路径的登录请求——当你在/路径下提交登录时,表单默认会把请求发到/,Shiro会把这个请求当成普通的未授权请求直接拒绝,所以登录失败;但手动输入/login.jsp后,请求路径匹配了Shiro的配置,自然就能正常登录了。
接下来给你两种解决思路,都能实现“强制系统始终显示login.jsp”的需求:
方法一:让/直接重定向到/login.jsp(最推荐)
这种方式能彻底让地址栏变成/login.jsp,从根源解决路径不匹配的问题:
- 打开项目的
web.xml,修改欢迎页配置:<welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> - 在
web.xml里添加一个重定向的Servlet,把/路径的请求转到/login.jsp:
或者更简单,直接在<servlet> <servlet-name>RootRedirect</servlet-name> <servlet-class>javax.servlet.http.HttpServlet</servlet-class> <init-param> <param-name>target</param-name> <param-value>/login.jsp</param-value> </init-param> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>RootRedirect</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>index.jsp里写重定向代码:
这样用户访问<% response.sendRedirect(request.getContextPath() + "/login.jsp"); %>/时,浏览器会自动跳转到/login.jsp,地址栏也会同步更新,后续登录请求自然能被Shiro正确处理。
方法二:调整Shiro过滤规则(可选)
如果不想改欢迎页,也可以让Shiro识别/路径的登录请求:
在shiro.ini的[urls]区块里添加:
[urls] / = authc /login.jsp = authc # 其他你的路径规则...
同时记得把login.jsp里的表单action明确写成${pageContext.request.contextPath}/login.jsp,避免相对路径出错:
<form action="${pageContext.request.contextPath}/login.jsp" method="post"> <!-- 用户名、密码等表单元素 --> </form>
不过这种方法地址栏还是会显示/,不如第一种方法彻底,优先推荐方法一。
内容的提问来源于stack exchange,提问作者chris loughnane
相关产品推荐
相关产品推荐

