一尘不染

带有AngularJS html5Mode的Spring Boot

spring

我使用Spring Boot启动Web应用程序。它使用一个简单的主类来启动嵌入式tomcat服务器:

@Configuration
@EnableAutoConfiguration
@ComponentScan
public class Application {

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

}

我想以他可以处理的angularjs html5mode的方式配置服务器

$locationProvider.html5Mode(true);

其他用户的相关发布表明你需要重定向到根目录。html5模式从网址中删除hashbag。如果刷新页面,则服务器找不到该页面,因为他不处hash。


阅读 384

收藏
2020-04-12

共2个答案

一尘不染

我找到了可以接受的解决方案。

@Controller
public class ViewController {

    @RequestMapping("/")
    public String index() {
        return "index";
    }

    @RequestMapping("/app/**")
    public String app() {
        return "index";
    }
}

angularjs应用必须在子域应用下。如果你不希望这样做,则可以创建一个子域(例如app.subdomain.com),该子域映射到你的子域应用程序。使用此构造,你不会与webjar,statis内容等发生冲突。

2020-04-12
一尘不染

使用此控制器将URI转发到index.html,以保留AngularJS路由。

@Controller
public class ForwardController {

    @RequestMapping(value = "/**/{[path:[^\\.]*}")
    public String redirect() {
        // Forward to home page so that route is preserved.
        return "forward:/";
    }
} 

在此解决方案中,ForwardController仅转发未在Controllernor中定义的路径RestController。这意味着你是否已经:

@RestController
public class OffersController {

    @RequestMapping(value = "api/offers")
    public Page<OfferDTO> getOffers(@RequestParam("page") int page) {
        return offerService.findPaginated(page, 10);
    }
} 

两个控制器都将正常工作- @RequestMapping(value = "api/offers")在进行检查之前@RequestMapping(value = "/**/{[path:[^\\.]*}")

2020-04-12