2016-03-02 3 views
3

Я использую весенний ботинок и угловой в переднем конце. Иногда я хочу перенаправить непосредственно из службы. Мы используем только файлы .html, .css и script (нет .jsp).не удается найти html-страницы с пружинным ботинком

Это return "static/pages/savepassword.html"; как я попытался перенаправить savepassword

Так 1-ый вопрос, как я могу переадресовать правильно в этом случае?

Далее, 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» напрямую, она работает. Когда я хочу позвонить «/ login», он говорит 404. 2-й вопрос: что мне нужно настроить, а что нет?

ДОПОЛНЕНО-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(); 

ДОПОЛНЕНО-2 Я обновил свою структуру, но все еще есть проблемы с перенаправлением из/входа в пользовательский логин. enter image description here

ДОПОЛНЕНО-3 Я посмотрел на 2 комментария Боб Шилдс: 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).

Теперь я хотел бы знать, как включить мои 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> 

Это не работает ... но я Cann называть мои сценарии непосредственно с/скриптов/логин .js.

+0

Можете ли вы попробовать с /login.html? –

+0

Нет, поскольку появляется страница Spring Spring по умолчанию. Регулярно, наш пользовательский login.html (static/pages/login.html) должен появиться. Я обновил свой ответ, чтобы вы могли увидеть конфигурацию безопасности пружины. Я думал, что 'ViewControllerRegistry' разрешает вход в static/pages/login, html и занимает эту страницу входа – Andy

+0

Возможно, мне нужно поставить статическую папку в src/main/ressource вместо того, чтобы вставлять в webapp? – Andy

ответ

2

Хорошо, теперь я полностью его получил. Я стараюсь быть конкретным, насколько это возможно.

Моя конечная структура

structure

1. Статический Ressources

Spring имеет некоторую конфигурацию по умолчанию, где вы можете поместить ваши статические RESSOURCES без его настроить. Вы должны создать эти папки в SRC/основные/ресурсы

  • /META-INF/ресурсы/
  • ресурсы (да, папка дополнительные ресурсы в SRC/основные/ресурсов
  • статических
  • общественного

Посмотрите here in Spring Doku. Для примера, проверьте 2-й комментарий Бобом Шилдс:

После создания кучи файлов «findme.txt», каждый из которых имели различную «источник-относительный» строка пути внутрь, я обнаружил, что следующие места могут быть выбраны с «http://host/findme.txt» являются:

ЦСИ /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. View Controller

Я хотел укоренить мой 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». Эта папка верна в моей общей папке (найдена весной, см. 1.). Почему я это делаю? Посмотрите 3.

3. Spring Security

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

Во-первых, я хочу, чтобы пользователь всегда должен быть зарегистрирован прежде, чем он сможет посещать любые другие сайты. Поэтому все ресурсы для входа в систему должны быть доступны.

Этот фрагмент кода обеспечивает доступ к каждому файлу в таблицах стилей и сценариев. Помните, что таблицы стилей и скриптов находятся в статике. Мне пришлось установить «/ login» из-за пользовательской страницы входа. Честно говоря, я думал, что .loginPage("/login").permitAll(); предоставит доступ, но это не так. Без него Spring пытается получить доступ к «/ login», но не может вызывать никаких прав, а затем автоматически перенаправляет логин => ERR_TOO_MANDY_REDIRECTS. «/ user/**» предназначен только для некоторых моих сервисов, которые каждый пользователь может использовать.

Как вы можете видеть, я не даю доступ к «LoggedIn» -folder, так что каждый посетитель может ввести файлы в «LoggedIn» только тогда, когда он LoggedIn;)

4. Перенаправление

Я только что пометил весь контроллер с помощью @RequestController, который реализует @ResponseBody. Когда я возвращаю String как return "redirect:/savepassword";, Spring установит это как ResponseBody и будет интерпретироваться как String/Json (?).

Я должен был пометить контроллер как @Controller и установить @ResponseBody для каждой службы, которая должна вернуть json или sth. Моя служба, которая будет перенаправлять, была отмечена только @RequestMapping и method = RequestMethod.GET. Наконец, я возвращаю String как return "redirect:/savepassword";. Это заставит Spring перенаправлять на/savepassword, который фактически помещается в src/main/resources/public/savepassword.html.

И, наконец, это работает, и было достаточно сложно найти, как весна служит файлам.Я надеюсь, что это поможет кому-то :)

3

По-моему, лучше разместить ваши * .HTML-файлы в папке ресурсов со всеми статическими CSS-шрифтами и т. Д., Как на рисунке ниже. В webapp вы можете иметь только папку WEB-INF.

Я использую такую ​​структуру, и у меня нет проблем с поиском каких-либо классов css или htmls, и я не использую расширения в конце в java («static/pages/login.html», как ваш). Если я хочу получить доступ к html, я поеду как «user/someHtml», если он находится в папке user for ex.

Я знаю, что этот ответ не тот, который вы ищете, но он может помочь вам каким-то образом.

enter image description here

EDIT: Теперь для:

@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 вы будете получить доступ к HTML через контроллер, для доступа к методу addViewControllers.

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» @Override общественных недействительного addViewControllers (ViewControllerRegistry реестр) { реестра. addViewController ("/") .setViewName ("forward:/user/showSomething"); registry.setOrder (Ordered.HIGHEST_PRECEDENCE); super.addViewControllers (реестр); } PS: Вам не хватает, возможно, «вперед», как в моем бывшем. Надеюсь это поможет. –

+0

Он просто не работает ... не может получить доступ к любому html ... даже без весенней безопасности и wihtout ViewControllerRegistry/ResourceHandlerRegistry – Andy

Смежные вопросы