首页 文章

Spring,Facebook登录:Servlet没有被执行登录

提问于
浏览
0

我正在开发一个Spring-MVC应用程序,我们希望使用Facebook登录 . 我尝试了一些代码,我被重定向到Facebook页面请求许可,然后当我给予许可时,我可以看到该应用程序已在Facebook的“我的应用程序”中注册 .

问题是servlet中的后端代码没有被执行,这将使我像UserDetails一样发送电子邮件等,我可以用它来登录/注册 . 我不知道为什么 .

此外,是否有任何其他方式来访问数据,而不是使用循环和读取变量,如通过RestTemplate左右的对象 .

代码时间:

公共类FbSignIn扩展HttpServlet {

public void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {
    System.out.println("How to know if I was executed");
    String code = req.getParameter("code");
    if (code == null || code.equals("")) {
        System.out.println("No code recieved");
    }

    String token = null;
    try {
        String g = "https://graph.facebook.com/oauth/access_token?client_id=appid&redirect_uri=url&" + URLEncoder.encode("http://myappengineappid.appspot.com/signin_fb.do", "UTF-8") + "&client_secret=clientsecret&code=" + code;
        URL u = new URL(g);
        URLConnection c = u.openConnection();
        BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
        String inputLine;
        StringBuffer b = new StringBuffer();
        while ((inputLine = in.readLine()) != null)
            b.append(inputLine + "\n");
        in.close();
        token = b.toString();
        if (token.startsWith("{"))
            throw new Exception("error on requesting token: " + token + " with code: " + code);
    } catch (Exception e) {
        e.printStackTrace();
    }

    String graph = null;
    try {
        String g = "https://graph.facebook.com/me?" + token;
        URL u = new URL(g);
        URLConnection c = u.openConnection();
        BufferedReader in = new BufferedReader(new InputStreamReader(c.getInputStream()));
        String inputLine;
        StringBuffer b = new StringBuffer();
        while ((inputLine = in.readLine()) != null)
            b.append(inputLine + "\n");
        in.close();
        graph = b.toString();
    } catch (Exception e) {
        e.printStackTrace();
        // an error occurred, handle this
    }

    String facebookId;
    String firstName;
    String middleNames;
    String lastName;
    String email;
    //Gender gender;
    try {
        JSONObject json = new JSONObject(graph);
        facebookId = json.getString("id");
        firstName = json.getString("first_name");
        System.out.println("First name is "+firstName);
// I want to avoid this, but access via objects
        if (json.has("middle_name"))
            middleNames = json.getString("middle_name");
        else
            middleNames = null;
        if (middleNames != null && middleNames.equals(""))
            middleNames = null;
        lastName = json.getString("last_name");
        email = json.getString("email");

        if (json.has("gender")) {
            String g = json.getString("gender");
            if (g.equalsIgnoreCase("female")){
                System.out.println("Female");
            }
            //gender = Gender.FEMALE;

            else if (g.equalsIgnoreCase("male")){
                System.out.println("Male");
            }
            //gender = Gender.MALE;
            else{
                System.out.println("Unknown gender");
            }
            //    gender = Gender.UNKNOWN;
        } else {
            System.out.println("Gender unknown");
            //   gender = Gender.UNKNOWN;
        }
    } catch (JSONException e) {
        e.printStackTrace();
    }
}

}

web.xml中的serlvet:

<servlet>
    <servlet-name>FbSignin</servlet-name>
</servlet>
<servlet-mapping>
    <servlet-name>FbSignin</servlet-name>
    <url-pattern>/*</url-pattern>
</servlet-mapping>

JSP文件调用代码:

<%@page import="java.net.URLEncoder" %>
<%
    String fbURL = "http://www.facebook.com/dialog/oauth?client_id=123456&redirect_uri=redirect.com&" + URLEncoder.encode("http://myappengineappid.appspot.com/signin_fb.do") + "&scope=email";
%>

<a href="<%= fbURL %>"><img src="/img/fb.png" border="0" width="300" height="300" /></a>

我做错了什么,我只是想得到详细信息,所以我可以注册用户并登录他 . 下次当用户再次点击按钮时,我将从FB获取电子邮件地址,验证它是否存在在DB中,并登录 .

更新

JSP的新servlet映射:

<servlet>
        <servlet-name>mvc-dispatcher</servlet-name>
        <servlet-class>com.journaldev.spring.Login.FbSignIn</servlet-class>
    </servlet>

    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/FbSignin</url-pattern>
    </servlet-mapping>

1 回答

  • 0

    Spring-MVC应用程序:

    <servlet>
            <servlet-name>FbSignin</servlet-name>
            <servlet-class>
                      org.springframework.web.servlet.DispatcherServlet
            </servlet-class>
            <load-on-startup>1</load-on-startup>
      </servlet>
    
      <servlet-mapping>
          <servlet-name>FbSignin</servlet-name>
          <url-pattern>/FbSignin/*</url-pattern>
      </servlet-mapping>
    

    你应该点击:

    http://<ip_address:port>/<app__context_name>/FbSignin/<servletName>
    

    简单的JSP Servlet映射条目:

    <servlet>
         <servlet-name>mvc-dispatcher</servlet-name>
         <servlet-class><source/class_pac>.FbSignin</servlet-class>
    </servlet>
    
    <servlet-mapping>
        <servlet-name>mvc-dispatcher</servlet-name>
        <url-pattern>/<ur_defined_servletName></url-pattern>
    </servlet-mapping>
    

    你应该点击: http://<ip_address:port>/<app__context_name>/<ur_defined_servletName>

相关问题