2013-09-29 68 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; 
    } 
}