如何为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
相关产品推荐
相关产品推荐

