1

我正在使用Spring和JavaScript。使用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); 
} 

接收部分同春@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)定義USERLOGIN bean保存的Json

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

    //Add getters and setters 
} 

(2)改變你的控制器接受Json &收到用戶登錄豆

@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

謝謝。它看起來工作。然而,有沒有其他方式不會增加額外的bean?因爲我不確定用戶應該擁有哪些數據(可以在此刻隨時更改,數據庫可以使用MongoDB)。此外,我想處理可以與其他控制器共享的通用方式。 –

+0

登錄只是一個案例。我將在JSON中接收API參數。例如,對於「{」頁面「:」1「,」pageCount「:」10「,」search「:」aaa「}'列表。你建議我必須爲它創建另一個分頁bean,對吧?不過謝謝,無論如何,你提出的建議也是非常好的解決方案。 –

0

這是Jackson Library的替代方式。我喜歡@javaguy的方式,但使用傑克遜庫可以更靈活,所以添加這篇文章。

準備

  • WebMvcConfigurerAdapter實現類或等價的東西與
  • springframework的環境。在我的情況下,Eclipse Dynamic Web ProjectMavenspring-webmvcpom.xml

我做了什麼......

  • 實施WebMvcConfigurerAdapter
  • 覆蓋方法configureMessageConverters
  • 更改控制器參數從HttpServeletRequest request, HttpServletResponse resp@RequestBody Map<?, ?>(你可以改變通用的價值。它不事項作進一步過程)

所以這裏的代碼。

ServerConfig.java(我阻止其他選項關注當前問題)

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

}; 

和控制器(更改參數類型)

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

然而,因爲據我所知@RequestBody沒有HttpSession,如果您嘗試將數據存儲到HttpSession,則需要另一個參數HttpServletRequest

我希望這可以成爲其他與我有同樣問題的人的手:D

+0

無論如何,從'HttpServletRequest'本身獲取JSON值似乎是不可能的。 –