当前位置: 首页 > 知识库问答 >
问题:

捕获阻止加载资源的所有Servlet

岑元徽
2023-03-14

我使用的是一个全面的servlet:

@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目录(localhost:8080/myapp/test.html)之外的html文件,它会给我一个404错误。事实上,即使我尝试在页面上加载图像(localhost:8080/myapp/images/test.png),它也会给出一个找不到的404资源。删除servlet显然会破坏整个应用程序,但它确实允许我加载这些资源,所以我相信是servlet导致了问题。

如何像我一样使用servlet,同时也能够加载这些资源?

共有3个答案

卫烨
2023-03-14

您可能需要创建/使用servlet过滤器来正确重写路径。这里有一个很好的示例,其中包含了源代码,看起来可能会有所帮助。

由于描述符的实际功能常常被错误地解释为应该如何实际实现,因此我将以下内容包括在内以供参考。

SRV.11.2映射规范

在Web应用程序部署描述符中,使用以下语法定义映射:

  • 路径映射使用以/字符开头、以/*后缀结尾的字符串
  • 以*开头的字符串。前缀用作扩展映射
  • 仅包含/字符的字符串表示应用程序的“默认”servlet。在这种情况下,servlet路径是请求URI减去上下文路径,路径信息为null

所有其他字符串仅用于精确匹配。

韩嘉胜
2023-03-14

我认为在这种情况下需要使用Servlet过滤器,而不是Servlet。Servlet过滤器是一种围绕请求流添加任何代码的方法。互联网上有很多例子,下面就是其中之一。

卓雅达
2023-03-14

最后,我使用了一个单独的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();
}
}

代码只需找到文件并将字节返回给浏览器。

参考:http://java-espresso.blogspot.com/2011/09/webxml-problem-and-solution-for-url.html

 类似资料:
  • 我在页面加载时使用了CAPTCHA,但由于某些安全原因,它被阻塞了。 我面对这个问题: 我使用了以下JavaScript和meta标记:

  • 我的'pubspec.yaml'文件: 我正在使用以下代码将图像加载到页面中:在“登录page.dart”文件中:

  • 通过[navigator.webkitGetUserMedia] API 捕获 audio 或 video等媒体资源 进程: 渲染进程​ 从 Electron桌面应用中捕获硬盘: 1 // In the renderer process. 2 const {desktopCapturer} = require('electron') 3 ​ 4 desktopCapturer.getSources

  • Cocos Creator 有一套统一的资源管理机制,在本篇教程,我们将介绍 资源属性的声明 如何在 属性检查器 里设置资源 动态加载资源 加载远程资源和设备资源 资源的依赖和释放 资源属性的声明 在 Creator 中,所有继承自 cc.Asset 的类型都统称资源,如 cc.Texture2D, cc.SpriteFrame, cc.AnimationClip, cc.Prefab 等。它们的

  • 使用脚本管理和加载资源,请参考脚本指南中的: 获取和加载资源

  • Cocos Creator 3D 采用与 Cocos Creator 统一的资源管理机制,在本篇教程,我们将介绍 资源属性的声明 如何在 属性检查器 里设置资源 动态加载资源 加载远程资源和设备资源 资源的依赖和释放 资源属性的声明 在 Cocos Creator 3D 中,所有继承自 Asset 的类型都统称资源,如 Texture2D, SpriteFrame, AnimationClip,