我有一个非常标准的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。