如何使用Spring MVC拦截器更改发布的值 [英] How to change the posted values with a spring mvc interceptor

查看:139
本文介绍了如何使用Spring MVC拦截器更改发布的值的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

有人知道如何使用spring mvc拦截器更改发布的值吗?我看到了一些例子,但没有关于这个主题的例子.我知道如何获得它们,但我不知道如何对其进行修改.

Does anyone know how to change the posted values with a spring mvc interceptor ? I have seen some examples but none about this subject. I know how to get them but i don't know how to modify them.

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

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

Above, I have created a copy of posted values [a] and [b] but i haven't modified them in the request. Any idea to do that ?

推荐答案

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

I answer my own question. In fact it is rather complex and it took me some time to find a working solution. First, I created a filter in a Spring configuration class (Spring Boot environment exactly) :

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

}

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

Here we declare a filter that will (by default) filter every request before it attains the final handler. Then I created the filter :

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

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

[OncePerRequestFilter] is a Spring class. The trick is to replace the actual request with a new one [CultureRequestWrapper(request)]. Then I created the 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);
    }

}

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

I redefined the [getParameterValues] of [HttpServletRequest] but it depends on the final servlet that will manage the request. We have to redefine the [HttpServletRequest] methods used by this servlet.

这篇关于如何使用Spring MVC拦截器更改发布的值的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆