0

我有一个非常标准的 Spring 3.0.7 web 应用程序

结构是这样的

WebContent/
    resources/
      myStaticConent/
    WEB-INF/
       views/
       myProtectedContent/

我正在使用<mvc:resources>静态内容的配置,我的控制器使用来自 WEB-INF/views 的 InternalViewResolver 获取视图

现在我需要从 WEB-INF 中的受保护目录中返回非 JSP 内容(JPG、PNG、HTML 等)

因此,用户可能会输入一个类似 http:myWebApp/myProtectedContent 的 URL 并点击我的受保护内容控制器。

@Controller
public class HelloWorldController {

@RequestMapping(value="/myProtectedContent")
public String index() {
  return "myjpg.jpg";
 }
}

本质上,我想像视图一样有条件地提供文件。任何人都知道如何做到这一点?

我在这里查看了其他一些方法,使用 Inputstream 的流式处理对于本质上是静态的文件来说似乎有点过分了。我可以注册另一个“视图”类型吗?我需要它像标准的 http 请求响应(如当前视图实现)一样出现 l(从 Web 浏览器端)。

我真的很想避免发明自己的文件处理方法,除非有某种原因为什么使用文件访问方法比使用 Springs “其他”视图解析器(如 ResourceBundleResolver)更好

因此,要求是从 WEB-INF 内部有条件地响应具有可变文件类型(jpg、png、html)的 http 请求,而不用包装在 jsp 中或让文件由 JSTL 视图解释。文件的名称是已知的和静态的。控制器将根据自己的业务逻辑确定文件名。

4

2 回答 2

1

您可以重现其底层实现的行为<mvc:resources/>org.springframework.web.servlet.resource.ResourceHttpRequestHandler它本质上是流式传输静态文件的内容 - 您可以像 ResourceHttpRequestHandler 一样,扩展org.springframework.web.servlet.support.WebContentGenerator它对发送最后修改和缓存相关标头的广泛支持,最后流式传输内容还有一个 Spring 提供的实用程序:

org.springframework.util.FileCopyUtils.copy(resource.getInputStream(), response.getOutputStream());

更新:

@Controller
public class HelloWorldController implements ApplicationContextAware  {
    ApplicatonContext ctx = ...;

    @RequestMapping(value="/myProtectedContent")
    public void index(HttpServletRequest req, HttpServletResponse res) {
        Resource resource = ctx.getResource("classpath:staticpath/myjpg.jpg");
        FileCopyUtils.copy(resource.getInputStream(), response.getOutputStream());
    }
}
于 2012-07-23T21:30:52.567 回答
0

您可以做的是将一个新的 servlet 映射到您想要保护的路径并以您想要的方式处理请求。

例如,在 web.xml 中:

<servlet>
    <servlet-name>protServlet</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <init-param>
        <param-name>contextConfigLocation</param-name>
        <param-value>/WEB-INF/protServlet-context.xml</param-value>
    </init-param>
    <load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>protServlet</servlet-name>
    <url-pattern>/myProtectedContent</url-pattern>
</servlet-mapping>

这样,您可以为受保护内容的 URL 映射一个新的 servlet (DispatcherServlet)。如果您已经有一个此字段值等于 1 的 DispatcherServlet,则 load-on-startup 值等于 2 是到期的。

于 2012-07-24T00:29:24.137 回答