弹簧和返回受保护的资源



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

结构是这样的

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

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

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

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

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

本质上,我想有条件地提供文件,就像我处理视图一样。有人知道这是怎么做到的吗?

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

(。

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

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

您可以重现<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());
    }
}

您可以做的是将新的 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(。启动时加载值等于 2 是到期的,如果您已经有一个 DispatcherServlet,此字段值等于 1。

最新更新