【问题标题】:How to call a servlet from the RESTful web services method?如何从 RESTful Web 服务方法调用 servlet?
【发布时间】:2015-09-25 14:38:16
【问题描述】:

我编写了一个存在业务逻辑的 servlet。我将从调用我的 RESTful Web 服务方法的调用程序中获得一个令牌。有了这个令牌,我需要使用 serlvet 中编写的业务逻辑进行验证。我还映射了一个过滤器,它在点击 servlet 之前设置了一些标头值。

现在我想从 RESTful Web 服务方法中点击过滤器和 servlet。可以通过以下方式获取 ServletContext。

@上下文 私有 ServletContext servletContext;

但是如何获取HttpServletRequest、HttpServletResponse对象。因为,我需要在 HttpServletRequest 中设置 token 的属性。

请提出解决方案。

提前致谢。

编辑

我需要将令牌设置为授权标头。下面是代码。 web.xml

<filter>
    <filter-name>HeaderFilter</filter-name>
    <filter-class>com.controller.HeaderFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>HeaderFilter</filter-name>
    <url-pattern>/dummy</url-pattern>
    <dispatcher>FORWARD</dispatcher>
    <dispatcher>INCLUDE</dispatcher>
    <dispatcher>REQUEST</dispatcher>
  </filter-mapping>

Rest Web 服务类

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.PathParam;
import javax.ws.rs.Produces;
import javax.ws.rs.core.Context;
@Path("/service")
public class Service {
@Path("/val/{token}")   
@GET
@Produces("application/xml")

public String setToken(@Context HttpServletRequest request, @Context HttpServletResponse response, @PathParam("token") String token) throws ServletException, IOException {
    String value=token;
    if(request==null){
        System.out.println("Request null");
    }
    System.out.println("Token: " + value);
    if(request!=null){
        request.setAttribute("param", value);
        request.getRequestDispatcher("/dummy").include(request, response);
    }
    return "<token>"+ "<value>"+value+" token value"+"</value>" + "</token>";
}
}

过滤器类

public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
        HttpServletRequest httpRequest=(HttpServletRequest)request;
    System.out.println("********Filter**********");
    HttpServletResponse httpResponse=(HttpServletResponse)response;
    if(request.getAttribute("param")!=null){
        String token=request.getAttribute("param").toString();

        System.out.println("Filter httpRequest: " + token);

        Wrapper requestWrapper = new Wrapper(httpRequest);
        requestWrapper.addHeader("Authorization", token);

        chain.doFilter(requestWrapper, response);

    }
}

Servlet 类

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    ServletContext ctx=getServletContext();  
    System.out.println("Inside Dummy Servlet");

    System.out.println(request.getAttribute("param").toString());

    System.out.println("Request Header: "+response.getHeader("Authorization").toString());
}

现在可以通过在 web.xml 中添加以下代码进行过滤来点击过滤器。

 <filter-mapping>
<filter-name>HeaderFilter</filter-name>
<url-pattern>/dummy</url-pattern>
<dispatcher>FORWARD</dispatcher>
<dispatcher>INCLUDE</dispatcher>
<dispatcher>REQUEST</dispatcher>

但是在Filter for Authorization中设置的值在servlet中调用时为null。我需要在HeaderFilter 的授权标头中设置令牌。我坚持这样做。

【问题讨论】:

  • ServletContext 相同。使用@Context

标签: java web-services rest servlets


【解决方案1】:

您正在使用 jax-rs,需要使用 @Context 注释制作一个控制器:

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.ws.rs.GET;
import javax.ws.rs.Path;
import javax.ws.rs.core.Context;


@Path("helloword")
public class SampleControler {

    @GET
    public String doGetAsHtml(@Context HttpServletRequest req, @Context HttpServletResponse response) {
        req.setAttribute("my attr", "my object");
        .....
        return ...;
    }
}

应该可以的。

【讨论】:

  • 感谢您的回复。我实际上是 RESTful Web 服务的新手。如何在我的 Web 服务方法中使用这个 SampleControler 类。你能给我举个例子吗?
  • 看看这个页面,它是一个很好的起点:mkyong.com/webservices/jax-rs/jax-rs-path-uri-matching-example 事实上,JAX_RS 规范定义了 uri映射路径是您服务器的 url (hhtp:IIhost:port/contextApp) + 由路径注释给出的路径。在我给出的示例中,您可以在本地调用 localhost:8080/appContext/helloword
  • 我试过这个并且能够得到HttpServletRequestHttpServletResponse。我正在访问我的 servlet SampleServlet,在此之前 HeaderFilter 被写入。 [链接]localhost:8080/XXXX/YYYY/service/val/VALUE_TO_BE_PASSED 是访问 REST Web 服务的 URL。问题是我的过滤器在我的 servlet 之前没有被命中。我做错什么了吗???
  • 真的,我不知道!我需要查看您的代码源才能给您答案。请编辑您的问题,复制粘贴您的源代码,并正确缩进以了解网站要求。
猜你喜欢
  • 2011-08-28
  • 2011-08-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-11-06
  • 2014-03-14
相关资源
最近更新 更多