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

标签 java jsp servlets websphere

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

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

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

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

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

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

最佳答案

对于 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。

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

  • 路径包含“..”但不以“/...”开头
  • 路径以“\”、“.”结尾或“/”

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

关于java - 在 websphere 中将响应代码 403 替换为 404,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34684655/

相关文章:

java - Spring - 在jsp文件上显示图像

java - 表单提交两次并使用 null 值并给出 500 错误

java - Servlet 和资源文件

Java JSON 对象扁平化

java - 如何在 Windows 上将 ActiveMQ 安装为 64 位服务?

java - 使用 javascript 在 JSP 中仅允许 0-9 位数字(甚至不包括 '.' [Dot])的正则表达式

javascript - 如何从 Controller 返回 jsp 作为弹出窗口

java - 应该为游戏中的所有图像制作一个大纹理图集,还是为每个屏幕制作一个纹理图集?

junit 中的 java.lang.NoClassDefFoundError

java - iggrid 使用 servlet 作为数据源时出现空值失败