Jsp SpringMVC使视图引用类型安全;或者检测错误的视图名称

Jsp SpringMVC使视图引用类型安全;或者检测错误的视图名称,jsp,spring-mvc,Jsp,Spring Mvc,@控制器处理程序方法可以自由返回任何表面上表示逻辑视图名称的字符串。当然,视图名称可能不正确,ViewResolver将无法将其解析为实际视图 通常,我的所有视图(例如jsp文件)在应用程序启动时都是已知的,我的所有处理程序方法都是硬编码的,以返回视图名称(例如返回“home”或返回“admin”。简单的静态分析会从处理程序方法中检测到无法解析的返回视图名称。有没有办法将此安全性构建到我的应用程序中?JSP的一个简单方法是扩展InternalResourceViewResolver并重写它的bu

@控制器处理程序方法可以自由返回任何表面上表示逻辑视图名称的字符串。当然,视图名称可能不正确,ViewResolver将无法将其解析为实际视图


通常,我的所有视图(例如jsp文件)在应用程序启动时都是已知的,我的所有处理程序方法都是硬编码的,以返回视图名称(例如
返回“home”
返回“admin”
。简单的静态分析会从处理程序方法中检测到无法解析的返回视图名称。有没有办法将此安全性构建到我的应用程序中?

JSP的一个简单方法是扩展InternalResourceViewResolver并重写它的buildView方法


将此视图解析程序添加到您的应用程序上下文中。

AFAIK很难做到这一点,因为返回的视图名称是逻辑名称,并且对于jsp、velocity、thymeleaf等,底层视图技术可能会有很大的不同。Spring ViewResolver实际解析它们取决于它所使用的技术例如,InternalResourceViewResolver、ResourceBundleViewResolver、ContentNegatatingViewResolver等的视图解析程序也可能不同,这些在运行时调用,以解析视图,而不是在加载应用程序上下文时

class BadViewDetectingViewResolver extends InternalResourceViewResolver {
    @Override
    protected AbstractUrlBasedView buildView(String viewName) throws Exception {
        final String absoluteViewName = getPrefix() + viewName + getSuffix();

        // Check if file exists or whatever you want.

        return super.buildView(viewName);
    }
}