首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >找不到带有spring引导的html页面

找不到带有spring引导的html页面
EN

Stack Overflow用户
提问于 2016-03-02 14:33:03
回答 2查看 16.3K关注 0票数 4

我使用弹簧靴和角在前端。有时我想直接从服务中重定向。我们只使用.html、.css和脚本文件(不使用.jsp)。

这就是return "static/pages/savepassword.html";我如何尝试重定向到savepassword

所以第一个问题在这种情况下我如何正确地重定向?

接下来,Spring找不到我的html文件。我有这个结构

我读到spring应该自动找到“静态”中的所有静态文件,但是它没有。

代码语言:javascript
复制
@Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        super.addResourceHandlers(registry);
        registry.addResourceHandler("/static/**").addResourceLocations("/static/");
//      registry.addResourceHandler("/stylesheets/**").addResourceLocations("/stylesheets/");
//      registry.addResourceHandler("/scripts/**").addResourceLocations("/scripts/");
//      registry.addResourceHandler("/pages/**").addResourceLocations("/pages/");
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        super.addViewControllers(registry);
        registry.addViewController("/savePassword").setViewName("static/pages/savePassword.html");
        registry.addViewController("/login").setViewName("static/pages/login.html");
        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
    }

当我直接调用“静态/页面/login.html”时,它就能工作了。当我想叫"/login“的时候,上面写着404。第二个问题:我需要配置什么?不需要配置什么?

更新-1: Security

代码语言:javascript
复制
http
            .authorizeRequests().antMatchers("/login", "/logout", "/user/**").permitAll()
            .anyRequest().authenticated()
        .and()
            .exceptionHandling()
            .accessDeniedHandler(new CustomAccessDeniedHandler())
            .authenticationEntryPoint(new CustomAuthenticationEntryPoint())
        .and()
            .requiresChannel()
            .anyRequest().requiresSecure()
        .and()
            .csrf()
            .disable()
            //.csrfTokenRepository(csrfTokenRepository())
            .addFilterBefore(new MDCFilter(), ExceptionTranslationFilter.class)
            // .addFilterBefore(new CorsFilter(),// ChannelProcessingFilter.class)
            //.addFilterAfter(new CsrfHeaderFilter(), CsrfFilter.class)
            .formLogin()
            .successHandler(new CustomSuccessAuthenticationHandler())
            .failureHandler(new CustomFailureHandler())
            .loginPage("/login").permitAll();

UPDATE-2 I更新了我的结构,但是在将/login重定向到自定义登录时仍然存在问题。

更新-3我看了鲍勃·希尔兹的第二条评论:https://spring.io/blog/2013/12/19/serving-static-web-content-with-spring-boot,我做了以下几点:

代码语言:javascript
复制
@Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        super.addResourceHandlers(registry);
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/");
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        super.addViewControllers(registry);
        registry.addViewController("/savepassword").setViewName("savepassword.html");
        registry.addViewController("/login").setViewName("login.html");
        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
    }

我设置.html是因为否则/login会导致递归问题。通过这个配置,我可以输入/login并调用/templates/login.html (savepassword.html也是如此)。

现在,,我想知道如何将css/js包含在html中。

代码语言:javascript
复制
<link rel="stylesheet" type="text/css" href="..resources/stylesheets/bootstrap.min.css" />
    <script src="..resources/scripts/angular.min.js"></script>
    <script src="..resources/scripts/login.js"></script>

这并不是work...but,我不能用/script/login.js直接调用我的脚本。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-03-02 22:31:56

好吧,现在我完全明白了。我尽量说得具体些。

我的最终结构

1.静态资源

Spring有一些默认配置,您可以在不配置它的情况下放置静态重新源。您需要在src/main/resources中创建这些文件夹

  • /META-INF/resources/
  • 资源(是的,src/main/resources中有一个额外的资源文件夹)
  • 静态
  • 公共的

这里是春天的杜库。为例,查看Bob的第二个评论:

在创建了一组"findme.txt“文件(每个文件中都有不同的”源-相对“路径字符串)之后,我发现可以使用"http://host/findme.txt”获取以下位置: src/main/resources/public/findme.txt src/main/resources/静态/findme.txt src/main/resources/resources/findme.txt -(是的,资源^2!) src/main/resources/findme.txt -找不到!!

我把我的文件夹“脚本”和“样式表”放在静态文件夹中。当我想在html中包含这些文件夹中的文件时,源代码看起来类似于src="scripts/file.js",因为static中的文件和文件夹是直接根植于host/scripts/file.js的。

没有ResourceHandlerRegistry对我来说是必要的!

2.视图控制器

我想把我的login.html根到/login,savepassword.html根到/savepassword,index.html根到/。以下是我所做的:

代码语言:javascript
复制
registry.addViewController("/savepassword").setViewName("savepassword.html");
registry.addViewController("/login").setViewName("login.html");
registry.addViewController("/").setViewName("loggedin/index.html");

我设置了*.html,因为否则我遇到了一个问题: spring不知道/login和登录(.html)之间有什么不同。如您所见,我将index.html放在另一个名为"loggedin“的文件夹中。这个文件夹就在我的公用文件夹中(由Spring找到,参见1)。我为什么要这么做?看一下3。

3.弹簧安全

代码语言:javascript
复制
.authorizeRequests().antMatchers("/stylesheets/**", "/scripts/**","/login", "/user/**").permitAll()
...omitted further configuration...
.loginPage("/login").permitAll();

首先,我希望用户在访问任何其他站点之前都必须登录。因此,所有用于loginpage的资源都必须可用。

这段代码使样式表和脚本中的每个文件都可以访问。记住样式表和脚本-文件夹被放置在静态中。由于定制的loginpage,我不得不设置"/login“。老实说,我原以为.loginPage("/login").permitAll();会授予访问权限,但它不会。没有它,Spring就会尝试访问"/login",但不会导致没有权限,然后会自动重定向到登录=> ERR_TOO_MANDY_REDIRECTS。"/ user /**“仅适用于我的一些服务,每个用户都可以使用。

如您所见,我不允许访问" loggedin "-folder,只有当他是loggedin时,每个访问者才能在"loggedin“中输入文件;)

4.重定向

我只是用@RequestController标记了整个控制器,它实现了@ResponseBody。当我返回类似于返回"redirect:/savepassword";的字符串时,Spring将将其设置为ResponseBody,并且它将被解释为String/Json(?)。

我必须将控制器标记为“controller”,并将@ResponseBody设置为每个必须返回json或某物的服务。我的服务被标记为@RequestMapping和method=RequestMethod.GET。最后,我返回一个类似于return "redirect:/savepassword";的字符串--这将使Spring重定向到/savepassword,它实际上被放置在src/main/resources/public/savepassword.html中。

终于成功了,很难找到spring是如何服务这些文件的。我希望它能对其他人有所帮助:)

票数 3
EN

Stack Overflow用户

发布于 2016-03-02 15:15:52

在我看来,最好将*.HTML文件与所有静态CSS字体一起放在资源文件夹中,如下图所示。在webapp中,您可以只有一个WEB文件夹。

我正在使用这种结构,我没有问题找到任何类css或htmls,并且我在java中没有使用扩展(“static/page/login.html”和您的一样)。如果我想访问html,我就像" user /someHtml“一样,如果它位于ex的文件夹用户中。

我知道这个答案并不是你想要的,但它可能在某种程度上对你有所帮助。

编辑:现在用于:

代码语言:javascript
复制
   @Override
   public void addViewControllers(ViewControllerRegistry registry) {
       super.addViewControllers(registry);
       registry.addViewController("/savePassword").setViewName("static/pages/savePassword.html");
       registry.addViewController("/login").setViewName("static/pages/login.html");
       registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
}

假设您有一个控制器:

代码语言:javascript
复制
@Controller
@RequestMapping("/myController")
public class MyController{
...


@RequestMapping(value = "/login")
public String login(Model model) {
     // Your code ....

    return "login"; //<- this is your login.html if it is directly in resource/templates folder
}
    @RequestMapping(value = "/savePassword")
public String savePassword(Model model) {
     // Your code ....

    return "savePassword"; //<- this is your savePassword.html if it is directly in resource/templates folder
} 
.....
}

现在您的addViewController节目如下所示:

代码语言:javascript
复制
   @Override
      public void addViewControllers(ViewControllerRegistry registry) {
          super.addViewControllers(registry);
          registry.addViewController("/savePassword").setViewName("forward:/myController/savePassword");
       registry.addViewController("/login").setViewName("forward:/myController/login");
       registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
}

在您的addViewController中,您正在尝试访问一个控制器,而不是一个HTML,您将通过从addViewControllers.方法访问的控制器访问HTML。

更新:

如果将CSS放入资源中的静态文件夹中,如:

您可以这样简单地访问它们:

代码语言:javascript
复制
<link rel="stylesheet" th:href="@{/css/bootstrap-datetimepicker.min.css}" />

希望这能有所帮助!

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35750114

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档