SpringBoot 2.0.0.RELEASE版本以及之后
SpringBoot 2.0.0.RELEASE版本以及之前
假设我的应用有个接口/api/test,我在本地的8080端口启动我的应用。访问这个接口的url为localhost:8080/api/test.
加上了context-path为myapp1之后,我去访问这个接口的url就要变成localhost:8080/myapp1/api/test
springboot项目设置了context-path之后,假如设置为myapp1,那么项目启动之后,访问项目的所有请求的URI必须/myapp1开头,才能访问进项目。
我的项目设置了context-path为myapp1,然后我想搞个过滤器MyFilter来处理以"/api"开头的请求,配置filter的过滤规则的时候,我将其设置成了"/myapp1/api/*",结果向应用发送localhost:8080/myapp1/api/test的时候死活也进入不到我的MyFilter过滤器中。
最后查看源码发现,如果项目设置了context-path,tomcat,spring在将请求的URI和我们设置的过滤器匹配规则进行比较的时候,用来比较的requestURI已经是去掉context-path的了,所以设置filter的匹配规则的时候不要管context-path是多少。
spring-boot默认提供内嵌的tomcat,所以打包直接生成jar包,用java -jar命令就可以启动。但是,有时候我们更希望一个tomcat来管理多个项目,这种情况下就需要项目是war格式的包而不是jar格式的包。spring-boot同样提供了解决方案,只需要简单的几步更改就可以了,这里提供maven项目的解决方法:1.将项目的启动类Application.java继承SpringBootServletInitializer并重写configure方法
@SpringBootApplication
public class Application extends SpringBootServletInitializer {
@Override
protected SpringApplicationBuilder configure(SpringApplicationBuilder application) {
return application.sources(Application.class)
}
public static void main(String[] args) throws Exception {
SpringApplication.run(Application.class, args)
}
}12345678910111213
2.在pom.xml文件中,project下面增加package标签
<packaging>war</packaging>1
3.还是在pom.xml文件中,dependencies下面添加
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
<scope>provided</scope>
</dependency>12345
这样,只需要以上3步就可以打包成war包,并且部署到tomcat中了。需要注意的是这样部署的request url需要在端口后加上项目的名字才能正常访问。spring-boot更加强大的一点就是:即便项目是以上配置,依然可以用内嵌的tomcat来调试,启动命令和以前没变,还是:mvn spring-boot:run。
如果需要在springboot中加上request前缀,需要在application.properties中添加server.contextPath=/prefix/即可。其中prefix为前缀名。这个前缀会在war包中失效,取而代之的是war包名称,如果war包名称和prefix相同的话,那么调试环境和正式部署环境就是一个request地址了。
前端在做Ajax请求时,
如果用Jquery提供的Ajax,那么每次都要设定URL的部署名ContextPath。
项目规模起来的话,为了适当减少工作量。
同时避免个别开发人员不调用共通方法,直接把部署名拼到URL上。
对Ajax的设定做如下修正。可以解决上述的两个问题。
共通方法getContextPath()的内容
或者
调用Ajax的方法
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)