2017-09-29 116 views
1

我试图根据useragent更改视图的前缀。春季自定义视图解析器

如果请求来自IE,然后尝试将其转发到“传统”文件夹,否则“现代”文件夹。

@Bean 
    public ViewResolver viewResolver() { 
     InternalResourceViewResolver internalResourceViewResolver = new InternalResourceViewResolver(); 
     internalResourceViewResolver.setViewClass(JstlView.class); 
     internalResourceViewResolver.setSuffix(".jsp"); 

     HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest(); 

     if(request.getHeader("User-Agent").contains("Internet Explorer")){ 
        internalResourceViewResolver.setPrefix("/WEB-INF/views/legacy/"); 
     } else { 
        internalResourceViewResolver.setPrefix("/WEB-INF/views/modern/"); 
     } 
     return internalResourceViewResolver; 
    } 

它根本没有工作。任何人都可以建议

+0

不要使用'ViewResolver'只写'HandlerInterceptor'并在'postHandle'方法中实现该逻辑。 –

回答

0

不要在ViewResolver附近写下HandlerInterceptor来代替。

public class BrowserPrefixHandlerInterceptor extends HandlerInterceptorAdapter { 

    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) 
     throws Exception { 

     if(request.getHeader("User-Agent").contains("Internet Explorer")){ 
      modelAndView.setViewName("legacy/" + modelAndView.getViewName()); 
     } else { 
      modelAndView.setViewName("modern/" + modelAndView.getViewName()); 
     } 
    } 
} 

然后注册就像一个普通的拦截器。

@Configuration 
public YourWebConfiguration extends WebMvcConfigurerAdapter { 

    public void addInterceptors(InterceptorRegistry registry) { 
     registry.addInterceptor(new BrowserPrefixHandlerInterceptor()); 
    } 
} 

只需离开ViewResolver。这将适用于每个ViewResolver,而不仅仅是您自己的定制版本。你可能想让拦截器更聪明一些(检查是否有实际的viewName,也可能跳过某些URL)。

+0

非常感谢你的兄弟。我已经尝试使用拦截器相同。 – Shakthi