“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
答案 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文件。