如何从server.servlet.path配置中排除某些端点?

时间:2018-04-22 20:34:37

标签: spring-boot

我的Spring Boot应用程序只有一个index.html页面。

我需要设置server.servlet.path=/api

为了得到index.html,我必须按照上述设置localhost:8080/api/

我希望index.html能够localhost:8080/以及localhost:8080/api/**之前的其他任何端点。

我该怎么办? 感谢

1 个答案:

答案 0 :(得分:0)

配置server.servlet.path = / api后,DispatcherServlet将只处理请求匹配的URL Patterns / api /**.

实现您的要求的一种方法是使用普通的Servlet。

import org.springframework.core.io.ClassPathResource;
import org.springframework.util.StreamUtils;

import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.nio.charset.Charset;

@WebServlet(urlPatterns = {"/"})
public class RootServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        ClassPathResource resource = new ClassPathResource("static/index.html");
        String content = StreamUtils.copyToString(resource.getInputStream(), Charset.defaultCharset()  );
        resp.getWriter().write(content);
    }
}

现在您可以使用@ServletComponentScan注释注册Servlet。假设您将RootServlet放在com.myapp.servlets包中:

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.boot.web.servlet.ServletComponentScan;

@SpringBootApplication
@ServletComponentScan(basePackages = "com.myapp.servlets")
public class Application {

    public static void main(String[] args) {
        SpringApplication.run(Application.class, args);
    }
}

有关详细信息,请参阅https://docs.spring.io/spring-boot/docs/current/reference/htmlsingle/#howto-add-a-servlet-filter-or-listener