【问题标题】:How do I prevent Spring 4.0 MVC @ModelAttribute variables from appearing in URL?如何防止 Spring 4.0 MVC @ModelAttribute 变量出现在 URL 中?
【发布时间】:2016-12-28 08:35:05
【问题描述】:

我有一种方法可以让您对客户发表评论,并在添加评论后将您再次重定向到带有 cmets 的站点。

@RequestMapping(value="customers/details/{id}", method = RequestMethod.GET)
    public String showCustomerComments(@ModelAttribute("commentContent") String commentContent, @PathVariable int id, Model model){

        model.addAttribute("comment",commentRepository.getAllComments(id));

        return "details";
    }

    @RequestMapping(value ="customers/details/{id}", method = RequestMethod.POST)
    public String processAddCustomerComment(@ModelAttribute("commentContent") String commentContent, @PathVariable int id){

        commentRepository.
                addComment(commentContent, localDate.now().toString(), id);

        return "redirect:/customers/details/{id}";
    }
}

一切正常,但在 url 中出现模型验证:

http://localhost:8080/customers/details/62?commentContent=some_text

我已经知道解决方案,但我不知道如何实施。解决方案是在ignoreDefaultModelOnRedirect 上设置ignoreDefaultModelOnRedirect true。在这个主题enter link description here 中,他们说只需将<mvc:annotation-driven ignoreDefaultModelOnRedirect="true" /> 之类的东西放到我们的xml 文件中。但是如何在基于 Java 的配置中做到这一点?

我有这样的课:

    @Configuration
@EnableWebMvc
@ComponentScan(basePackages = "com.packt.webstore")
public class WebConfiguration extends WebMvcConfigurerAdapter {

    @Bean
    public ViewResolver viewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }

    @Bean
    public CommonsMultipartResolver multipartResolver(){
        CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
        multipartResolver.setMaxUploadSize(10240000);
        return  multipartResolver;
    }

    @Bean
    public LocaleResolver localeResolver(){
        SessionLocaleResolver sessionLocaleResolver = new SessionLocaleResolver();
        sessionLocaleResolver.setDefaultLocale(new Locale("en"));
        return sessionLocaleResolver;
    }

    @Bean
    public LocaleChangeInterceptor localeChangeInterceptor(){
        LocaleChangeInterceptor localeChangeInterceptor = new LocaleChangeInterceptor();
        localeChangeInterceptor.setParamName("lang");
        return localeChangeInterceptor;
    }

    @Bean
    public MessageSource messageSource(){
        ResourceBundleMessageSource messageSource = new ResourceBundleMessageSource();
        messageSource.setBasename("messages");
        return  messageSource;
    }


    @Override
    public void configureDefaultServletHandling(DefaultServletHandlerConfigurer configurer) {
        configurer.enable();
    }

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**")
                .addResourceLocations("resources/");
    }

    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        registry.addInterceptor(localeChangeInterceptor());
    }

}

我想补充一下:

    @Bean 
public  RequestMappingHandlerAdapter requestMappingHandlerAdapter(){
 RequestMappingHandlerAdapter  requestMappingHandlerAdapter = new  RequestMappingHandlerAdapter();
requestMappingHandlerAdapter.ignoreDefaultModelOnRedirect(true);
return requestMappingHandlerAdapter;
}

但它不起作用。

我可以添加到processAddCustomerCommentmehtod:

model.asMap().clear();
return "redirect:" + news.getUrl();

但我对这个解决方案不满意。因为假设我们有 20 个像我这样的方法,我不想将这两行代码放在这 20 个方法中。

我该如何解决这个问题?

【问题讨论】:

  • 您使用@ModelAttribute 而不是@RequestParam 有什么原因吗?

标签: java spring spring-mvc


【解决方案1】:

您的实现可能无法正常工作,因为 RequestMappingHandlerAdapter 已经在上下文中。添加另一个并不会改变实际使用的那个。 This article 建议您自动连接现有的 RequestMappingHandlerAdapter 并设置属性。

@EnableWebMvc
@Configuration
public class MyWebConfig {
    @Autowired
    private RequestMappingHandlerAdapter requestMappingHandlerAdapter;

    @PostConstruct
    public void init() {
       requestMappingHandlerAdapter.setIgnoreDefaultModelOnRedirect(true);
    }
    ......
}

引用代码的所有积分都转到http://www.logicbig.com/

话虽如此,除非您有特定原因使用@ModelAttribute,否则您或许应该改用@RequestParam,它更简单,附加条件更少。这是this topic 的详细讨论。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-26
    • 1970-01-01
    • 2021-05-22
    • 1970-01-01
    • 2016-08-15
    相关资源
    最近更新 更多