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

如何为Spring Boot应用添加根上下文,排除/login路径?

解决Spring Boot应用添加根上下文但排除/login路径的问题

首先明确:Spring Boot没有server.servlet.context-path-exclude这个配置项,你之前的配置自然不会生效。下面提供几种可行的解决思路:

方案1:注册多个DispatcherServlet

通过自定义Servlet注册Bean,让主应用处理带/applicationName前缀的路径,同时单独注册一个DispatcherServlet处理/login路径,共享同一个Spring上下文:

@Configuration
public class ServletConfig {

    // 主应用DispatcherServlet:处理/applicationName/**路径
    @Bean
    public ServletRegistrationBean<DispatcherServlet> mainDispatcherServlet(ApplicationContext context) {
        DispatcherServlet servlet = new DispatcherServlet(context);
        ServletRegistrationBean<DispatcherServlet> registration = new ServletRegistrationBean<>(servlet, "/applicationName/**");
        registration.setName("mainDispatcher");
        registration.setLoadOnStartup(1);
        return registration;
    }

    // 登录路径DispatcherServlet:处理/login路径
    @Bean
    public ServletRegistrationBean<DispatcherServlet> loginDispatcherServlet(ApplicationContext context) {
        DispatcherServlet servlet = new DispatcherServlet(context);
        ServletRegistrationBean<DispatcherServlet> registration = new ServletRegistrationBean<>(servlet, "/login");
        registration.setName("loginDispatcher");
        registration.setLoadOnStartup(2);
        return registration;
    }
}

配置完成后,需删除application.properties中的server.servlet.context-path配置,避免冲突。

方案2:用Servlet转发登录请求

保持server.servlet.context-path=/applicationName配置,编写一个Servlet负责转发/login请求到主应用的登录路径:

@WebServlet("/login")
public class LoginForwardServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        req.getRequestDispatcher("/applicationName/login").forward(req, resp);
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

然后在Spring Boot启动类上添加@ServletComponentScan注解,让框架扫描到这个自定义Servlet。用户访问/login时,会自动转发到/applicationName/login的处理逻辑。

方案3:通过Filter重写路径

编写一个Filter,将/login请求的路径重写为带根上下文的路径,交给主应用处理:

@Component
public class LoginPathRewriteFilter implements Filter {
    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest req = (HttpServletRequest) request;
        String path = req.getRequestURI();
        
        if ("/login".equals(path)) {
            HttpServletRequest wrappedReq = new HttpServletRequestWrapper(req) {
                @Override
                public String getRequestURI() {
                    return "/applicationName/login";
                }

                @Override
                public String getServletPath() {
                    return "/applicationName/login";
                }
            };
            chain.doFilter(wrappedReq, response);
        } else {
            chain.doFilter(request, response);
        }
    }
}

这种方式无需额外注册Servlet,仅通过路径重写实现需求,适合简单场景。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.15 14:35:16