在Web应用中通过OAuth Servlet对接Facebook:Servlet调用问题求助
Hey there! It sounds like you’re already on the right track with using a Servlet to fetch an Access Token (shoutout to Mat B. for confirming that approach). Let’s walk through exactly how to deploy that Servlet and call it—no more head-scratching over setup.
Step 1: Make Sure Your Servlet Class is Properly Structured
First, double-check your Servlet follows the basic template. It should extend HttpServlet and override either doGet or doPost (depending on how you want to trigger the token fetch). Here’s a quick example:
import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; import java.io.PrintWriter; @WebServlet("/get-access-token") // 注解方式映射URL,Servlet 3.0+支持 public class AccessTokenServlet extends HttpServlet { @Override protected void doGet(HttpServletRequest request, HttpServletResponse response) throws IOException { // 替换成你的实际Access Token获取逻辑 String accessToken = fetchAccessTokenFromAuthServer(); // 返回Token(这里用JSON格式,你也可以返回纯文本) response.setContentType("application/json"); PrintWriter out = response.getWriter(); out.write("{\"access_token\": \"" + accessToken + "\"}"); out.flush(); } // 模拟你的Token获取方法 private String fetchAccessTokenFromAuthServer() { // 这里写调用授权服务器的逻辑,比如用HttpClient发送请求 return "your-actual-access-token-here"; } }
Step 2: Deploy the Servlet to Your Web Container
You’ve got two main ways to wire up the Servlet so your web server recognizes it:
Option A: Annotation-Based (Servlet 3.0+)
If you’re using a modern web container (Tomcat 7+, Jetty 9+, etc.), just add the @WebServlet("/get-access-token") annotation directly to your Servlet class (like in the example above). That’s it—no extra XML config needed.
Option B: web.xml Configuration (Legacy Approach)
If you’re stuck with an older setup, add these lines to your WEB-INF/web.xml file:
<servlet> <servlet-name>AccessTokenServlet</servlet-name> <servlet-class>com.your.package.AccessTokenServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>AccessTokenServlet</servlet-name> <url-pattern>/get-access-token</url-pattern> </servlet-mapping>
Replace com.your.package with the actual package where your Servlet class lives.
Step 3: Call the Servlet (No More JSP Headaches!)
Since your framework’s JSP structure is causing issues, forget trying to call it directly from JSP. Instead:
- Direct Browser Test: Fire up your web server (Tomcat, etc.), then visit
http://localhost:8080/your-webapp-name/get-access-token(replaceyour-webapp-namewith your app’s context path—usually the name of your WAR file). You should see the Access Token in the response. - Frontend AJAX Call: If you need to use the Token in your app’s UI, use JavaScript to fetch it:
fetch('/your-webapp-name/get-access-token') .then(response => response.json()) .then(data => { console.log("Got Access Token:", data.access_token); // Use the token for API calls, etc. }) .catch(error => console.error("Error fetching token:", error)); - Backend Framework Call: If you need to call it from your Java framework (like Spring), use
RestTemplateorHttpClientto send a GET request to the Servlet’s URL:RestTemplate restTemplate = new RestTemplate(); String tokenResponse = restTemplate.getForObject("http://localhost:8080/your-webapp-name/get-access-token", String.class); // Parse the JSON to extract the token
Quick Troubleshooting Tips
- If you get a 404 error: Double-check the URL path, your webapp’s context path, and that the Servlet class is in the correct directory (
WEB-INF/classesfor exploded WARs). - If you get a 500 error: Check your web server’s logs for stack traces—this usually means your Token fetch logic has an error (like missing dependencies for HTTP calls).
内容的提问来源于stack exchange,提问作者AyukNayr

