[英]How do I prevent Spring 3.0 MVC @ModelAttribute variables from appearing in 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.