2016-03-02 38 views
3

我在前端使用彈簧引導和角度。有時我想直接從服務重定向。我們只使用.html,.css和腳本文件(不包括.jsp)。無法找到與彈簧啓動的HTML頁面

這是return "static/pages/savepassword.html";我如何試圖重定向到savepassword

所以第一個問題,我怎麼在這種情況下,適當地重定向?

接下來,Spring沒有找到我的html文件。我有這樣的結構

enter image description here

,我讀了春天應該會自動查找所有靜態文件中的「靜」,但事實並非如此。所以,我想配置我ViewControllerRegistry和RessourceControllerRegistry

@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的」直接,它的作品。當我想打電話「/登錄」它說404. 第二個問題:我需要什麼配置,什麼不是?

UPDATE-1:春季安全

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 我更新了我的結構,但仍然有問題,與/登錄重定向到自定義登錄。 enter image description here

UPDATE-3 我看了一下鮑勃·希爾茲第二評論:https://spring.io/blog/2013/12/19/serving-static-web-content-with-spring-boot 我做了以下內容:

@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並調用/templates/login.html(與savepassword.html相同)。

現在,我想知道如何在HTML中包括我的CSS/JS:

<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> 

這不工作...但我卡恩直接/腳本/登錄調用我的腳本.js文件。

+0

你可以嘗試使用/login.html嗎? –

+0

不,因爲默認的Spring Security頁面出現了。 Regulary,我們自定義的login.html(static/pages/login.html)應該顯示出來。 我更新了我的答案,所以你可以看到彈簧安全配置。 我以爲'ViewControllerRegistry'解析登錄到靜態/頁面/登錄,HTML,並將採取此登錄頁面 – Andy

+0

我可能需要將靜態文件夾放在src/main/ressource而不是放入webapp? – Andy

回答

2

好吧,現在我完全明白了。我嘗試儘可能具體。

我的最終結構

structure

1.靜態Ressources

Spring有一些默認配置,你可以把你的靜態ressources沒有配置。您需要SRC創建這些文件夾/主/資源

  • /META-INF /資源/
  • 資源(是的,在SRC /主/資源
  • 靜態
  • 額外的資源文件夾
  • 公共

看一看here in Spring Doku.舉一個例子,檢查由鮑勃·希爾茲第二評論:

創建一串「findme.txt」的文件,其中的每一個內有不同的「源相對的」路徑字符串後,我發現,在以下位置可與「http://host/findme.txt」中獲取有:

SRC /main/resources/public/findme.txt

src/main/resources/static/findme。TXT

的src /主/資源/資源/ findme.txt - (是的,資源^ 2!)

的src /主/資源/ findme.txt - 沒有找到!

我將我的文件夾「腳本」和「樣式表」放在靜態文件夾中。當我想包括在HTML這些文件夾中的文件,源看起來像src="scripts/file.js"因爲static的文件和文件夾被發現直接生根host/scripts/file.js

沒有ResourceHandlerRegistry是必要的我!

2.視圖控制器

我想我的根來的login.html /登錄,savepassword.html到/ savepassword和我的index.html到/。下面是我做的:

registry.addViewController("/savepassword").setViewName("savepassword.html"); 
registry.addViewController("/login").setViewName("login.html"); 
registry.addViewController("/").setViewName("loggedin/index.html"); 

我設置*。html的,否則我有春天不知道/登錄和登錄檔案(.html)之間不同的問題。 正如你所看到的,我將index.html放在了一個名爲「loggedin」的不同文件夾中。這個文件夾是在我的公共文件夾(由Spring發現,見1)。爲什麼要這樣做?看看3

3.春季安全

.authorizeRequests().antMatchers("/stylesheets/**", "/scripts/**","/login", "/user/**").permitAll() 
...omitted further configuration... 
.loginPage("/login").permitAll(); 

首先,我想,一個用戶總是有先登錄纔可以訪問任何其他網站。因此,登錄頁面的所有資源必須可用。

這段代碼使樣式表和腳本中的每個文件都可以訪問。記住樣式表和腳本 - 文件夾被置於靜態。由於自定義登錄頁面,我必須設置「/ login」。 老實說,我認爲.loginPage("/login").permitAll();將授予訪問權限,但它不。沒有它,Spring會嘗試訪問「/ login」,但不能導致沒有權限,然後自動重定向到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

在我看來,最好把你的* .HTML文件放在你的資源文件夾中,並使用所有的靜態CSS字體等,如下圖所示。在webapp中,您只能擁有一個WEB-INF文件夾。

我使用這種結構,我沒有發現任何類的CSS或HTMLS的問題,我不使用擴展在Java(「靜態/頁/ login.html」像你的)結束。如果我想訪問html,如果它在ex文件夾用戶中,就像「user/someHtml」一樣。

我知道這個答案不完全是你正在尋找的那個,但它可能在某種程度上幫助你。

enter image description here

編輯:現在爲:

@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); 
} 

比方說你有一個控制器:

@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顯示是這樣的:

@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。

UPDATE:

如果你把你的CSS到您的靜態文件夾中的資源,如:

enter image description here

你可以簡單地訪問他們像這樣:

<link rel="stylesheet" th:href="@{/css/bootstrap-datetimepicker.min.css}" /> 

希望這有助於!

+0

首先,謝謝;)是的,我改變了我的結構,現在(所以+1),但是仍然存在兩個問題:如何重定向和設置ViewController。 – Andy

+0

那麼我想你擴展了WebMvcConfigurerAdapter。因此,例如。這裏是如何當您試圖訪問你的應用程序中,如HTTP瀏覽器://本地主機:8080 /,你將被重定向到「用戶/ showSomething」 @覆蓋 公共無效addViewControllers(ViewControllerRegistry註冊表){ 註冊表。 addViewController(「/」).setViewName(「forward:/ user/showSomething」); registry.setOrder(Ordered.HIGHEST_PRECEDENCE); super.addViewControllers(registry); } PS:你可能錯過了「前進」,就像我在前。希望這可以幫助。 –

+0

它只是不工作...不能訪問任何html ...即使沒有彈簧安全和wihtout ViewControllerRegistry/ResourceHandlerRegistry – Andy