如何使用Spring MVC拦截器更改发布的值 [英] How to change the posted values with a spring mvc interceptor
问题描述
有人知道如何使用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屋!