깨구리
1k
2016-03-17 18:01:21
4
6289

request에 파라미터를 추가하고싶습니다


Interceptor에서 특정 조건일 경우 request에 파라미터를 추가하고 싶은데요

Interceptor의 preHandle  메소드에서 아래 코드처럼 HttpServletRequestWrapper를 상속받아 setParameter한 객체를 넘겨주었는데, 막상 Controller에서 찍어보면 해당 파라미터의 키조차 없습니다.

Interceptor 순서에 영향을 받나싶어서 순서도 바꿔봤는데 같은 현상입니다.


혹시 @ModelAttribute 어노테이션을 사용 중인데, preHandle 전에 값을 세팅하게 되나요? Controller 전에 request 파라미터를 변조할 방법이 궁금합니다.


import java.util.Collections;
import java.util.Enumeration;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletRequestWrapper;

public class EditableHttpServletRequest extends HttpServletRequestWrapper {

	private HashMap params = new HashMap();

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

	/*
	 * (non-Javadoc)
	 *
	 * @see javax.servlet.ServletRequest#getParameter(java.lang.String)
	 */
	public String getParameter(String name) {
		String returnValue = null;
		String[] paramArray = getParameterValues(name);
		if (paramArray != null && paramArray.length > 0) {
			returnValue = paramArray[0];
		}
		return returnValue;
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see javax.servlet.ServletRequest#getParameterMap()
	 */
	public Map getParameterMap() {
		return Collections.unmodifiableMap(params);
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see javax.servlet.ServletRequest#getParameterNames()
	 */
	public Enumeration getParameterNames() {
		return Collections.enumeration(params.keySet());
	}

	/*
	 * (non-Javadoc)
	 *
	 * @see javax.servlet.ServletRequest#getParameterValues(java.lang.String)
	 */
	public String[] getParameterValues(String name) {
		String[] result = null;
		String[] temp = (String[]) params.get(name);
		if (temp != null) {
			result = new String[temp.length];
			System.arraycopy(temp, 0, result, 0, temp.length);
		}
		return result;
	}

	/**
	 * Sets the a single value for the parameter. Overwrites any current values.
	 *
	 * @param name
	 *            Name of the parameter to set
	 * @param value
	 *            Value of the parameter.
	 */
	public void setParameter(String name, String value) {
		String[] oneParam = { value };
		setParameter(name, oneParam);
	}

	/**
	 * Sets multiple values for a parameter. Overwrites any current values.
	 *
	 * @param name
	 *            Name of the parameter to set
	 * @param values
	 *            String[] of values.
	 */
	public void setParameter(String name, String[] values) {
		params.put(name, values);
	}

}


0
0
  • 답변 4

  • zepinos
    19k
    2016-03-17 18:31:02
    원래 안됩니다.


    0
  • 커비
    2k
    2016-03-17 20:36:33

    servlet filter로 하시면됩니다.

    servlet filter로 랩핑된 request를 다음 chain으로 넘기면됩니다.

    1
  • zepinos
    19k
    2016-03-18 11:19:02

    모바일이라 짧게 내용을 적었는데, 커비 님게서 정확하게 알려주셨네요.


    좀 더 부연설명하자면, Interceptor 는 Filter 와 달리 값을 가로채서 그 값을 사용할 수 있게 하는 기능을 가집니다. 그 외에도...제가 처음 배울 땐 필요한 요청만 가져오는 형태라고 배웠지만, 그건 무리수같고...


    반대로 Filter 는 제가 배울 땐 모든 요청을 가져와서(필요 없는 것만 제외하는 형식) 처리하는 기능이라고 배웠는데, 더 중요한 건, chain 을 통해 변조된 값을 넣어서 다음으로 전달하는 기능을 가지고 있다는 것입니다.


    그래서 "원래 안됩니다." 라는 저의 댓글의 정확한 의미는 "(Interceptor 에서는) 원래 안됩니다." 입니다. Filter 을 이용해서 처리하시면 됩니다. 저의 경우도 요즘 spring boot 로 하는데, Filter 가 살짝 구현이 더 길어져서 배제하다가...이 기능 쓰려고 어쩔 수 없이 Filter 을 넣긴 했습니다.


    1
  • 깨구리
    1k
    2016-03-21 01:37:21

    자세한 답변 감사합니다 내일 출근하면 필터로 해보겠습니다 :)

    0
  • 로그인을 하시면 답변을 등록할 수 있습니다.