如何在没有web.xml的情况下以编程方式设置session-timeout,error-pages

时间:2012-07-24 15:31:44

标签: spring spring-mvc

我正在使用Spring MVC并成功设置了一个WebApplicationInitializer(使用Tomcat的ServletContainerInitializer),没有任何web.xml文件。添加过滤器(如Spring Security)和servlet(如Dispatcher)是没有问题的,它们工作正常。如果我需要,我也可以设置init-params。

我无法弄清楚如何设置web.xml中通常存在的一些特殊标记。例如,我想设置一个自定义403错误页面。通常我会在web.xml中执行以下操作:

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

但我无法弄清楚如何在WebApplicationInitializer(可以访问ServletContext)中执行此操作。

我对session-timeout和welcome-files有同样的问题。我已经搜索了大约两天,但仍然没有看到这个以编程方式完成。目标是完全删除web.xml文件并改为使用初始化程序类。

有什么想法吗?

5 个答案:

答案 0 :(得分:7)

通过WebApplicationInitializer看起来不可能这样做,你必须坚持使用web.xml专门针对此配置以及此问题列出的其他一些内容 - Using Spring MVC 3.1+ WebApplicationInitializer to programmatically configure session-config and error-page

答案 1 :(得分: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);

答案 2 :(得分:1)

你可以使用这样的想法:

@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);
}

答案 3 :(得分:0)

对于页面错误,请参阅以下答案:How to make a filter to detect if the user requested a page that is not found?

  
      
  1. 制作过滤器
  2.   
  3. 使用HttpServletResponseWrapper并覆盖sendError()和setStatus()
  4.   
  5. 通过chain.doFilter(req,wrapper)传递包装的响应
  6.   
  7. 如果您在包装器中收到sendError(),请查看它是否为404。
  8.   
  9. 采取适当的回应。
  10.   

答案 4 :(得分:-1)

您应该尝试创建自己的SessionListener,然后将其添加到WebApplicationInitializer的servletContext中。

这样的事情:

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");
    }
}

然后在您的WebContentInitializer中添加以下行:

servletContext.addListener(new SessionListener());