如何使用spring mvc拦截器更改发布的值

Ser*_*ahé 1 spring spring-mvc interceptor

有谁知道如何使用spring mvc拦截器更改发布值?我看过一些例子但没有关于这个问题.我知道如何获得它们,但我不知道如何修改它们.

@Component
public class CultureInterceptor implements HandlerInterceptor {

    @Override
    public void afterCompletion(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, Exception arg3)
            throws Exception {

    }

    @Override
    public void postHandle(HttpServletRequest arg0, HttpServletResponse arg1, Object arg2, ModelAndView arg3)
            throws Exception {

    }

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object arg2) throws Exception {
        // we get the posted values
        String culture = request.getParameter("culture");
        String a = request.getParameter("a");
        String b = request.getParameter("b");
        System.out.println(String.format("[CultureInterceptor culture=%s, a=%s, b=%s]", culture, a, b));
        if (culture != null && a != null && b != null && "fr-FR".equals(culture)) {
            a = a.replace(",", ".");
            b = b.replace(",", ".");
        }
        System.out.println(String.format("[CultureInterceptor culture=%s, a=%s, b=%s]", culture, a, b));
        return true;
    }
Run Code Online (Sandbox Code Playgroud)

上面,我创建了一个发布值[a]和[b]的副本,但我没有在请求中修改它们.有没有想过这样做?

Ser*_*ahé 5

我回答我自己的问题.实际上它相当复杂,我花了一些时间才找到一个有效的解决方案.首先,我在Spring配置类(Spring Boot环境)中创建了一个过滤器:

@Configuration
@ComponentScan({ "istia.st.springmvc.config", "istia.st.springmvc.controllers", "istia.st.springmvc.models" })
@EnableAutoConfiguration
public class Config extends WebMvcConfigurerAdapter {
    @Bean
    public Filter cultureFilter() {
        return new CultureFilter();
    }

}
Run Code Online (Sandbox Code Playgroud)

这里我们声明一个过滤器,它将(默认情况下)在每个请求到达最终处理程序之前对其进行过滤.然后我创建了过滤器:

public class CultureFilter extends OncePerRequestFilter {

    @Override
    protected void doFilterInternal(HttpServletRequest request, HttpServletResponse response, FilterChain filterChain)
            throws ServletException, IOException {
        // next handler 
        filterChain.doFilter(new CultureRequestWrapper(request), response);
    }
}
Run Code Online (Sandbox Code Playgroud)

[OncePerRequestFilter]是一个Spring类.诀窍是用新的[CultureRequestWrapper(request)]替换实际的请求.然后我创建了CultureRequestWrapper:

public class CultureRequestWrapper extends HttpServletRequestWrapper {

    public CultureRequestWrapper(HttpServletRequest request) {
        super(request);
    }

    @Override
    public String[] getParameterValues(String name) {
        // posted values a et b
        if (name != null && (name.equals("a") || name.equals("b"))) {
            String[] values = super.getParameterValues(name);
            String[] newValues = values.clone();
            newValues[0] = newValues[0].replace(",", ".");
            return newValues;
        }
        // other cases
        return super.getParameterValues(name);
    }

}
Run Code Online (Sandbox Code Playgroud)

我重新定义了[HttpServletRequest]的[getParameterValues],但它依赖于将管理请求的最终servlet.我们必须重新定义此servlet使用的[HttpServletRequest]方法.