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

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,从根源解决路径不匹配的问题:

  1. 打开项目的web.xml,修改欢迎页配置:
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    
  2. 在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.25 04:14:16