복붙노트

[SPRING] Spring 4.x Java 코드 기반 구성 : 정적 리소스 파일 및 Dispatcher 서블릿 [duplicate]

SPRING

Spring 4.x Java 코드 기반 구성 : 정적 리소스 파일 및 Dispatcher 서블릿 [duplicate]

Servlet 버전 3.0 이전의 모든 구성은 XML 기반입니다. 현재 코드 / 주석 기반 구성을 사용하고 있습니다.

xml 스타일 구성에서 우리는

<mvc:resources mapping="/res/**" location="/res/" />

코드 기반 구성으로 변환하려면 어떻게해야합니까? 내가 eclipse 디버그 콘솔에서 리소스 파일에 대한 디스패처 서블릿을 찾을 수 없다는 오류가 발생합니다.

BTW, 나의 참고 자료, Spring Security 3.x에서 4.x 로의 마이그레이션 (Java Configuration)

이니셜 라이저

public class AppInitializer extends
        AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { SecurityConfig.class };
    }

    @Override
    protected Class<?>[] getServletConfigClasses() {
        return new Class[] { MvcConfig.class };
    }

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }
}

mvc config

@EnableWebMvc
@ComponentScan({ "com.appname.controller" })
public class MvcConfig {
    @Bean
    public InternalResourceViewResolver viewResolver() {
        InternalResourceViewResolver resolver = new InternalResourceViewResolver();
        resolver.setPrefix("/WEB-INF/jsp/");
        resolver.setSuffix(".jsp");
        return resolver;
    }
}

보안 설정

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true, jsr250Enabled = true)
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth)
            throws Exception {
        auth.inMemoryAuthentication().withUser("user").password("password")
                .roles("USER");
    }

    @Override
    protected void configure(HttpSecurity http) throws Exception {
        http.authorizeRequests()
            .antMatchers("/res/**").permitAll()
            .and().authorizeRequests()
            .anyRequest().hasRole("USER")
            .and().formLogin().loginPage("/account/signin").permitAll()
            .and().logout().permitAll();
    }
}

보안 이니셜 라이저

public class SecurityInitializer extends
        AbstractSecurityWebApplicationInitializer {

}

사용자 정의 로그인

public class CustomUserDetailsService implements UserDetailsService {

    private AccountRepository accountRepository;

    public CustomUserDetailsService() {
        this.accountRepository = new AccountRepository();
    }

    @Override
    public UserDetails loadUserByUsername(String email)
            throws UsernameNotFoundException {

        Account account = accountRepository.getAccountByEmail(email);

        if (account == null) {
            throw new UsernameNotFoundException("Invalid email/password.");
        }

        Collection<GrantedAuthority> authorities = new ArrayList<GrantedAuthority>();
        authorities.add(new SimpleGrantedAuthority("USER"));

        return new User(account.getEmail(), account.getPassword(), authorities);
    }
}

해결법

  1. ==============================

    1.WebMvcConfigurerAdapter에서 확장하고 addResourceHandlers 메서드를 재정의 할 수 있습니다.

    WebMvcConfigurerAdapter에서 확장하고 addResourceHandlers 메서드를 재정의 할 수 있습니다.

    @EnableWebMvc
    @ComponentScan({"com.appname.controller"})
    public class MvcConfig extends WebMvcConfigurerAdapter {
    
        @Bean
        public InternalResourceViewResolver viewResolver() {
            InternalResourceViewResolver resolver = new InternalResourceViewResolver();
            resolver.setPrefix("/WEB-INF/jsp/");
            resolver.setSuffix(".jsp");
            return resolver;
        }
    
        @Override
        public void addResourceHandlers(ResourceHandlerRegistry registry) {
            registry
                    .addResourceHandler("/res/**")
                    .addResourceLocations("/res/");
        }
    }
    
  2. from https://stackoverflow.com/questions/29515202/spring-4-x-java-code-based-configuration-static-resource-files-and-dispatcher-s by cc-by-sa and MIT license