sourcetip

Spring 3.0 MVC @ModelAttribute 변수가 URL에 나타나지 않도록 하려면 어떻게 해야 합니까?

fileupload 2023. 7. 27. 22:12
반응형

Spring 3.0 MVC @ModelAttribute 변수가 URL에 나타나지 않도록 하려면 어떻게 해야 합니까?

Spring MVC 3.0.0 사용.릴리스, 컨트롤러는 다음과 같습니다.

@Controller
@RequestMapping("/addIntake.htm")
public class AddIntakeController{

  private final Collection<String> users;

  public AddIntakeController(){
    users = new ArrayList<String>();
    users.add("user1");
    users.add("user2");
    // ...
    users.add("userN");
  }

  @ModelAttribute("users")
  public Collection<String> getUsers(){
    return this.users;
  }

  @RequestMapping(method=RequestMethod.GET)
  public String setupForm(ModelMap model){

    // Set up command object
    Intake intake = new Intake();
    intake.setIntakeDate(new Date());
    model.addAttribute("intake", intake);

    return "addIntake";
  }

  @RequestMapping(method=RequestMethod.POST)
  public String addIntake(@ModelAttribute("intake")Intake intake, BindingResult result){

    // Validate Intake command object and persist to database
    // ...

    String caseNumber = assignIntakeACaseNumber();

    return "redirect:intakeDetails.htm?caseNumber=" + caseNumber;

  }

}

컨트롤러는 HTML 양식에서 입력된 명령 개체에서 입력 정보를 읽고 명령 개체의 유효성을 검사한 후 데이터베이스에 정보를 유지한 후 사례 번호를 반환합니다.

intakeDetails.htm 페이지로 리디렉션하면 다음과 같은 URL이 표시됩니다.

http://localhost:8080/project/intakeDetails.htm?caseNumber=1&users=user1&users=user2&users=user3&users=user4...

사용자 모음이 URL에 표시되지 않도록 하려면 어떻게 해야 합니까?

model.asMap().clear();
return "redirect:" + news.getUrl();

:)

부터 봄 3.1 후RequestMappingHandlerAdapter는 다음플를제다니공라는 합니다.ignoreDefaultModelOnRedirect컨트롤러가 리디렉션되는 경우 기본 모델의 콘텐츠를 사용하지 않도록 방지하는 데 사용할 수 있습니다.

수 좋은 , 지정 요소를 않고, 의 명시적 , 수동 는. 즉, 사용지구요만구않들지다없는이이인화스를턴스수양없소성명성동이의문적시고정니제한과도습없자를은해법결방은).RedirectView).

할 수 있습니다.RedirectView생성자를 보기 합니다. 4" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" "" ""

public class RedirectViewResolver implements ViewResolver, Ordered {
    // Have a highest priority by default
    private int order = Integer.MIN_VALUE; 

    // Uses this prefix to avoid interference with the default behaviour
    public static final String REDIRECT_URL_PREFIX = "redirectWithoutModel:";     

    public View resolveViewName(String viewName, Locale arg1) throws Exception {
        if (viewName.startsWith(REDIRECT_URL_PREFIX)) {
            String redirectUrl = viewName.substring(REDIRECT_URL_PREFIX.length());
            return new RedirectView(redirectUrl, true, true, false);
        }
        return null;
    }

    public int getOrder() {
        return order;
    }

    public void setOrder(int order) {
        this.order = order;
    }
}

@ModelAttribute방법 주석은 참조 데이터를 뷰 레이어에 노출하는 데 사용됩니다.고객님의 경우 확실하게 말씀드릴 수는 없지만, 참조 데이터로 자격을 갖춘 사용자들의 모음이라고는 말씀드릴 수 없습니다.저는 당신이 이 정보를 당신의 모델에 명시적으로 전달할 것을 제안합니다.@RequestMapping methods -handler methods. -handler methods.

그도사면려하용을 사용하고 싶다면,@ModelAttribute리디렉션 문제를 논의하는 블로그 항목이 있습니다.

그러나 모든 @ModelAttribute 메서드는 핸들러가 실행되기 전에 실행되므로 핸들러가 리디렉션을 반환하면 모델 데이터가 쿼리 문자열로 URL에 추가됩니다.응용프로그램을 구성하는 방법에 대한 몇 가지 비밀이 노출될 수 있으므로 이 작업은 반드시 피해야 합니다.

그가 제안한 솔루션(블로그의 파트 4 참조)은 를 사용하여 공통 참조 데이터를 보기에 표시하는 것입니다.참조 데이터가 컨트롤러와 긴밀하게 연결되어서는 안 되므로 설계상으로는 문제가 되지 않습니다.

이 질문과 대답이 오래된 것은 알지만, 저 자신도 비슷한 문제를 겪고 나서 우연히 발견했고 제가 찾을 수 있는 다른 정보는 많지 않습니다.

저는 받아들여진 답변이 그다지 좋은 답변이 아니라고 생각합니다.xtavt에 의한 바로 아래의 답이 훨씬 더 좋습니다.문제는 컨트롤러에 모델 속성에 주석을 다는 것이 타당한지 여부가 아닙니다.일반적으로 ModelAttributes를 사용하는 컨트롤러 내에서 "깨끗한" 리디렉션을 실행하는 방법에 대한 것입니다.컨트롤러 자체는 일반적으로 참조 데이터를 필요로 하지만, 예외적인 상황 등을 위해 다른 곳으로 리디렉션해야 하는 경우가 있으며, 참조 데이터를 전달하는 것은 의미가 없습니다.저는 이것이 타당하고 흔한 패턴이라고 생각합니다.

(후우, 저는 톰캣과 뜻밖에도 이 문제에 부딪혔습니다.리디렉션이 작동하지 않아 java.lang과 같은 이상한 오류 메시지가 표시되었습니다.ArrayIndexOutOfBoundsException: 8192입니다.결국 Tomcat의 기본 최대 헤더 길이는 8192라고 판단했습니다.ModelAttributes가 리디렉션 URL에 자동으로 추가되고 있으며, 이로 인해 머리글 길이가 Tomcat의 최대 머리글 길이를 초과하고 있다는 것을 몰랐습니다.)

저는 시드의 답변을 복사 및 붙여넣기 작업을 줄이면서 변형하여 구현했습니다.

public class RedirectsNotExposingModelUrlBasedViewResolver extends UrlBasedViewResolver {

    @Override
    protected View createView(String viewName, Locale locale) throws Exception {
        View view = super.createView(viewName, locale);
        if (view instanceof RedirectView) {
            ((RedirectView) view).setExposeModelAttributes(false);
        }
        return view;
    }

}

이를 위해서는 뷰 리졸버빈을 정의해야 합니다.

<bean id="viewResolver" class="com.example.RedirectsNotExposingModelUrlBasedViewResolver">
    <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesView"/>
</bean>

제 애플리케이션에서는 리디렉션에서 모델 속성을 노출할 수 있는 사용 사례가 없으므로 org.spring 프레임워크를 확장했습니다.web.servlet.view.응용 프로그램 컨텍스트에서 선언된 createView 메서드를 재정의하는 UrlBasedViewResolver:

public class UrlBasedViewResolverWithouthIncludingModeAtttributesInRedirect extends   UrlBasedViewResolver {

        @Override
        protected View createView(String viewName, Locale locale) throws Exception {
            // If this resolver is not supposed to handle the given view,
            // return null to pass on to the next resolver in the chain.
            if (!canHandle(viewName, locale)) {
                return null;
            }
            // Check for special "redirect:" prefix.
            if (viewName.startsWith(REDIRECT_URL_PREFIX)) {
                String redirectUrl = viewName.substring(REDIRECT_URL_PREFIX.length());
                boolean exposeModelAttributes = false;
                return new RedirectView(redirectUrl, isRedirectContextRelative(), isRedirectHttp10Compatible(), exposeModelAttributes);
            }
            // Check for special "forward:" prefix.
            if (viewName.startsWith(FORWARD_URL_PREFIX)) {
                String forwardUrl = viewName.substring(FORWARD_URL_PREFIX.length());
                return new InternalResourceView(forwardUrl);
            }
            // Else fall back to superclass implementation: calling loadView.
            return super.createView(viewName, locale);
        }

}


  <bean id="viewResolver" class="com.acme.spring.UrlBasedViewResolverWithouthIncludingModeAtttributesInRedirect">

  </bean>

RedirectView 개체를 수동으로 생성할 수 있습니다.

@RequestMapping(method=RequestMethod.POST)
public ModelAndView addIntake(@ModelAttribute("intake")Intake intake, BindingResult result){

    // Validate Intake command object and persist to database
    // ...

    String caseNumber = assignIntakeACaseNumber();

    RedirectView rv = new RedirectView("redirect:intakeDetails.htm?caseNumber=" + caseNumber);
    rv.setExposeModelAttributes(false);
    return new ModelAndView(rv); 
}

IMHO 리디렉션 시 이 동작이 기본 동작이어야 합니다.

또는 요청을 POST로 합니다.Get requests는 URL에 나타나는 요청 매개 변수로만 모델 특성을 표시합니다.

다음은 Java 기반 구성(4.2에서 테스트한 봄 3.1+)으로 수행하는 방법입니다.

@Configuration
public class MvcConfig extends WebMvcConfigurationSupport {

    @Override
    @Bean
    public RequestMappingHandlerAdapter requestMappingHandlerAdapter() {
        RequestMappingHandlerAdapter adapter = super.requestMappingHandlerAdapter();
        adapter.setIgnoreDefaultModelOnRedirect(true);
        return adapter;
    }

    // possible other overrides as well

}

사용하지 @ModelAttribute를 용사저에 합니다.ModelMap어쨌든 당신은 명령 개체로 많은 일을 하고 있습니다.

@RequestMapping(method=RequestMethod.GET)
    public String setupForm(ModelMap model){

        // Set up command object
        Intake intake = new Intake();
        intake.setIntakeDate(new Date());
        model.addAttribute("intake", intake);

        model.addAttribute("users", users);

        return "addIntake";
    }

이에 대한 단점은 유효성 검사 오류가 다음에서 발생하는 것입니다.addIntake()단순히 폼의 논리적 이름을 반환하려면 모델을 사용자로 다시 채워야 합니다. 그렇지 않으면 폼이 올바르게 설정되지 않습니다.

당신의 대의에 도움이 된다면 해결책이 있습니다.

      @ModelAttribute("users")
      public Collection<String> getUsers(){
           return this.users;
      }

여기서 문자열 컬렉션을 반환합니다.사용자의 컬렉션으로 만듭니다(사용자를 나타내는 클래스 래핑 문자열이거나 사용자에 대한 데이터가 많은 클래스일 수 있습니다).문자열에서만 문제가 발생합니다.반환된 컬렉션에 다른 개체가 포함된 경우에는 이 작업이 수행되지 않습니다.그러나 이는 해결 방법일 뿐 필요하지 않을 수도 있습니다.내 2센트야.그냥 다음과 같이...

      @ModelAttribute("users")
      public Collection<User> getUsers(){
           return this.users;
      }

아래 코드를 servlet-config.xml에 추가해 보십시오.

<mvc:annotation-driven ignoreDefaultModelOnRedirect="true" />

때때로 이것은 문제를 해결할 것입니다.

언급URL : https://stackoverflow.com/questions/2163517/how-do-i-prevent-spring-3-0-mvc-modelattribute-variables-from-appearing-in-url

반응형