Я знаю, что config по умолчанию struts2 будет обрезать все строки, полученные из форм.
Например:
Я напечатаю
" whatever "в форме и отправлю, я получу
"whatever"Строка была автоматически обрезана
У этой функции есть spring mvc? спасибо.
Я знаю, что config по умолчанию struts2 будет обрезать все строки, полученные из форм.
Например:
Я напечатаю
" whatever "в форме и отправлю, я получу
"whatever"Строка была автоматически обрезана
У этой функции есть spring mvc? спасибо.
Использование Spring 3.2 или выше:
@ControllerAdvice
public class ControllerSetup
{
@InitBinder
public void initBinder ( WebDataBinder binder )
{
StringTrimmerEditor stringtrimmer = new StringTrimmerEditor(true);
binder.registerCustomEditor(String.class, stringtrimmer);
}
}
Тестирование с помощью тестового контекста MVC:
@RunWith(SpringJUnit4ClassRunner.class)
@WebAppConfiguration
@ContextConfiguration
public class ControllerSetupTest
{
@Autowired
private WebApplicationContext wac;
private MockMvc mockMvc;
@Before
public void setup ( )
{
this.mockMvc = MockMvcBuilders.webAppContextSetup(this.wac).build();
}
@Test
public void stringFormatting ( ) throws Exception
{
MockHttpServletRequestBuilder post = post("/test");
// this should be trimmed, but only start and end of string
post.param("test", " Hallo Welt ");
ResultActions result = mockMvc.perform(post);
result.andExpect(view().name("Hallo Welt"));
}
@Configuration
@EnableWebMvc
static class Config
{
@Bean
TestController testController ( )
{
return new TestController();
}
@Bean
ControllerSetup controllerSetup ( )
{
return new ControllerSetup();
}
}
}
/**
* we are testing trimming of strings with it.
*
* @author janning
*
*/
@Controller
class TestController
{
@RequestMapping("/test")
public String test ( String test )
{
return test;
}
}
И - как задал LppEdd - он также работает с паролями, так как на стороне сервера нет никакой разницы между входом [type = password] и input [type = text]
зарегистрируйте этот редактор свойств:
org.springframework.beans.propertyeditors.StringTrimmerEditor
Пример для AnnotionHandlerAdapter:
<bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">
...
<property name="webBindingInitializer">
<bean class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
<property name="propertyEditorRegistrar">
<bean class="org.springframework.beans.propertyeditors.StringTrimmerEditor" />
</property>
</bean>
</property>
...
</bean>
Вы также можете использовать службу преобразования Spring, которая имеет дополнительное преимущество при работе с <mvc:annotation-driven/>
и Spring Webflow. Как и в случае с другими ответами, основной недостаток заключается в том, что это глобальное изменение и не может быть отключено для определенных форм.
Вам понадобится конвертер для выполнения обрезки
public class StringTrimmingConverter implements Converter<String, String> {
@Override
public String convert(String source) {
return source.trim();
}
}
Затем определите службу преобразования, которая знает о вашем конвертере.
<bean id="applicationConversionService" class="org.springframework.format.support.FormattingConversionServiceFactoryBean">
<property name="converters">
<list>
<bean class="mypackage.util.StringTrimmingConverter"/>
</list>
</property>
</bean>
и привяжите это к mvc.
<mvc:annotation-driven conversion-service="applicationConversionService"/>
Если вы используете Spring Webflow, для этого требуется оболочка
<bean id="defaultConversionService" class="org.springframework.binding.convert.service.DefaultConversionService">
<constructor-arg ref="applicationConversionService"/>
</bean>
и настройки в построителе потока
<flow:flow-builder-services id="flowBuilderServices" conversion-service="defaultConversionService" development="true" validator="validator" />
Вы можете использовать перехватчик Spring -MVC
public class TrimInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
Enumeration<String> e = request.getParameterNames();
while(e.hasMoreElements()) {
String parameterName = e.nextElement();
request.setParameter(parameterName, request.getParameter(parameterName).trim());
}
return true;
}
И настройте свойство HandlerMapping interceptors
<bean id="interceptorTrim" class="br.com.view.interceptor.TrimInterceptor"/>
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" p:interceptors-ref="interceptorTrim"/>
}
Или используйте сервлет-фильтр
Просто измените приведенный выше код, чтобы приспособиться к Spring Boot, если вы хотите явно указать функцию обрезки для некоторых полей в форме, вы можете показать их, как показано ниже:
@Component
@ControllerAdvice
public class ControllerSetup {
@InitBinder({"dto", "newUser"})
public void initBinder(WebDataBinder binder) {
binder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
binder.registerCustomEditor(String.class, "userDto.username", new StringTrimmerEditor(false));
binder.registerCustomEditor(String.class, "userDto.password", new DefaultStringEditor(false));
binder.registerCustomEditor(String.class, "passwordConfirm", new DefaultStringEditor(false));
}
}
во-первых, обрезать requestparam, который является строкой, вы можете создать класс и ограничения WebBingdingInitializer
@ControllerAdvice
public class CustomWebBindingInitializer implements WebBindingInitializer {
@InitBinder
@Override
public void initBinder(WebDataBinder webDataBinder, WebRequest webRequest) {
webDataBinder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
}
}
пожалуйста, используйте componentScan, чтобы этот класс был Spring Bean.
Но я не знаю, как обрезать значение String в данных JSON requestBody.