Ответ 1
Я немного поработал над этой темой и обнаружил, что для некоторых конфигураций, таких как sessionTimeOut и страниц с ошибками, вам все равно нужно иметь web.xml.
Посмотрите на Ссылка
Надеюсь, это поможет вам. Приветствия.
WebApplicationInitializer обеспечивает способ программного представления хорошей порции стандартного файла web.xml - сервлетов, фильтров, прослушивателей.
Однако мне не удалось найти хороший способ представления этих элементов (session-timeout, error-page) с помощью WebApplicationInitializer, необходимо ли поддерживать web.xml для этих элементов?
<session-config>
<session-timeout>30</session-timeout>
</session-config>
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/uncaughtException</location>
</error-page>
<error-page>
<error-code>404</error-code>
<location>/resourceNotFound</location>
</error-page>
Я немного поработал над этой темой и обнаружил, что для некоторых конфигураций, таких как sessionTimeOut и страниц с ошибками, вам все равно нужно иметь web.xml.
Посмотрите на Ссылка
Надеюсь, это поможет вам. Приветствия.
Использование spring -boot довольно легко.
Я уверен, что это можно сделать без загрузки spring, расширив SpringServletContainerInitializer. Кажется, это то, для чего он специально предназначен.
Servlet 3.0 ServletContainerInitializer предназначен для поддержки кода конфигурация контейнера сервлета с помощью Spring 's WebApplicationInitializer SPI в отличие от (или, возможно, сочетание с) традиционным подходом, основанным на web.xml.
Пример кода (с использованием 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;
}
}
Фактически WebApplicationInitializer
не предоставляет его напрямую. Но есть способ установить sessointimeout с конфигурацией java.
Сначала вы должны создать HttpSessionListner
:
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");
}
}
После этого просто зарегистрируйте этот прослушиватель с вашим контекстом сервлета, который будет доступен в WebApplicationInitializer
в методе onStartup
servletContext.addListener(SessionListener.class);
Расширяя комментарий BwithLove, вы можете определить страницу ошибок 404 с использованием метода исключения и контроллера, который является @ExceptionHandler:
Класс 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;
}
}
Класс контроллера:
@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" - это JSP файл.
В web.xml
<session-config>
<session-timeout>3</session-timeout>
</session-config>-->
<listener>
<listenerclass>
</listener-class>
</listener>
Класс слушателя
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<cart.getCartItems().size();i++){
CartItem cartItem=cart.getCartItems().get(i);
if (cartItem.getProduct()!=null){
Product product = productService.getProductById(cartItem.getProduct().getId(),"");
int stock=product.getStock();
product.setStock(stock+cartItem.getQuantity());
product = productService.updateProduct(product);
}
}
}
}
}