Страницы

Поиск по вопросам

вторник, 31 марта 2020 г.

Spring как сделать один контроллер для всех страниц не перекрывая static?

#spring #spring_boot


Собственно есть конфигурация вида:

http.authorizeRequests()
        .antMatchers("/css/**").permitAll()
        .antMatchers("/js/**").permitAll()
        .antMatchers("/images/**").permitAll()
        .antMatchers("/extjs/**").permitAll()
        .antMatchers("/login/restore").anonymous()
        .antMatchers("/login/reg").anonymous()
        .antMatchers("/login/auth").anonymous()
        .anyRequest().authenticated()


И есть контроллер:

@Controller
@RequestMapping("/**")
public class Index {
    @GetMapping
    public String get() {
        return "index";
    }
}


Сейчас получается так, что из-за роутинга @RequestMapping("/**") перекрывается роутинг
для static файлов. Как этого избежать?
    


Ответы

Ответ 1



Добавьте в конфигурацию следующее: @Override public void configure(WebSecurity web) { web.ignoring().antMatchers("/js/**", "/css/**", "/images/**", "/extjs/**"); } А вот эту часть можно убрать : .antMatchers("/css/**").permitAll() .antMatchers("/js/**").permitAll() .antMatchers("/images/**").permitAll() .antMatchers("/extjs/**").permitAll()

Ответ 2



Вариант 1. Разместить все ресурсы в подпапках и добавить ResourceHandler с высоким приоритетом: @Configuration public class ResourceConfig extends WebMvcConfigurerAdapter { @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.setOrder(Ordered.HIGHEST_PRECEDENCE); registry.addResourceHandler("/css/**").addResourceLocations("classpath:/static/css/"); registry.addResourceHandler("/js/**").addResourceLocations("classpath:/static/js/"); registry.addResourceHandler("/images/**").addResourceLocations("classpath:/static/images/"); } } Вариант 2. Вручную проверить существование ресурса. (Не знаю как это скажется на производительности) @Controller public class IndexController { @GetMapping("/**") @ResponseBody public Object get(HttpServletRequest request) { ClassPathResource resource = new ClassPathResource("/static" + request.getRequestURI()); if (resource.exists()) { return resource; } return new ModelAndView("index"); } } Вариант 3. Если вы делаете одностраничное приложение, то, возможно, будет проще перечислить все возможные пути: @Controller public class IndexController { @GetMapping({"/page1/**", "/page2/**", "/page3/**"}) public String get() { return "index"; } }

Ответ 3



Не понятен смысл данного решения. Но все же, если Вы хотите конкретно рисовать компоненты в самой вьюхе и передавать в аргументы блоки (соответственно на фронте уже парсить их), то скудное решение в виде абстракции/наследования и возврат для любого реквеста в функцию commonPage Имхо public abstract class AbstractController { public String commonPage(ModelMap map) { map.addAttribute("commonObject", new Object()); ..... map.addAttribute("page", "/templates/someHtmlOrJsp.html|.jsp"); ..... return "index"; } } SampleController @Controller @RequestMapping("/") public class SampleController extends AbstractController { @RequestMapping(method = {GET, HEAD}) public String index(ModelMap map) { map.addAttribute("somePageObject", new Object()); .... return commonPage(map); } }

Комментариев нет:

Отправить комментарий