2012-07-24 12 views
8

Używam Spring MVC i pomyślnie skonfigurowałem WebApplicationInitializer (przy użyciu ServletContainerInitializer firmy Tomcat), bez żadnego pliku web.xml. Dodawanie filtrów (takich jak Spring Security) i serwletów (takich jak Dispatcher) nie stanowi problemu i działają dobrze. Mogę również ustawić init-params, jeśli muszę to zrobić.Jak programowo ustawić limit czasu sesji, strony błędów bez web.xml

Nie mogę sobie wyobrazić, jak skonfigurować niektóre specjalne znaczniki, które normalnie istnieją w pliku web.xml. Na przykład chciałbym ustawić niestandardową stronę błędu 403. Zazwyczaj będzie to zrobić w web.xml z:

<error-page> 
    <error-code>403</error-code> 
    <location>/accessDenied.html</location> 
</error-page> 

Ale nie mogę dowiedzieć się, jak to zrobić wewnątrz WebApplicationInitializer (który ma dostęp do ServletContext).

Mam taki sam problem z plikami time-out i powitaniem. Szukałem około dwóch dni, ale nadal nie widziałem tego zrobionego programowo. Ponownie celem jest całkowite usunięcie pliku web.xml i użycie zamiast tego klasy inicjatora.

Wszelkie pomysły?

Odpowiedz

2
StandardEngine standardEngine = (StandardEngine)MBeanServerFactory.findMBeanServer(null).get(0).getAttribute(new ObjectName("Catalina", "type", "Engine"), "managedResource"); 

// This is totally irresponsible and will only work if this webapp is running on the default host 
StandardContext standardContext = (StandardContext)standardEngine.findChild(standardEngine.getDefaultHost()).findChild(servletContext.getContextPath()); 

ErrorPage errorPage404 = new ErrorPage(); 
errorPage404.setErrorCode(404); 
errorPage404.setLocation("/404"); 
standardContext.addErrorPage(errorPage404); 
+0

człowiek działał świetnie – kakabali

1

Można użyć somethink tak:

@WebFilter(filterName = "ErrorPageFilter", urlPatterns = "/*") 
public class ErrorPageFilter extends BaseHttpFilter { 

private GlobalErrorHandler globalErrorHandler; 

@Override 
public void init(FilterConfig filterConfig) throws ServletException { 
    globalErrorHandler = BeansUtil.getBean(filterConfig.getServletContext(), GlobalErrorHandler.class); 
} 

@Override 
protected void doHttpFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain) throws IOException, ServletException { 
    chain.doFilter(request, new ErrorPageHttpServletResponseWrapper(request, response)); 
} 

private class ErrorPageHttpServletResponseWrapper extends HttpServletResponseWrapper { 
    HttpServletRequest request; 

    public ErrorPageHttpServletResponseWrapper(HttpServletRequest request, HttpServletResponse response) { 
     super(response); 
     this.request = request; 
    } 

    @Override 
    public void sendError(int sc) throws IOException { 
     globalErrorHandler.handleError(sc, request, this); 
    } 

    @Override 
    public void sendError(int sc, String msg) throws IOException { 
     sendError(sc); 
    } 
} 
} 

public interface GlobalErrorHandler { 

void handleError(int responseCode, HttpServletRequest request, HttpServletResponse httpServletRequest) throws IOException; 

void addHandler(int responseCode, String handlerDescription); 
} 
+0

To wygląda na naprawdę rozwiązanie tego problemu. –

0

Należy starać tworzenie własnych SessionListener a następnie dodać go do ServletContext swojej WebApplicationInitializer ..

coś takiego:

import javax.servlet.http.HttpSessionEvent; 
import javax.servlet.http.HttpSessionListener; 

public class SessionListener implements HttpSessionListener { 

    public void sessionCreated(HttpSessionEvent evt) { 
     System.out.println("Session created"); 
     evt.getSession().setMaxInactiveInterval(30 * 60); // That means 30 minutes. 
    } 

    public void sessionDestroyed(HttpSessionEvent evt) { 
     System.out.println("Session destroyed"); 
    } 
} 

A następnie w swojej WebContentInitializ er dodaj tę linię:

servletContext.addListener(new SessionListener()); 
Powiązane problemy