2012-07-23 109 views
0

我有一个非常标准的Spring 3.0.7 Web应用程序春返回受保护的资源

的结构是这样的

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

我现在用的是<mvc:resources>配置静态内容和我的控制器得到的意见使用InternalViewResolver从WEB-INF /意见

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

所以用户可能会输入一个像http:myWebApp/myProtectedContent这样的URL并打到我受保护的内容控制器。

@Controller 
public class HelloWorldController { 

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

基本上我希望有条件成为一个文件,就像我会一个视图。任何人都知道如何做到这一点?

我看了一些其他的方法,使用Inputstream Streaming对于基本上是静态的文件似乎有些过分。我可以注册另一种“视图”类型吗?我需要这样做(从Web浏览器端),就像标准的http请求响应一样(比如当前的视图实现)。

我真的想避免发明了我自己的文件处理方法,除非有一些理由使用该文件访问方法是更好然后泉城“其他”视图解析器像ResourceBundleResolver

所以要求 有条件回应一个来自WEB-INF内部的具有可变文件类型(jpg,png,html)的http请求,不包含在jsp中或者由JSTL视图解释该文件。文件的名称是已知的并且是静态的。控制器将根据自己的业务逻辑确定文件名。

+0

您希望以何种方式有条件地提供内容?不同的用户获得不同的资源吗?所有资源都是安全的,并且任何登录人员都可以获取所有资源,但是您希望单个URL根据用户返回不同的内容吗?如果你能更清楚地了解这些要求,那可能会有所帮助。谢谢。 – Kieran 2012-07-24 15:50:10

+0

@Kerian我认为用例是一个不同的问题,而不是我的信息来分享。我会澄清我在找什么。 – stimpy 2012-07-24 16:15:04

回答

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()); 
    } 
} 
+0

对于看似简单的任务而言,这看起来很费劲。创建另一个内部视图解析器不会更容易?或者使用另一个解析器? – stimpy 2012-07-24 01:05:20

+0

不,这并不复杂,我基本上说的是,您按照您定义的方式定义了控制器,并在方法调用FileCopyUtils.copy(resource.getI ...)中定义了控制器,并且如果您需要任何高级功能如缓存,然后从WebContentGenerator扩展来做到这一点。 – 2012-07-24 01:07:35

+0

FileCopy?我没有看到如何更好的使用InputStream。另外为什么不使用ResourceBundleResolver或UrlResolver?你能举一个你建议的例子吗? – stimpy 2012-07-24 14:33:30

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> 

这样一来,你映射为保护内容的网址一个新的servlet(DispatcherServlet的)。 如果您已具有此字段值等于1的DispatcherServlet,则启动时加载值等于2。

+0

感谢vitor,但我需要保持在同一个servlet中的可移植性 – stimpy 2012-07-24 00:49:13