当前位置: 首页 > 知识库问答 >
问题:

无法在Spring安全中加载静态内容

万俟震博
2023-03-14

我从这个来源构建了一个基本的spring身份验证服务:https://spring.io/guides/gs/securing-web/

试图使用stackoverflow上几乎所有的解决方案来包含本地文件夹中的JS文件,但是我做不到。当html页面加载时,它显示:< br >“未捕获的引用错误:未定义我的函数”

这是我的home.html剧本:

<html xmlns="http://www.w3.org/1999/xhtml" xmlns:sec="http://www.thymeleaf.org/thymeleaf-extras-springsecurity3">
    <head>
        <title>Spring Security Example</title>
        <script type="javascript" src="test.js"></script>
    </head>
    <body onload="myFunction()">
        <h1>Welcome!</h1>

        <p>Click <a href="/hello">here</a> to see a greeting.</p>
    </body>
</html>

这是我的js文件所在的位置,htmls被放置在模板文件夹中。

这是我的mvcConfig代码:

package hello;

import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;


@Configuration
public class MvcConfig implements WebMvcConfigurer {

    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/home").setViewName("home");
        registry.addViewController("/").setViewName("home");
        registry.addViewController("/hello").setViewName("redirect:http://localhost:3000/home.html");
        registry.addViewController("/login").setViewName("login");
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
    if (!registry.hasMappingForPattern("/webjars/**")) {
        registry.addResourceHandler("/webjars/**").addResourceLocations(
                "classpath:/META-INF/resources/webjars/");
    }
    if (!registry.hasMappingForPattern("/**")) {
        registry.addResourceHandler("/**").addResourceLocations("classpath:/META-INF/resources/", "classpath:/resources/","classpath:/static/", "classpath:/public/");
    }

    registry.addResourceHandler("/resources/**")
        .addResourceLocations("/resources/");


}

}

WebSecurityConfig代码:

package hello;

import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.security.config.annotation.web.builders.HttpSecurity;
import org.springframework.security.config.annotation.web.configuration.EnableWebSecurity;
import org.springframework.security.config.annotation.web.configuration.WebSecurityConfigurerAdapter;
import org.springframework.security.core.userdetails.User;
import org.springframework.security.core.userdetails.UserDetails;
import org.springframework.security.core.userdetails.UserDetailsService;
import org.springframework.security.provisioning.InMemoryUserDetailsManager;

@Configuration
@EnableWebSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {
    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http
            .authorizeRequests()
                .antMatchers("/", "/home","/resources/**").permitAll()
                .anyRequest().authenticated()
                .and()
            .formLogin()
                .loginPage("/login")
                .permitAll()
                .and()
            .logout()
                .permitAll();
    }

@Bean
@Override
public UserDetailsService userDetailsService() {
    UserDetails user =
         User.withDefaultPasswordEncoder()
            .username("user")
            .password("password")
            .roles("USER")
            .build();

    return new InMemoryUserDetailsManager(user);
}

}

共有2个答案

马凡
2023-03-14

在<code>WebSecurityConfig

对于< code>test.js文件,src指向当前url中的< code>test.js。因此,当您在localhost上运行它时,浏览器会尝试以< code > http://localhost:{ port }/{ current-page-URL }/test . js 的形式查找< code>test.js

例如,如果页面位于/home下,那么浏览器会调用http://localhost:8080/home/test.js,但正如您在WebSecurityConfig中定义的那样,除了/home本身之外的任何调用都将被Spring Security阻止。(/home/home/**不同)

所以你需要做的是将src url更改为

    registry.addResourceHandler("/resources/**")
    .addResourceLocations("classpath:/");

希望这有帮助!快乐编码:)

添加:

还有中的

施宏大
2023-03-14

无论 src/main/resources 中的文件夹是什么,都可以像这样配置它们,在安全配置类中创建此方法,通常我们将静态资源放在 src/main/resources 内的静态文件夹中。

//this method allows static resources to be neglected by spring security
        @Override
        public void configure(WebSecurity web) throws Exception {
            web
                .ignoring()
                .antMatchers("/resources/**", "/static/**", "/css/**", "/js/**", "/images/**","/assets/**","/fonts/**","/dis/**","/vendor1/**");
        }
 类似资料:
  • 我的问题很简单。我无法在Spring中加载静态资源,下面是我的配置文件。 dispatcher servlet。xml 网状物xml 我已将js和css文件放入/webapp/resources/css和/webapp/resources/js中。 我知道这个问题已经被解决了很多次,但我无法加载静态资源。我得到405浏览器上没有方法错误。 在网上尝试了所有其他解决方案。请告诉我哪里出了问题。对这些

  • 我将SpringMVC与Thymleaf和spring安全一起使用。我想加载一个页面使用Thymleaf模板,我可以加载我的静态资源。 例如,我想从template.html加载位于:static/img/theme/logo.png中的图片 我得到的是:结果 template.html: mvcConfig.java WebSecurityConfig: 源代码树

  • 我试图使用相对路径在jsp文件中加载静态资源,如css文件和javascript文件,但servlet映射似乎覆盖了对它们的映射。 项目结构: web.xml: mvc调度程序servlet。xml: 我尝试加载样式表的JSP文件: 我得到的错误是: 警告组织。springframework。网状物servlet。PageNotFound:1108-在名为“mvc dispatcher”的Disp

  • 在过去的几天里,我一直在和Spring保安公司战斗,所以我希望有人能在这里帮助我。 我正在使用Spring Boot 1.2.5 我使用的是Spring Actuator和Spring Remote Shell,它们已经从类路径中删除,认为它们可能会引起问题 我排除了SecurityAutoConfigsion,因为它可能会导致我的问题 这是我的主要课程 这是我的安全配置 我的问题/问题是 > C

  • 这个问题让我头疼。我有一个简单的controller类,它能够呈现一个简单的html页面以及Spring Boot初始化器类。 我已经将HTML页面放在src/main/resources目录下的静态文件夹中。但我无法获得html页面。相反,我得到了404个错误。 下面是我的项目的结构 simpleController.java: home.html: 运行Spring Boot时的控制台日志:

  • 注意: 本教程假定你已经下载和安装了CodeIgniter开发环境。 首先,你需要创建一个可以处理静态内容请求的控制器类。控制器,是一个用来代理完成某项任务的PHP类,它充当基于MVC架构应用程序的“粘合剂”(译者注:控制器用来粘合/协调不同模型和视图。随着教程的深入,你会更深刻的理解这一点)。 举例来说,假设存在某个针对如下URL的请求: http://example.com/news/late