我有一个非常标准的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视图解释。文件的名称是已知的并且是静态的。控制器将根据自己的业务逻辑确定文件名。
答案 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。