복붙노트

[SPRING] 스프링 mvc 인터셉터를 사용하여 게시 된 값을 변경하는 방법

SPRING

스프링 mvc 인터셉터를 사용하여 게시 된 값을 변경하는 방법

누구나 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;
    }

위의 게시 된 값 [a] 및 [b]의 복사본을 만들었지 만 요청에서 수정하지 않았습니다. 그걸 할 생각이야?

해결법

  1. ==============================

    1.나는 내 자신의 질문에 답한다. 실제로 그것은 다소 복잡하고 작동하는 해결책을 찾기 위해 어느정도 시간이 걸립니다. 먼저 스프링 구성 클래스에 필터를 만들었습니다 (스프링 부트 환경).

    나는 내 자신의 질문에 답한다. 실제로 그것은 다소 복잡하고 작동하는 해결책을 찾기 위해 어느정도 시간이 걸립니다. 먼저 스프링 구성 클래스에 필터를 만들었습니다 (스프링 부트 환경).

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

    여기서 우리는 (기본적으로) 최종 요청을 처리하기 전에 모든 요청을 필터링하는 필터를 선언합니다. 그런 다음 필터를 만들었습니다.

    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를 만들었습니다.

    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]를 재정의했으나 요청을 관리 할 최종 서블릿에 따라 다릅니다. 우리는 이 서블릿이 사용하는 [HttpServletRequest] 메소드.

  2. ==============================

    2.HttpServletRequest에서 클라이언트에서 온 요청을 나타내야하므로 아무 것도 변경하면 안됩니다. 시나리오와 같은 시나리오에 사용되는 구성은 HttpServletRequestWrapper입니다.

    HttpServletRequest에서 클라이언트에서 온 요청을 나타내야하므로 아무 것도 변경하면 안됩니다. 시나리오와 같은 시나리오에 사용되는 구성은 HttpServletRequestWrapper입니다.

    당신이해야 할 일은 HttpServletRequestWrapper를 확장하고, param 변경 로직을 적용 할 수있는 getParameter 메소드를 재정의하고, 포장 된 요청을 전달 체인 아래로 전달하는 것입니다. 이 링크는 도움이 될 수 있습니다. 인터셉터에서 작동하지 않을 것이라고 생각합니다. 필터는 처리 할 수있는 적절한 장소이지만 시도해 볼 수도 있습니다.

  3. ==============================

    3.원하는 경우 modelAndribute에서 렌더링하는 하나의 modelAttribute를 수정하면 자신의 주석을 사용할 수 있습니다.

    원하는 경우 modelAndribute에서 렌더링하는 하나의 modelAttribute를 수정하면 자신의 주석을 사용할 수 있습니다.

    @ModelAttribute("here you put your entity name")
    public Entity bindModel(final HttpServletRequest request) throws CandidacyException {
        String foo = request.getParameter("foo");
        foo = foo.concat("add new data");
        Entity entity = new Entity();
        entity.setFoo(foo);
        return entity;
    }
    
  4. from https://stackoverflow.com/questions/27504696/how-to-change-the-posted-values-with-a-spring-mvc-interceptor by cc-by-sa and MIT license