Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/spring-mvc/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
spring mvc可以修剪从表单获得的所有字符串吗?_Spring_Spring Mvc - Fatal编程技术网

spring mvc可以修剪从表单获得的所有字符串吗?

spring mvc可以修剪从表单获得的所有字符串吗?,spring,spring-mvc,Spring,Spring Mvc,我知道struts2默认配置将修剪从表单获得的所有字符串 例如: 我在表单中键入“whatever”并提交,我将得到自动修剪的字符串“whatever” "whatever" SpringMVC也有这个功能吗?THX.您可以使用Spring MVC拦截器 public class TrimInterceptor extends HandlerInterceptorAdapter { @Override public boolean preHandle(HttpServletRe

我知道struts2默认配置将修剪从表单获得的所有字符串

例如:

我在表单中键入“whatever”并提交,我将得到自动修剪的字符串“whatever”

"whatever"
SpringMVC也有这个功能吗?THX.

您可以使用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;
    }
公共类TrimInterceptor扩展了HandlerInterceptorAdapter{
@凌驾
公共布尔预处理(HttpServletRequest请求、HttpServletResponse响应、对象处理程序)引发异常{
枚举e=request.getParameterNames();
而(e.hasMoreElements()){
字符串参数name=e.nextElement();
request.setParameter(parameterName,request.getParameter(parameterName.trim());
}
返回true;
}
并设置HandlerMapping拦截器属性

<bean id="interceptorTrim" class="br.com.view.interceptor.TrimInterceptor"/>
<bean class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping" p:interceptors-ref="interceptorTrim"/>
}

}

或者使用Servlet筛选器注册此属性编辑器:

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 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]和输入[type=text]之间没有区别。您还可以使用Spring的转换服务,它还具有使用
和Spring Webflow的额外好处。与其他答案一样,主要的缺点是这是一个全球性的变化,不能对某些形式禁用

您需要一个转换器来进行修剪

public class StringTrimmingConverter implements Converter<String, String> {

    @Override
    public String convert(String source) {
       return source.trim();
    }

}
公共类StringTrimmingConverter实现转换器{
@凌驾
公共字符串转换(字符串源){
返回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"/>

如果您使用SpringWebFlow,那么它需要一个包装器

 <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 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));
        }
}

首先,trim requestparam是String,您可以创建一个类并实现WebbindingInitializer

 @ControllerAdvice
public class CustomWebBindingInitializer implements WebBindingInitializer {

    @InitBinder
    @Override
    public void initBinder(WebDataBinder webDataBinder, WebRequest webRequest) {
        webDataBinder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
    }
}
请使用componentScan使这个类成为Springbean


但是,我不知道如何修剪requestBody JSON数据中的字符串值

小心这种方法-用户可能会使用空格作为其密码的第一个和/或最后一个字符。您上面的实现也不是空安全的。HttpServletRequest类没有setParameter方法我不确定您是如何使其工作的,但在SpringPortlet MVC中,这根本不会改变。首先,StringTrimmerEditor没有实现PropertyEditorRegistrar接口,即使实现了,也没有默认的无参数构造函数。我最终编写了自己的StringTrimmerEditor注册器,并在ConfigurableWebBindingInitializer中进行了注入,但我很想知道每个人是如何做到这一点的?StringTrimmerEditor有两个构造函数,您可以传递boolean或string和boolean,如果使用Spring 3.2或更高版本,请查看文档,你可能想看看詹宁的答案。(AnnotationMethodHandlerAdapter现在已被弃用。)这是Spring3.2或更高版本的最佳答案,尽管测试代码分散了它的简单性。您只需要第一个代码块。代码的其余部分并不特定于这个问题。您也可以直接将其放入控制器类或控制器的基类中,而不是将其放入ControllerAdvice类中。同时使用Spring Boot 1.3和Spring MVC 4.2,passowords呢?从SpringTestRunner测试时遇到问题吗?MockMVC不接受此配置,必须通过调用
.setControllerAdvice(…)
 @ControllerAdvice
public class CustomWebBindingInitializer implements WebBindingInitializer {

    @InitBinder
    @Override
    public void initBinder(WebDataBinder webDataBinder, WebRequest webRequest) {
        webDataBinder.registerCustomEditor(String.class, new StringTrimmerEditor(true));
    }
}