2015-09-25 164 views
-1

我寫了一個業務邏輯存在的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'。 –

回答

1

你正在使用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謝謝你糾正我的文章。 –