1

Ich arbeite mit Spring und Javascript. Aufruf @Controller mit XhrHttpRequest Objekt.HttpServletRequest kann nicht xhr Anforderungsparameter

Ich kann meinen Parameter (JSON-Zeichenfolge) mit Chrome Inspector sehen, aber wenn ich request.getParamter("id") aufrufen, gibt Null zurück.

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

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

Ich weiß nicht, warum Parameter null wird. Vielen Dank.

+0

Ein JSON Körper keinen Anforderungsparameter ist. Offensichtlich wird 'getParameter'' null' zurückgeben. Sie müssen den Körper statt der Parameter analysieren. –

+0

@M.Deinum Einer meiner Freunde schlug vor, 'Converter' zu verwenden, ich werde das testen und zu diesem Beitrag hinzufügen. Vielen Dank für Ihre Mitteilung. –

Antwort

0

Sie müssen die folgenden Schritte folgen Json in Ihrem Controller akzeptieren:

(1) definieren Bean Userlogin die Json zu halten

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

    //Add getters and setters 
} 

(2) Ändern Sie Ihre Steuerung zu übernehmen JSON & empfängt die UserLogin-Bean

@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

Danke. Es sieht Arbeit aus. Gibt es jedoch einen anderen Weg, der keine Extrabohnen macht? da ich nicht festlege, welche Daten ein Benutzer haben sollte (könnte jederzeit in diesem Moment geändert werden und die Datenbank ist damit in Ordnung - MongoDB). Desweiteren möchte ich den üblichen Weg behandeln, den ich mit anderen Controllern teilen kann. –

+0

Login ist nur ein Fall. Ich werde API-Parameter in JSON erhalten. Zum Beispiel für die Liste "{" page ":" 1 "," pageCount ":" 10 "," search ":" aaa "}'. In der Art und Weise, wie Sie vorgeschlagen haben, muss ich eine andere Paging-Bean dafür machen, richtig? Danke, was Sie vorgeschlagen haben, war auch eine wunderbare Lösung. –

0

Dies ist ein alternativer Weg mit der Jackson Library. Ich mag @javaguy, aber mit Jackson Bibliothek könnte flexibler sein, also fügen Sie diesen Beitrag hinzu.

Vorbereitungen

  • WebMvcConfigurerAdapter implementiert Klasse oder gleichwertig etwas mit dieser
  • spring Umwelt. In meinem Fall Eclipse Dynamic Web Project mit Maven und spring-webmvc in pom.xml.

Was ich getan habe ...

  • Implement WebMvcConfigurerAdapter
  • Aufschalten Methode configureMessageConverters
  • ändern Controller Parameter von HttpServeletRequest request, HttpServletResponse resp zu @RequestBody Map<?, ?>. (Sie können generischen Wert ändern. Dabei spielt es keine Fragen zum weiteren Prozess)

Also hier ist Code.

ServerConfig.java (I blockieren andere Optionen aktuellen Ausgabe zu konzentrieren)

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

}; 

und Controller (Parameter ändern Typen)

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

Da jedoch soweit ich weiß @RequestBody nicht hat HttpSession, Wenn Sie versuchen, Daten in HttpSession zu speichern, benötigen Sie einen anderen Parameter HttpServletRequest.

Ich hoffe, dass dies eine Hand für andere sein könnte, die mit mir gleiches Problem hat: D

+0

Wie auch immer, es scheint unmöglich, JSON-Wert von 'HttpServletRequest' selbst zu bekommen. –

Verwandte Themen