Подтвердить что ты не робот

Может ли spring mvc обрезать все строки, полученные из форм?

Я знаю, что config по умолчанию struts2 будет обрезать все строки, полученные из форм.

Например:

Я напечатаю

"   whatever "
в форме и отправлю, я получу
"whatever"
Строка была автоматически обрезана

У этой функции есть spring mvc? спасибо.

4b9b3361

Ответ 1

Использование 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]

Ответ 2

зарегистрируйте этот редактор свойств: 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>

Ответ 3

Вы также можете использовать службу преобразования 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" />

Ответ 4

Вы можете использовать перехватчик 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"/>
}

Или используйте сервлет-фильтр

Ответ 5

Просто измените приведенный выше код, чтобы приспособиться к 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));
        }
}

Ответ 6

во-первых, обрезать 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.