Usando o Spring MVC 3.1+ WebApplicationInitializer para configurar programaticamente session-config e página de erro

O WebApplicationInitializer fornece uma maneira de representar programaticamente uma boa parte de um arquivo web.xml padrão – os servlets, filtros, ouvintes.

No entanto, não consegui descobrir uma boa maneira de representar esses elementos (session-timeout, error-page) usando o WebApplicationInitializer, é necessário manter um web.xml para esses elementos?

 30   java.lang.Exception /uncaughtException   404 /resourceNotFound  

Eu fiz um pouco de pesquisa sobre este tópico e descobri que para algumas das configurações como sessionTimeOut e páginas de erro você ainda precisa ter o web.xml.

Olhe para este Link

Espero que isso ajude você. Felicidades.

Usando spring-boot é muito fácil.

Tenho certeza de que isso poderia ser feito sem a boot da primavera, estendendo o SpringServletContainerInitializer . Parece que é para isso que é especificamente projetado.

Servlet 3.0 ServletContainerInitializer projetado para oferecer suporte à configuração baseada em código do contêiner do servlet usando o SPI do WebApplicationInitializer do Spring, em oposição a (ou possivelmente em combinação com) a abordagem tradicional baseada no web.xml.

Exemplo de código (usando SpringBootServletInitializer)

 public class MyServletInitializer extends SpringBootServletInitializer { @Bean public EmbeddedServletContainerFactory servletContainer() { TomcatEmbeddedServletContainerFactory containerFactory = new TomcatEmbeddedServletContainerFactory(8080); // configure error pages containerFactory.getErrorPages().add(new ErrorPage(HttpStatus.UNAUTHORIZED, "/errors/401")); // configure session timeout containerFactory.setSessionTimeout(20); return containerFactory; } } 

Na verdade, o WebApplicationInitializer não fornece isso diretamente. Mas há uma maneira de definir sessointimeout com a configuração do java.

Você precisa criar um HttpSessionListner primeiro:

 import javax.servlet.http.HttpSessionEvent; import javax.servlet.http.HttpSessionListener; public class SessionListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent se) { //here session will be invalidated by container within 30 mins //if there isn't any activity by user se.getSession().setMaxInactiveInterval(1800); } @Override public void sessionDestroyed(HttpSessionEvent se) { System.out.println("Session destroyed"); } } 

Depois disso, apenas registre este ouvinte com o contexto do servlet, que estará disponível no WebApplicationInitializer sob o método onStartup

 servletContext.addListener(SessionListener.class); 

Estendendo no comentário do BwithLove, você pode definir a página de erro 404 usando a exceção e o método do controlador que é @ExceptionHandler:

  1. Ative o lançamento de NoHandlerFoundException no DispatcherServlet.
  2. Use @ControllerAdvice e @ExceptionHandler no controlador.

Classe WebAppInitializer:

 public class WebAppInitializer implements WebApplicationInitializer { @Override public void onStartup(ServletContext container) { DispatcherServlet dispatcherServlet = new DispatcherServlet(getContext()); dispatcherServlet.setThrowExceptionIfNoHandlerFound(true); ServletRegistration.Dynamic registration = container.addServlet("dispatcher", dispatcherServlet); registration.setLoadOnStartup(1); registration.addMapping("/"); } private AnnotationConfigWebApplicationContext getContext() { AnnotationConfigWebApplicationContext context = new AnnotationConfigWebApplicationContext(); context.setConfigLocation("com.my.config"); context.scan("com.my.controllers"); return context; } } 

Classe do controlador:

 @Controller @ControllerAdvice public class MainController { @RequestMapping(value = "/") public String whenStart() { return "index"; } @ExceptionHandler(NoHandlerFoundException.class) @ResponseStatus(value = HttpStatus.NOT_FOUND) public String requestHandlingNoHandlerFound(HttpServletRequest req, NoHandlerFoundException ex) { return "error404"; } } 

“error404” é um arquivo JSP.

Em web.xml

  3 -->     

Classe de ouvinte

 public class ProductBidRollBackListener implements HttpSessionListener { @Override public void sessionCreated(HttpSessionEvent httpSessionEvent) { //To change body of implemented methods use File | Settings | File Templates. } @Override public void sessionDestroyed(HttpSessionEvent httpSessionEvent) { HttpSession session=httpSessionEvent.getSession(); WebApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(session.getServletContext()); ProductService productService=(ProductService) context.getBean("productServiceImpl"); Cart cart=(Cart)session.getAttribute("cart"); if (cart!=null && cart.getCartItems()!=null && cart.getCartItems().size()>0){ for (int i=0; i 
    Intereting Posts