Java 捕获阻止加载资源的所有Servlet
我使用的是一个全面的servlet:Java 捕获阻止加载资源的所有Servlet,java,html,servlets,Java,Html,Servlets,我使用的是一个全面的servlet: @WebServlet(name="RequestHandler", urlPatterns="/*") public class RequestHandler extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
@WebServlet(name="RequestHandler", urlPatterns="/*")
public class RequestHandler extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
new SeedPlanter(request, response).sow();
}
}
处理所有请求。请注意urlPattern
/
*。这是因为它加载了各种各样的东西,比如模板、处理对象等。servlet基本上只是一个门面,位于处理所有html呈现的自定义框架前面
问题是我不能再直接访问资源了
例如,如果我想加载web inf目录之外的html文件(localhost:8080/myapp/test.html
),它会给我一个404错误。事实上,即使我尝试在页面上加载一个图像(localhost:8080/myapp/images/test.png
),它也会给出一个找不到的404资源。删除servlet显然会破坏整个应用程序,但它确实允许我加载这些资源,因此我相信是servlet造成了问题
我怎样才能像现在这样使用servlet,同时还能加载这些资源呢?我认为在这种情况下,您需要使用servlet过滤器,而不是servlet。Servlet过滤器是一种围绕请求流添加任何代码的方法。Internet上有很多示例,如下所示。您可能需要创建/使用servlet过滤器来正确重写路径。这看起来可能会有帮助 我已经包括了以下内容以供参考,因为描述符的实际功能常常被错误地解释为它们应该如何实际实现 SRV.11.2映射规范 在Web应用程序部署描述符中,以下语法用于定义映射:
- 以/字符开头,以/*后缀结尾的字符串是 用于路径映射
- 以*开头的字符串。前缀用作扩展映射
- 仅包含/字符的字符串表示应用程序的“默认”servlet。在本例中,servlet路径是 请求URI减去上下文路径,路径信息为空
所有其他字符串仅用于精确匹配。我最终使用了一个单独的servlet来侦听我的图像、css、js文件夹(您可以在此处添加任意数量的urlPatterns) 代码只需找到文件并将字节返回到浏览器 参考:
@WebServlet(name="CommonRequestHandler", urlPatterns={"/images/*", "/css/*"})
public class CommonRequestHandler extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doPost(request, response);
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
ServletContext context = getServletContext();
String path = request.getRequestURI().substring(request.getContextPath().length()+1, request.getRequestURI().length());
String fileName = context.getRealPath(path);
//Get MIME type
String mimeType = context.getMimeType(fileName);
if(mimeType == null) {
response.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR);
return;
}
//Set content type
response.setContentType(mimeType);
//Set content size
File file = new File(fileName);
response.setContentLength((int) file.length());
//Open file and output streams
FileInputStream in = new FileInputStream(file);
OutputStream out = response.getOutputStream();
//Copy file content to output stream
byte[] buf = new byte[1024];
int count = 0;
while((count = in.read(buf)) >= 0) {
out.write(buf, 0, count);
}
in.close();
out.close();
}
}