#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); } }
Комментариев нет:
Отправить комментарий