有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在websphere中将响应代码403替换为404

https://mywebsite.com/contextroot/basic.html

上面的url工作正常,因为我的项目有基本的。“deployedResources/webapp”下的html

但是当我以“https://mywebsite.com/contextroot/basic.html/”的形式输入url时

我得到403禁止,在这里我添加了“/”的网址

当一些人向url添加“/”时,如何使服务器将响应代码“403禁止”替换为“404未找到页面”

我们在项目中使用websphere、jsp和servlet


共 (2) 个答案

  1. # 1 楼答案

    对于WebSphere中的这种情况,web容器使用HttpServetResponse发送403响应代码。sendError(int,String)方法。因此,您可以使用过滤器和HttpServletResponseWrapper修改响应代码。过滤器用HttpServletResponseWrapper替换响应对象,然后覆盖sendError方法。例如,此HttpServletResponseWrapper:

    package wrappers;
    
    import java.io.IOException;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import javax.servlet.http.HttpServletResponseWrapper;
    
    public class SendErrorResponseWrapper extends HttpServletResponseWrapper {
    
        HttpServletRequest _request;
        HttpServletResponse _wrappedResponse;
    
        public SendErrorResponseWrapper(HttpServletRequest request, HttpServletResponse response) {
    
            super(response);
    
            _request= request;
            _wrappedResponse= response;
        }
    
        @Override
        public void sendError(intstatus) throwsIOException {
    
            String path = _request.getServletPath() + _request.getPathInfo();
    
            if(status == 403 && path.endsWith("html/")) {
                _wrappedResponse.sendError(404);
            } else{
                _wrappedResponse.sendError(status);
            }
        }
    
        @Override
        public void sendError(intstatus, String msg) throwsIOException {
    
            String path = _request.getServletPath() + _request.getPathInfo();
    
            if(status == 403 && path.endsWith("html/")) {
                _wrappedResponse.sendError(404, msg);
            } else{
                _wrappedResponse.sendError(status, msg);
            }
        }
    
    }
    

    它通过此筛选器添加到请求处理中:

    package filter;
    
    import java.io.IOException;
    
    import javax.servlet.Filter;
    import javax.servlet.FilterChain;
    import javax.servlet.FilterConfig;
    import javax.servlet.ServletException;
    import javax.servlet.ServletRequest;
    import javax.servlet.ServletResponse;
    import javax.servlet.annotation.WebFilter;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import wrappers.SendErrorResponseWrapper;
    
    @WebFilter(urlPatterns = "/*")
    public class SendErrorFilter implements Filter {
    
        @Override
        public void destroy() {
        }
    
        @Override
        public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
    
            SendErrorResponseWrapper responseWrapper = new SendErrorResponseWrapper((HttpServletRequest) request, (HttpServletResponse) response);
    
            chain.doFilter(request, responseWrapper);
        }
    
        @Override
        public void init(FilterConfig arg0) throws ServletException {
    
        }
    
    }
    

    注:

    筛选器urlPatterm必须为/*以确保为错误请求调用它。如果模式是。html将不会为错误请求调用筛选器,“.html/”不是有效的URL模式

    如果请求是针对以“html/”结尾的资源,则响应包装器将覆盖sendError方法,并将403响应代码更改为404,否则将其保持原样。然而,“html\”的测试有些简单,因为您可能需要它来处理其他静态文件类型或其他类似情况,在这些情况下对于静态文件请求,webcontainer将返回403。基本上,在以下条件下,静态文件请求会得到403:

    • 路径包含“.”但不开始“/…”
    • 路径以“\”和“.”结尾或“/”

    但是,过滤器的难点在于确保其不会更改响应代码,例如,对于路径以“/”结尾的servlet请求,因为这样的请求是有效的。因此,简单地测试以“/”结尾的请求路径过于笼统,在设置测试时必须了解应用程序打算提供哪些静态资源

  2. # 2 楼答案

    尝试将此添加到您的web。xml

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

    并创建错误404。html文件