2014-06-27 8 views
5

के माध्यम से प्राप्त jsessionid को कैसे भेजा जाए मैं क्लाइंट-साइट पर स्प्रिंग 4 और सर्वर-साइट पर स्प्रिंग 4 के साथ एक मैसेंजर लिख रहा हूं। मैंने वसंत-सुरक्षा 3.2 के साथ सर्वर को सुरक्षित किया। अब मेरी समस्या: मेरे पास क्लाइंट चुड़ैल पर एक लॉगिन पेज है जो लॉगिन जानकारी को वसंत-सुरक्षा में भेजता है और JSESSIONID कुकी प्राप्त करता है। यह ठीक काम करता है, लेकिन जब मैं अपने अनुरोध के साथ jsessionid भेजने के लिए प्रयास करते समय मुझेस्प्रिंग 4 resttemplate

org.springframework.web.client.RestClientException: Could not extract response: no suitable HttpMessageConverter found for response type [class org.messenger.rest.JSONConversationResult] and content type [text/html;charset=UTF-8] 

सर्वर Inizializer

public class SpringMvcInitializer extends 
    AbstractAnnotationConfigDispatcherServletInitializer { 

    @Override 
    protected Class<?>[] getRootConfigClasses() { 
     return new Class[] {ApplicationConfig.class}; 
    } 

    @Override 
    protected Class<?>[] getServletConfigClasses() { 
     return new Class[] {WebConfig.class}; 
    } 

    @Override 
    protected String[] getServletMappings() { 
     return new String[] {"/"}; 
    } 
} 

सर्वर SecurityInizializer

public class SpringSecurityInitializer extends 
    AbstractSecurityWebApplicationInitializer { 
} 

सर्वर SecurityConfig

@Configuration 
@EnableWebSecurity 
public class SecurityConfig extends WebSecurityConfigurerAdapter { 

    @Autowired 
    private DriverManagerDataSource dataSource; 

    @Override 
    protected void configure(AuthenticationManagerBuilder auth) throws Exception { 
     String authQuery = "select userid, authority from user where userid = ?"; 
     String userQuery = "select userid, pw, enabled from user where userid = ?"; 

     auth.jdbcAuthentication().dataSource(dataSource) 
      .passwordEncoder(passwordEncoder()) 
      .usersByUsernameQuery(userQuery) 
      .authoritiesByUsernameQuery(authQuery); 

    } 

    @Override 
    protected void configure(HttpSecurity http) throws Exception { 


     http 
      .authorizeRequests() 
       .antMatchers("/register").permitAll() 
       .antMatchers("/getconvs", "/getcontacts").hasRole("USER") 
       .and() 
      .formLogin() 
       .and() 
      .csrf().disable(); 
    } 

    @Bean 
    public AuthenticationEntryPoint authenticationEntryPoint() { 
     return new de.daschner.messenger.security.AuthenticationEntryPoint(); 
    } 

    @Bean 
    public SuccessHandler successHandler() { 
     return new SuccessHandler(); 
    } 

    @Bean 
    public SimpleUrlAuthenticationFailureHandler failureHandler() { 
     return new SimpleUrlAuthenticationFailureHandler(); 
    } 

    @Bean 
    public AuthenticationManager authenticationManager() throws Exception { 
     return super.authenticationManager(); 
    } 

    @Bean 
    public PasswordEncoder passwordEncoder() { 
    return new BCryptPasswordEncoder(11); 
    } 
} 
बन

सर्वर सुरक्षित "पृष्ठ"

@RequestMapping(value="/getconvs", method={RequestMethod.GET}, 
     produces={MediaType.APPLICATION_JSON_VALUE}) 
public @ResponseBody JSONConversationResult getConvsList(HttpServletRequest request, @RequestParam(value="uid") String uid){ 
    JSONConversationResult ret = new JSONConversationResult(); 
    Map<String, Map<Date, String>> convs = convService.getConvsList(uid); 
    if (convs != null) { 
     ret.setConversations(convs); 
     ret.setMessage("OK"); 
     ret.setError(0); 
    } else { 
     ret.setError(1); 
     ret.setMessage("Verbindungsfehler"); 
    } 
    return ret; 
} 

ग्राहक भेजने लॉग इन के लिए requestmapping और कुकी

Map<String, String> loginform = new HashMap<String, String>(); 
    loginform.put("username", user); 
    loginform.put("password", pw); 
    HttpEntity<Map<String, String>> login = new HttpEntity<Map<String, String>>(loginform); 

    ResponseEntity<HttpServletResponse> response = restTemplate.exchange(
      "http://localhost:8080/messenger-webapp/login", 
      HttpMethod.POST, 
      login, 
      HttpServletResponse.class); 

    HttpHeaders headers = response.getHeaders(); 
    Set<String> keys = headers.keySet(); 
    String cookie = ""; 
    for (String header : keys) { 
     if (header.equals("Set-Cookie")) { 
      cookie = headers.get(header).get(0); 
     } 
    } 
    String jsessionid = cookie.split(";")[0]; 
    conf.setJsessionid(jsessionid.split("=", 2)[1]); 
    return ret; 

क्लाइंट अनुरोध

ResponseEntity<JSONConversationResult> response = restTemplate.exchange(
      "http://localhost:8080/messenger-webapp/getconvs?uid=" + uid, 
      HttpMethod.GET, 
      getAuthHeader(), 
      JSONConversationResult.class); 

    JSONConversationResult ret = response.getBody(); 
    return ret; 

    private HttpEntity<String> getAuthHeader() { 
     HttpHeaders requestHeaders = new HttpHeaders(); 
     requestHeaders.add("Cookie", "JSESSIONID=" + config.getJsessionid()); 
     return new HttpEntity<String>(requestHeaders); 
    } 

मुझे आशा है कि आप मेरी मदद कर सकते हैं के साथ jsessionid भेज मिलता है।

संपादित करें:

ठीक है मैं पता लगा है कि समस्या नहीं था कि jsessionid सही ढंग से नहीं भेजा गया था। लेकिन मेरा लॉगिन गलत था और उपयोगकर्ता को डेटाबेस से प्राप्त करने के लिए मेरी क्वेरी थी।

सही लॉगिन पोस्ट

ClientHttpResponse response = restTemplate.execute(
      "http://localhost:8080/messenger-webapp/login", 
      HttpMethod.POST, 
      new RequestCallback() { 

       @Override 
       public void doWithRequest(ClientHttpRequest request) throws IOException { 
        request.getBody().write(("username=" + user + "&password=" + pw).getBytes()); 
       } 
      }, 
      new ResponseExtractor<ClientHttpResponse>() { 

       @Override 
       public ClientHttpResponse extractData(ClientHttpResponse response) 
         throws IOException { 
        return response; 
       } 
      }); 

सही क्वेरी

String authQuery = "select u.userid, r.role_name from user u, role r, user_role a where u.dbid = a.user_id and r.dbid = a.role_id and u.userid = ?"; 

मुझे आशा है कि यह अन्य लोगों को मदद मिलेगी। अगर किसी के पास कोई विकल्प है तो कृपया मुझे बताएं।

+0

आप आगे बढ़ सकते हैं और अपना उत्तर वास्तविक उत्तर के रूप में पोस्ट कर सकते हैं- – chrismarx

उत्तर

1

ठीक है मुझे पता चला कि समस्या यह नहीं थी कि JSESSIONID सही ढंग से नहीं भेजा गया था। लेकिन मेरा लॉगिन गलत था और उपयोगकर्ता को डेटाबेस से प्राप्त करने के लिए मेरी क्वेरी थी।

सही लॉगिन पोस्ट

ClientHttpResponse response = restTemplate.execute(
      "http://localhost:8080/messenger-webapp/login", 
      HttpMethod.POST, 
      new RequestCallback() { 

       @Override 
       public void doWithRequest(ClientHttpRequest request) throws IOException { 
        request.getBody().write(("username=" + user + "&password=" + pw).getBytes()); 
       } 
      }, 
      new ResponseExtractor<ClientHttpResponse>() { 

       @Override 
       public ClientHttpResponse extractData(ClientHttpResponse response) 
         throws IOException { 
        return response; 
       } 
      }); 

सही क्वेरी

String authQuery = "select u.userid, r.role_name from user u, role r, user_role a where u.dbid = a.user_id and r.dbid = a.role_id and u.userid = ?"; 

मुझे आशा है कि यह अन्य लोगों को मदद मिलेगी। अगर किसी के पास कोई विकल्प है तो कृपया मुझे बताएं।

संबंधित मुद्दे