当前位置: 首页 > 知识库问答 >
问题:

如何在没有web.xml的情况下以编程方式设置会话超时、错误页面

冉高寒
2023-03-14

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

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

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

但是我不知道如何在WebApplicationInitializer(可以访问ServletContext)中执行此操作。

我对会话超时和欢迎文件也有同样的问题。我已经搜索了大约两天,但仍然没有看到这是通过编程完成的。同样,我们的目标是完全删除web.xml文件,并使用initializer类。

有什么想法吗?

共有3个答案

谷梁卓
2023-03-14

你可以像这样使用somethink:

@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);
}
庾君博
2023-03-14
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);
闾丘博超
2023-03-14

看起来这不可能通过WebApplication ationLaunalizer实现,您必须坚持web.xml专门用于此配置以及与此问题一起列出的其他一些配置-使用Spring MVC 3.1 WebApplication ationLaunalizer以编程方式配置会话配置和错误页面

 类似资料:
  • 我知道这可以在Servlet3.0中通过@Webservlet注释实现,在这里您只需分配url模式,而不必在web.xml中进行任何配置。是否有一种方法可以通过编程方式为运行Servlet2.5的应用程序分配servlets url模式? 我正在创建一个库,多个应用程序将依赖于它,并试图使它,以便这些应用程序中的每一个都不必显式配置任何servlet url映射,我正在创建的库中的servlet在

  • 我花了过去几个小时试图设置2默认图像的nodejs 14和rethinkdb 2.3.5,所以很抱歉,如果语气有点沮丧,但我目前感到沮丧。 我的要求似乎超级简单。 下载nodejs 14和RejectDB 2.3.5的默认图像。 将我当前目录中的所有内容复制到nodejs 14映像中 我希望nodejs图像依赖于DB图像 在nodejs 14图像中运行2个命令<代码>npm ci和 请参阅测试中的

  • TL;DR:将@webservlet(“/find-customers”)放在servlet(通过Tomcat 7部署)的开头并不是将servlet映射到host:port/webproject/find-customers中,即使servlet位于src文件夹中。

  • 我需要在tomcat会话超时后向用户提供错误页面。因此,为了处理这个问题,我们创建了一个过滤器,并添加了一些逻辑来检测这个问题,在此之后,我要说的是转到错误页面。 在会话超时之后,我看到它将纠正“if”逻辑,并且它不会转发/重定向到我的error.jsp。它给出了一个404错误。我尝试了页面的重定向和转发,但都没有成功。我对error.jsp页面的绝对路径和相对路径都很累,但我仍然看到404错误,

  • < sub >(我已经知道了答案,但是因为我经常发现自己在重新寻找答案,所以我把它贴在这里作为自己和他人的文档。这是Stackoverflow上鼓励的。) 许多 Servlet 开发人员都读过《Head First Serlet》一书 在Servlet 2.4及更低版本中,web.xml用于完全配置Web应用程序。但是更高版本似乎有其他方法来配置Web应用程序,无需触及web.xml和注释。例如,

  • 我需要在代理后面使用Java以编程方式运行Jmeter。问题在于我需要使用HTTPS。 我已在以下网站阅读了手册:http://jmeter.apache.org/usermanual/get-started.html我已经使用Jmeter几个月了,感觉很舒服,但问题是在我需要切换到HTTPS时开始的。 我试过以下方法:(分别和一起) 添加了带有代理服务器详细信息的HTTP请求默认配置 将代理服务