1

저는 스프링과 자바 스크립트로 작업하고 있습니다. XhrHttpRequest 개체로 @Controller을 호출합니다.HttpServletRequest가 xhr 요청 매개 변수를 가져올 수 없습니다.

Chrome Inspector에서 매개 변수 (JSON 문자열)를 볼 수 있지만 request.getParamter("id")을 호출하면 null이 반환됩니다.

Calling part with js 
function ajax(url, data, callback, method){ 
    //data is {"id":"system", "password" : "1234"} 
    var httpRequest; 
    var afterAction = function(){ 
     if(!httpRequest) { 
      console.error('can not find httpRequest variable'); 
      return; 
     } 

     if (httpRequest.readyState === XMLHttpRequest.DONE) { 
      if (httpRequest.status === 200) { 
       var responseData = httpRequest.responseText; 
       //alert(JSON.stringify(responseData)); 
       console.log('Result of API call >>>', responseData); 
       if(typeof callback == 'function') { 
        callback(JSON.parse(responseData)); 
       } 
      } else { 
       alert('There was a problem with the request.'); 
      } 
     } 
    } 

    //=========== LOGIC ============ 
    if (window.XMLHttpRequest) { // Mozilla, Safari, IE7+ ... 
     httpRequest = new XMLHttpRequest(); 
    } else if (window.ActiveXObject) { // IE 6 and older 
     httpRequest = new ActiveXObject('Microsoft.XMLHTTP'); 
    } 

    if(!method) method = 'POST'; 
    data = (!!data) ? JSON.stringify(data) : ''; 

    httpRequest.onreadystatechange = afterAction; 
    httpRequest.open(method.toUpperCase(), url, true); 
    httpRequest.setRequestHeader("Content-type", "application/json; charset=utf-8"); 
    //httpRequest.setRequestHeader("Content-length", data.length); 
    //httpRequest.setRequestHeader("Connection", "close"); 
    httpRequest.send(data); 
} 

는 매개 변수가 null이된다 이유를 모르겠어요 봄 @Controller

@Controller 
@RequestMapping(value={"member"}, produces={"application/json"}) 
@ResponseStatus(value = HttpStatus.OK) 
public class MemberController { 

    /** 
    * @param request 
    * @param resp 
    * @return 
    * @throws Exception 
    */ 
    @RequestMapping(value={"/login"}) 
    public @ResponseBody String login(HttpServletRequest request, HttpServletResponse resp) throws Exception { 
     System.out.println("Login request"); 
     String id = String.valueOf(request.getParameter("id"));     //returns null 
     String password = String.valueOf(request.getParameter("password"));  //returns null 

     Map<String, String> result = new HashMap<String, String>(); 
     result.put("result", "S"); 
     result.put("message", "login success"); 
     ObjectMapper mapper = new ObjectMapper(); 
     return mapper.writeValueAsString(result); 
    } 
} 

으로 일부를받을 수 있습니다. 감사.

+0

JSON의 몸이 요청 매개 변수되지 않습니다 :

나는이 저와 같은 문제가 다른 사람에게 손이 될 수 있기를 바랍니다. 그래서 분명히'getParameter'는'null'을 리턴 할 것입니다. 매개 변수 대신 본문을 구문 분석해야합니다. –

+0

@ M.Deinum 제 친구 중 한 명은'Converter'를 사용하라고 제안했습니다. 나는 이것을 테스트하고이 게시물에 추가 할 것입니다. 정보 공유 주셔서 감사합니다 –

답변

0

당신은 컨트롤러에 Json에 동의 아래 단계를 수행해야합니다

(1) JSON을 잡고 빈을 userlogin에 정의

public class UserLogin { 
    private String id; 
    private String password; 

    //Add getters and setters 
} 

(2) 허용하도록 컨트롤러를 변경 Json &은 UserLogin 빈을받습니다.

@Controller 
@RequestMapping(value={"member"}, produces={"application/json"}) 
@ResponseStatus(value = HttpStatus.OK) 
public class MemberController { 

    @RequestMapping(value={"/login"}, method = RequestMethod.POST, consumes = MediaType.APPLICATION_JSON_VALUE) 
    public @ResponseBody String login(UserLogin userLogin) throws Exception { 
     System.out.println("Login request"); 
     String id = userLogin.getId();    
     String password = userLogin.getPassword(); 

     Map<String, String> result = new HashMap<String, String>(); 
     result.put("result", "S"); 
     result.put("message", "login success"); 
     ObjectMapper mapper = new ObjectMapper(); 
     return mapper.writeValueAsString(result); 
    } 
} 
+0

고마워요. 보이는 군. 그러나 여분의 콩을 만들지 않는 다른 방법이 있습니까? 나는 사용자가 어떤 데이터를 가져야 하는지를 결정하지 않기 때문에 (이 시점에서 언제든지 변경 될 수 있으며 데이터베이스는 MongoDB에서 OK입니다.) 더 나아가 다른 컨트롤러와 공유 할 수있는 일반적인 방법을 사용하고 싶습니다. –

+0

로그인은 올바른 예입니다. JSON에서 API 매개 변수를 수신 할 예정입니다. 예를 들어,리스트'{ "page": "1", "pageCount": "10", "search": "aaa"}'. 당신이 내가 다른 페이징 빈을 만들어야한다고 제안 했지? 고마워요, 당신이 제안한 것은 어쨌든 훌륭한 솔루션이었습니다. –

0

이것은 Jackson Library의 다른 방법입니다. @javaguy의 방식이 마음에 들지만 Jackson 라이브러리를 사용하면 더욱 유연 해 지므로이 게시물을 추가하십시오.

준비

  • WebMvcConfigurerAdapter 클래스 또는
  • 스프링 프레임 워크 환경에 상응하는 뭔가를 구현합니다. 필자의 경우 Eclipse Dynamic Web ProjectMaven이고 spring-webmvcpom.xml입니다.

    • 가 구현 내가 무슨 짓을

    ... WebMvcConfigurerAdapter

  • 재정의 방법 HttpServeletRequest request, HttpServletResponse resp에서 @RequestBody Map<?, ?>configureMessageConverters
  • 변경 컨트롤러 매개 변수를 설정합니다. (당신은 일반적인 값을 변경할 수 있습니다. 그것은 더에 대한 문제를하지 않습니다 프로세스)

코드 예.

ServerConfig.java는 지금까지 내가 @RequestBody이없는 알고 있기 때문에,

@Controller 
@RequestMapping(value={"member"}, produces={"application/json"}) 
@ResponseStatus(value = HttpStatus.OK) 
public class MemberApiController { 

    ... 

    @RequestMapping(value={"/login"}) 
    public @ResponseBody String login(@RequestBody Map<?, ?> jsonBody) throws JsonProcessingException { 
     System.out.println("Login request" + jsonBody.toString()); 
     Map<String, String> result = new HashMap<String, String>(); 
     String rs = "S"; 
     String message = "SUCCESS"; 

     System.out.println("ID >>> ", String.valueOf(jsonBody.get("id"))); 
     System.out.println("PW >>> ", String.valueOf(jsonBody.get("password"))); 

     result.put("result", rs); 
     result.put("result_msg", message); 
     mapper = new ObjectMapper(); 
     return mapper.writeValueAsString(result); 
    } 
}; 

그러나

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages={ ... } 
, [email protected](Configuration.class)) 
//Filter 걸 때 Configuration.class 를 수동으로 등록해줘야 되는데 나은 방법 찾아보기 
public class ServerConfig extends WebMvcConfigurerAdapter { 

    ... 

    @Override 
    public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { 
     converters.add(new MappingJackson2HttpMessageConverter()); 
     super.configureMessageConverters(converters); 
    } 

}; 

그리고 컨트롤러 (매개 변수 변경 유형) (I는 현재의 문제를 집중하기 위해 다른 옵션을 차단) HttpSession, 데이터를 HttpSession에 저장하려고하면 다른 매개 변수 HttpServletRequest이 필요합니다.D

+0

어쨌든'HttpServletRequest' 자체에서 JSON 값을 가져 오는 것은 불가능한 것처럼 보입니다. –

관련 문제