在websphere中用404替换响应代码403

时间:2016-01-08 19:30:24

标签: java jsp servlets websphere

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

上面的网址工作正常,因为我的项目在“deployedResources / webapp”下有basic.html

但是当我输入网址为“https://mywebsite.com/contextroot/basic.html/

我得到了403禁止,在这里我已经在网址中添加了“/”。

当有些人将“/”添加到网址

时,如何让服务器将响应代码“403 forbidden”替换为“404 page not found”

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

2 个答案:

答案 0 :(得分:4)

对于WebSphere中的这种情况,Web容器使用HttpServetResponse.sendError(int,String)方法发送403响应代码。因此,您可以使用过滤器和HttpServletResponseWrapper修改响应代码。 Filter用您的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 /”无效urlPattern。

响应包装器会覆盖sendError方法,如果请求是针对结尾为“html /”的资源,则将403响应代码更改为404,否则保留原样。但是,对“html”的测试有点过分了,因为您可能需要将其用于其他静态文件类型或其他类似场景,其中webcontainer将返回403以获取静态文件请求。在这些条件下,基本上你得到一个403的静态文件请求:

  • 路径包含“..”但不会启动“/ ...”
  • 路径以“\”,“。”或“/”
  • 结尾

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

答案 1 :(得分:-1)

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

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

并创建error404.html文件。