nicht finden können html-Seiten mit spring boot
Bin ich mit spring-boot und Winkel in front-end. Manchmal möchte ich die Umleitung direkt vom service. Wir verwenden nur .html -, .css-und script-Dateien (keine .jsp).
Dies ist return "static/pages/savepassword.html";
wie ich versuchte, einen redirect zu savepassword
Also 1. Frage wie kann ich die Umleitung korrekt in diesem Fall?
Nächstes Frühjahr nicht finden, meine html-Dateien. Ich habe diese Struktur
Lese ich, dass der Frühling finden sollten alle statischen Dateien, die im "statischen" automatisch, aber es funktioniert nicht. Also habe ich versucht zu konfigurieren, meine ViewControllerRegistry und 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);
}
Wenn ich rufe "static/pages/login.html" nicht direkt, es funktioniert. Wenn ich anrufen möchte "/login", heißt es 404.
2. Frage: Was muss ich konfigurieren muss, und was nicht?
UPDATE-1: Spring Security
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
Ich aktualisiert meine Struktur, aber immer noch Probleme mit der Umleitung von /login, um die benutzerdefinierte login -.
UPDATE-3
Ich hatte einen Blick auf den 2. Kommentar von Bob Schilde: https://spring.io/blog/2013/12/19/serving-static-web-content-with-spring-boot
Ich habe die folgenden:
@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);
}
Ich .html denn sonst /login verursachen würde rekursive Probleme. Mit dieser config kann ich eingeben /login und /templates/login.html aufgerufen werden (gleiche für savepassword.html).
Nun, ich würde gerne wissen, wie meine css/js in html:
<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>
Funktioniert das nicht...aber ich kann meine Skripte direkt mit /scripts/login.js.
- Können Sie versuchen, mit /login.html?
- Nein, denn Standard-Spring Security-Seite kommt. Regelmäßig können unsere eigene login.html (static/pages/login.html) erscheinen sollte. Ich aktualisiert meine Antwort, damit Sie sehen können, die spring-security-config. Ich dachte, dass die
ViewControllerRegistry
behebt login-statisch/pages/login,html und würde diese login-Seite - Ich kann die statische Ordner in src/main/ressource anstatt in webapp?
- Können Sie versuchen, indem eine Seite direkt unter webapp-Ordner und auf Sie verweisen mit /login.html?
- Ich deaktiviert spring security, kann aber nicht zugreifen, wenn Sie setzen eine html-Datei direkt in "Ressourcen".
Du musst angemeldet sein, um einen Kommentar abzugeben.
Meiner Meinung nach ist es besser, um Ihre *.HTML-Dateien in Ihrem Ordner "resources" mit allen statischen CSS-SCHRIFTARTEN und so weiter wie im Bild unten. In der webapp können Sie eine WEB-INF-Ordner nur.
Ich bin mit dieser Art von Struktur, und ich habe keine Probleme mit irgendwelchen css-Klassen oder htmls und ich keine Erweiterungen am Ende in java ("static/pages/login.html" wie bei Euch). Wenn ich für den Zugriff auf html gehe ich wie "user/someHtml" wenn es im Ordner user für ex.
Ich weiß, diese Antwort ist nicht genau das gesuchte, aber es kann helfen, Sie in irgendwie.
BEARBEITEN: Jetzt für den :
Können sagen, Sie haben eine Controller:
Nun Ihre addViewController Karte wie folgt Aussehen :
Sehen Sie in Ihrem addViewController Sie versuchen, Zugriff auf einen CONTROLLER nicht eine HTML-öffnen Sie Ihre HTML durch den CONTROLLER, dem Sie den Zugang von der Methode addViewControllers.
UPDATE:
Wenn Sie Ihr CSS in Eure static-Ordner in Ressourcen wie :
Können Sie einfach Zugang zu Ihnen so :
Hoffe, das hilft!
@RestController
implementiert@RestBody
. Wenn ich einen Dienst aufrufen, das ist abgebildet in@RequestMapping
, Feder automatisch wird der Rückgabewert auf@ResponseBody
. Habe ich habe die@RestController
Recht? Meine Frage wäre: Wie kann ich das überschreiben der@ResponseBody
, die ist automatisch, intern set von@RestController
für einen service?Ok, jetzt hab ich Total bekam es. Ich versuche, genau zu sein wie möglich.
Meine endgültige Struktur
1. Statische Ressourcen
Frühling hat einige Standard-Konfiguration, wo Sie Ihre statische Ressourcen, ohne ihn zu konfigurieren. Müssen Sie erstellen die Ordner in src/main/resources
Haben Sie einen Blick hier im Frühjahr Doku. Für ein Beispiel, überprüfen Sie das 2. Kommentar von Bob Schilde:
Ich legte meine Ordner "scripts" und "stylesheets" in den statischen Ordner. Wenn ich wollen, um Dateien aus diesen Ordnern in html, die Quelle sieht aus wie
src="scripts/file.js"
da die Dateien und Ordner instatic
sind direkt verwurzelt zuhost/scripts/file.js
Keine ResourceHandlerRegistry war für mich notwendig!
2. View-Controller
Ich wollte auf mein root login.html auf /login savepassword.html zu /savepassword und meine index.html zu /. Hier ist was ich getan habe:
Ich *.html weil ich sonst ein problem hatte, dass der Frühling nicht wusste zu unterscheiden zwischen " /login und der login(.html).
Wie Sie sehen können, legte ich den index.html in einem anderen Ordner namens "loggedin". Dieser Ordner ist in meinen public-Ordner (gefunden durch Frühling, siehe 1.). Warum mache ich das? Haben einen Blick auf 3.
3. Spring Security
Erste, ich möchte, dass ein Benutzer immer eingeloggt sein muss, bevor er den Besuch anderer Websites. So alle Ressourcen für die loginpage zur Verfügung stehen muss.
Dieses Stück code macht jede Datei in stylesheets und Skripte zugänglich. Denken Sie daran stylesheets und scripts-Ordner platziert sind statisch. Ich musste "/login", weil der benutzerdefinierten loginpage.
Ehrlich gesagt dachte ich, dass die
.loginPage("/login").permitAll();
Zugriff, aber es funktioniert nicht. Ohne es Frühling versucht, Zugriff auf die "/login", kann aber nicht dazu führen, dass keine Rechte " und dann werden automatisch umgeleitet zur login => ERR_TOO_MANDY_REDIRECTS."/Benutzer/**" ist nur für einige meiner Leistungen, die jeder Benutzer verwenden kann.
Wie Sie sehen können, ich gebe nicht auf "loggedin"-Ordner, so dass jeder Besucher die Möglichkeit geben Dateien in "loggedin" nur, wenn er loggedin 😉
4. Umleitung
Nur ich war mein ganzes controller mit @RequestController, die implementiert @ResponseBody. Wenn ich einen String zurückgeben wie zurück
"redirect:/savepassword";
Frühling diesen als ResponseBody und es als String interpretiert werden/Json(?).Ich musste mark den controller als @Controller und set @ResponseBody zu jedem service, die Rückkehr des json oder sth. Mein service soll, die Umleitung war nur gekennzeichnet mit @RequestMapping und method=RequestMethod.BEKOMMEN. Endlich habe ich einen String zurückgeben wie
return "redirect:/savepassword";
Dies wird Frühjahr umleiten zu /savepassword, die eigentlich platziert insrc/main/resources/public/savepassword.html
.Endlich, es funktioniert, und es war schon schwer genug zu finden, wie der Frühling dient der Dateien. Ich hoffe, es hilft someoneelse 🙂