簡體   English   中英

如何防止Spring 4.0 MVC @ModelAttribute變量出現在URL中?

[英]How do I prevent Spring 4.0 MVC @ModelAttribute variables from appearing in URL?

我有一種方法,可以讓您對客戶進行評論,並在添加評論后將您再次重定向到帶有評論的站點。

@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設置ignoreDefaultModelOnRedirect true。 在本主題中他們在此處輸入鏈接描述,他們說只是將<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;
}

但這沒用。

我可以添加到processAddCustomerComment方法中:

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

但我對這種解決方案不滿意。 因為假設我們有20種方法,例如我的方法,而我不想將這兩行代碼放入這20種方法中的每一種。

我該如何解決這個問題?

由於RequestMappingHandlerAdapter已經在上下文中,您的實現可能無法正常工作。 添加另外一個不會改變使用的事實。 本文建議您自動連接現有的RequestMappingHandlerAdapter並設置屬性。

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

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

所有積分均會在http://www.logicbig.com/上獲得引用的代碼。

話雖這么說,除非您有使用@ModelAttribute的特殊原因,否則您應該切換到@RequestParam ,它是更簡單,附加的字符串更少。 這是本主題的詳盡討論。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM