2013-09-29 90 views
0

使用Spring Social和Spring MVC時,我試圖在連接到社交提供者時使用RedirectView,並且必須缺少一些東西,並且無法成功獲得與LinkedIn的成功連接過程。Http POST方法和Spring MVC RedirectView

這裏是2種控制器方法:第一種用作預期:基於服務提供商的選擇從用戶,它檢測到它沒有連接到鏈接在直通的sp.isconnected()呼叫,並且當不重定向到一個觀點,即由第二種方法控制以啓動鏈接連接。

第二種方法設置適當的權限參數並重定向到合適的春季社交連接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> 

然後控制器需要填充取決於它的連接狀態的服務提供商信息的服務。如果沒有連接到服務提供者,則第二個<c:if>子句將構建一個連接按鈕,負責使用正確的範圍/權限執行post方法。

這裏是控制器代碼(URIs.WORK點上面顯示的JSP):

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