我正在使用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文件并改为使用初始化程序类。
有什么想法吗?
答案 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?
- 制作过滤器
- 使用HttpServletResponseWrapper并覆盖sendError()和setStatus()
- 通过chain.doFilter(req,wrapper)传递包装的响应
- 如果您在包装器中收到sendError(),请查看它是否为404。
- 采取适当的回应。
醇>
答案 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());