"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/