我使用弹簧靴和角在前端。有时我想直接从服务中重定向。我们只使用.html、.css和脚本文件(不使用.jsp)。
这就是return "static/pages/savepassword.html";我如何尝试重定向到savepassword
所以第一个问题在这种情况下我如何正确地重定向?
接下来,Spring找不到我的html文件。我有这个结构

我读到spring应该自动找到“静态”中的所有静态文件,但是它没有。
@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
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,我做了以下几点:
@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中。
<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直接调用我的脚本。
发布于 2016-03-02 22:31:56
好吧,现在我完全明白了。我尽量说得具体些。
我的最终结构

1.静态资源
Spring有一些默认配置,您可以在不配置它的情况下放置静态重新源。您需要在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根到/。以下是我所做的:
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.弹簧安全
.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是如何服务这些文件的。我希望它能对其他人有所帮助:)
发布于 2016-03-02 15:15:52
在我看来,最好将*.HTML文件与所有静态CSS字体一起放在资源文件夹中,如下图所示。在webapp中,您可以只有一个WEB文件夹。
我正在使用这种结构,我没有问题找到任何类css或htmls,并且我在java中没有使用扩展(“static/page/login.html”和您的一样)。如果我想访问html,我就像" user /someHtml“一样,如果它位于ex的文件夹用户中。
我知道这个答案并不是你想要的,但它可能在某种程度上对你有所帮助。

编辑:现在用于:
@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。
更新:
如果将CSS放入资源中的静态文件夹中,如:

您可以这样简单地访问它们:
<link rel="stylesheet" th:href="@{/css/bootstrap-datetimepicker.min.css}" />希望这能有所帮助!
https://stackoverflow.com/questions/35750114
复制相似问题