Spring并返回受保护的资源

时间:2012-07-23 21:06:21

标签: java spring spring-mvc

我有一个非常标准的Spring 3.0.7网络应用

结构就像这样

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的Streaming对于基本上是静态的文件来说似乎有些过分。我可以注册另一个“视图”类型吗?我需要这个(从Web浏览器端)看起来像标准的http请求响应(就像当前的视图实现一样)。

我真的想避免发明我自己的文件处理方法,除非有一些理由为什么使用文件访问方法比弹性“其他”视图解析器更好,比如ResourceBundleResolver

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

2 个答案:

答案 0 :(得分: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());
    }
}

答案 1 :(得分: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。