0

使用 Spring Social 和 Spring MVC,我尝试在连接到社交提供者时使用 RedirectView,但一定是遗漏了一些东西,并且无法成功连接到 LinkedIn。

以下是 2 个控制器方法:第一个按预期运行:根据用户的服务提供商选择,它检测到它未通过sp.isconnected()调用连接到 Linked,并且当未重定向到由第二个控制的视图时方法来启动链接的连接。

第二种方法设置适当的正确参数并重定向到适当的 spring 社交连接 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);
4

1 回答 1

0

根据 Roman 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;
    }   
}
于 2013-10-04T20:53:25.407 回答