如何从REST风格的Web服务方法调用servlet?

问题描述:

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

现在我想从REST风格的Web服务方法中选择过滤器和servlet。我能够以下面的方式获得ServletContext。

@Context private ServletContext servletContext;

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

请提出解决方案。

在此先感谢。

编辑

我需要设置令牌认证头。以下是代码。 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> 

但它在过滤器设置授权VALU中的servlet调用时为空。我需要在授权标题中设置令牌HeaderFilter。我坚持这样做。

+0

与'ServletContext'一样。使用'@ Context'。 –

你正在使用JAX-RS,并需要作出与CONTROLER注释@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 ...; 
    } 
} 

这应该工作。

+0

感谢您的回复。我对RESTful Web服务实际上是新手。如何在我的Web服务方法中使用这个'SampleControler'类。你能告诉我一个例子吗? – Kaushi

+0

看看这个页面是一个不错的出发点:mkyong.com/webservices/jax-rs/jax-rs-path-uri-matching-example事实上,JAX_RS规范定义了uri映射路径是您的url服务器(hhtp:IIhost:port/contextApp)+路径注释给出的路径。在例子中,我给你可以在本地调用localhost:8080/appContext/helloword –

+0

@Sotirios谢谢你纠正我的文章。 –