2013-09-29 2 views
0

Использование Spring Social и Spring MVC, я пытался использовать RedirectView при подключении к социальному провайдеру и должен что-то пропустить и не удается получить успешный процесс подключения к LinkedIn.Метод Http POST и Spring MVC RedirectView

Вот два метода контроллера: первый действует как ожидалось: на основе выбора поставщика услуг от пользователя он обнаруживает, что он не подключен к Связанному через вызов sp.isconnected() и когда не перенаправляется на представление, которое управляется 2-м способом для инициирования связанного соединения.

Второй способ устанавливает соответствующие параметры права и перенаправляет на соответствующий весовой URL социального соединения (URIs.SPRINGLISIGNIN = "/ connect/linkedin"), но Spring Social ConnectController ожидает на этом этапе метода POST, и я не управляю чтобы выяснить, как передать его через RedirectView. Я ожидал, что первоначальный метод POST от первого метода контроллера будет выполнен ко второму, но это не так. В режиме отладки в методе lisgnin request.getMethod() показывает значение GET.

@RequestMapping(value = Uris.SPCHOICE, method = RequestMethod.POST) 
public RedirectView Spchoice (@RequestParam("sp") String sp, Model model) { 

    ServiceProviders spasenum = ServiceProviders.valueOf(sp); 
    RedirectView toReturn; 
    SPConnectionRetriever spResolver=null; 
    switch (spasenum) { 
    case FACEBOOK : 
     spResolver = FBConnectionRetriever; 
     break; 
    case LINKEDIN : 
     spResolver = LIConnectionRetriever;  
     break; 
    } 
    SecurityContext.setCurrentSpResolver(spResolver); 
    if (spResolver.isconnected()) 
     toReturn = new RedirectView(Uris.MAIN, true); 
    else 
     toReturn = new RedirectView(spResolver.getConnectUrl(), true); 

    return toReturn; 
} 

Вот второй метод:

@RequestMapping(value = Uris.SIGNINLI) 
public RedirectView liSignin(HttpServletRequest request, HttpServletResponse response) { 
    request.setAttribute("scope", "r_fullprofile,r_network"); 
    return new RedirectView(Uris.SPRINGLISIGNIN, true); 
+0

Вам нужно подключиться к браузеру, чтобы представить запрос POST. –

+0

ОК. Как я могу сделать это без каких-либо действий пользователя на стороне браузера? –

ответ

0

Согласно римскому C комментарий, не способ добиться того, что я хотел сделать, не приходя в браузер так, что он может выдать запрос POST. Итак, я добился того, что хотел сделать, построив код и сосредоточив внимание на JSP.

<h3> 
    Showing available Service Providers : 
    <c:out value="${serviceProvider}" /> 
    </h3> 
    <ul> 
    <c:forEach items="${serviceProviders}" var="sp"> 
     <li><c:out value="${sp.name}" /> <c:if test="${sp.connected}"> : Connected with Permissions : <c:out 
        value="${sp.permissions}" /> 
       <form action="<c:url value="<%=Uris.DISCONNECT%>" />" method="POST"> 
        <button type="submit">Disconnect</button> 
        <input type="hidden" name="sp" value="${sp.name}" /> 
       </form> 
      </c:if> 
      <c:if test="${!sp.connected}"> : Disconnected 
      <form action="<c:url value="${sp.URL }" />" method="POST"> 
        <button type="submit">Connect</button> 
        <input type="hidden" name="scope" value="${sp.permissions}" /> 
       </form></c:if></li> 
    </c:forEach> 
</ul> 

Контроллер затем заботится о заполнении информации поставщика услуг в зависимости от состояния соединения. Если соединение с поставщиком услуг отсутствует, в пункте 2 <c:if> будет создана кнопка подключения, которая будет выполнять метод post с правильной областью/разрешениями.

Вот код контроллера (пункты URIs.WORK к СПЯ показано выше):

@RequestMapping(value = Uris.MAIN) 
    public String home(Model model) { 
    List <SPInfo> SPStatusList = new ArrayList<SPInfo>(); 
    for (ServiceProviders sp : ServiceProviders.values()) { 
     SPConnectionRetriever spAccess = SPBank.getSPConnection(sp); 
     SPStatusList.add(new SPInfo(sp.toString(), spAccess.isconnected(), spAccess.getPermissions(),spAccess.getConnectUrl())); 
    } 

    model.addAttribute("nom", SecurityContext.getCurrentUser().getId()); 
     model.addAttribute("serviceProviders", SPStatusList); 

    return Uris.WORK; 
} 

с SPInfo класс смотрит следующим образом:

public class SPInfo { 
    private String name; 
    private boolean connected; 
    private String permissions; 
    private String URL; 

    public SPInfo(String name, boolean isConnected, String permissions, String URL) { 
     super(); 
     this.name = name; 
     this.connected = isConnected; 
     this.permissions = permissions; 
     this.URL = URL; 
    } 
    public String getName() { 
     return name; 
    } 
    public void setName(String name) { 
     this.name = name; 
    } 
    public boolean isConnected() { 
     return connected; 
    } 
    public void setConnected(boolean isConnected) { 
     this.connected = isConnected; 
    } 
    public String getPermissions() { 
     return permissions; 
    } 
    public void setPermissions(String permissions) { 
     this.permissions = permissions; 
    } 
    public String getURL() { 
     return URL; 
    } 
    public void setURL(String uRL) { 
     URL = uRL; 
    } 
} 
Смежные вопросы