[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.나는 내 자신의 질문에 답한다. 실제로 그것은 다소 복잡하고 작동하는 해결책을 찾기 위해 어느정도 시간이 걸립니다. 먼저 스프링 구성 클래스에 필터를 만들었습니다 (스프링 부트 환경).
나는 내 자신의 질문에 답한다. 실제로 그것은 다소 복잡하고 작동하는 해결책을 찾기 위해 어느정도 시간이 걸립니다. 먼저 스프링 구성 클래스에 필터를 만들었습니다 (스프링 부트 환경).
@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.HttpServletRequest에서 클라이언트에서 온 요청을 나타내야하므로 아무 것도 변경하면 안됩니다. 시나리오와 같은 시나리오에 사용되는 구성은 HttpServletRequestWrapper입니다.
HttpServletRequest에서 클라이언트에서 온 요청을 나타내야하므로 아무 것도 변경하면 안됩니다. 시나리오와 같은 시나리오에 사용되는 구성은 HttpServletRequestWrapper입니다.
당신이해야 할 일은 HttpServletRequestWrapper를 확장하고, param 변경 로직을 적용 할 수있는 getParameter 메소드를 재정의하고, 포장 된 요청을 전달 체인 아래로 전달하는 것입니다. 이 링크는 도움이 될 수 있습니다. 인터셉터에서 작동하지 않을 것이라고 생각합니다. 필터는 처리 할 수있는 적절한 장소이지만 시도해 볼 수도 있습니다.
-
==============================
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; }
from https://stackoverflow.com/questions/27504696/how-to-change-the-posted-values-with-a-spring-mvc-interceptor by cc-by-sa and MIT license
'SPRING' 카테고리의 다른 글
[SPRING] varargs를 Spring spEL에 전달하면 "com.sun.proxy에서 메서드를 찾을 수 없습니다." (0) | 2019.05.28 |
---|---|
[SPRING] 검색 폼에서 데이터 액세스 속도 향상 (0) | 2019.05.28 |
[SPRING] 환경 변수 또는 속성에 따라 PointCut 실행 (0) | 2019.05.28 |
[SPRING] 목록에 자동로드 될 때의 빈 순서 (0) | 2019.05.28 |
[SPRING] Spring MVC에서 빈 문자열 대신에 형태 값을 NULL로 설정 (0) | 2019.05.28 |