2014-10-14 6 views
0

여러 RESTful 클라이언트가 사용할 보안 라이브러리를 만드는 중입니다. Java EE 5, Jersey 1.17 및 Maven을 사용하고 있습니다. 클라이언트는 내 라이브러리를 사용하여 토큰을 사용하여 타사 앱을 호출합니다. 그런 다음 타사 앱이 만료, 범위 및 사용자 ID와 같은 해당 토큰에 대한 모든 정보를 반환합니다. 제 아이디어는 Authorization 헤더가 있는지 확인하는 필터를 만드는 것입니다. 그렇다면 타사 앱을 호출합니다. 타사 응용 프로그램에서 토큰의 유효성을 검사하고 토큰 정보를 반환하면 TokenInformation 개체에 저장된 정보를 다시 리소스에 반환해야합니다.Jersey와 Java EE를 사용하여 ServletRequest를 검색하는 방법

public class MyFilter implements Filter{ 

    @Override 
    public void doFilter(final ServletRequest request, 
      final ServletResponse response, 
      final FilterChain chain) throws IOException, ServletException { 
     HttpServletRequest req = (HttpServletRequest) request;   
     String header = req.getHeader("Authorization"); 
     TokenInformation info = new TokenInformation(); 
     info = buildInfo(info); 
     if (true) { 
      request.setAttribute("auth", info); 
      chain.doFilter(request, response); 
     } else { 
      handleError(response); 
     } 
    } 
} 

그래서, 추가 속성과 요청에 TokenInformation 객체를 전송하여, 나는 자원 클래스에 나중에 검색 할 수있을 것입니다 : 이전 포스트에서, 누군가가 내가이 작업을 수행 할 수 있다고 말했다. 문제는 Java EE 5를 사용하고 있으며 @Context 주석을 사용하여 ServletRequest 객체를 삽입 할 수 없다는 것을 인식하지 못했습니다. 리소스 클래스에서 ServletRequest 객체에 다시 액세스하여 어떻게 DAO와 같은 TokenInformation 객체에 액세스 할 수 있습니까?

내가 저지를 사용하고 방법은이 작업을 수행하여 내 web.xml :

@Path("") 
public class Security implements ISecurity{ 


    @Override 
    public Response get(String upId) { 
     String test = ""; 
     try{ 

      TokenInformation tI = (TokenInformation) HttpServletRequestWrapper. 
      test = "test1"; 
     }catch(Exception e){ 
      System.out.println(e.getMessage()); 
     } 
     return null; 
    } 

} 
:

public class SecurityResource extends Application{ 

    public static final String SUPPORTED_REPRESENTATIONS = MediaType.APPLICATION_XML 
      + "," + MediaType.APPLICATION_JSON; 

    @Override 
    public Set<Class<?>> getClasses() { 
     HashSet<Class<?>> set = new HashSet<Class<?>>(); 
     set.add(Security.class);     
     return set; 
    } 

} 

Security 수업이 있습니다

<servlet> 
    <servlet-name>Security API</servlet-name> 
    <servlet-class>com.sun.jersey.spi.container.servlet.ServletContainer</servlet-class> 
    <init-param> 
     <param-name>javax.ws.rs.Application</param-name> 
     <param-value>com.ni.apps.engineering.securitylibrary.resources.SecurityResource</param-value> 
    </init-param> 
    <init-param> 
     <param-name>com.sun.jersey.api.json.POJOMappingFeature</param-name> 
     <param-value>true</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>Security API</servlet-name> 
    <url-pattern>/1/*</url-pattern> 
</servlet-mapping> 

SecurityResource 클래스이있다

답변

1

Dao 레이어에서 ServletRequest에 액세스 할 필요가 없습니다. 서블릿에서 ServletRequest 객체를 가져올 수 있으며 그 값을 Dao 레이어에 전달할 수 있습니다. 정말 액세스하려면 다음 참조에 의해 Dao 계층에 ServletRequest 개체를 전달하십시오.

<servlet-name>Security API</servlet-name> 
<servlet-class>com.packagename.MyServlet</servlet-class> 

public MyServlet extends com.sun.jersey.spi.container.servlet.ServletContainer{} 

저지 서블릿을 확장하고 프로그램 클래스를 사용하여 응용 프로그램 클래스로 서블릿을 초기화 할 수 있습니다.

MyServlet에서 요청 개체에 연결할 수 있습니다.

서블릿 정보 : https://jersey.java.net/apidocs/1.17/jersey/com/sun/jersey/spi/container/servlet/ServletContainer.html

+0

나는 서블릿 자체에 액세스 할 수있는 방법을 잘 모르겠어요, 그래서 당신이 올바른 경로에 날 지점 수 바라고 좀 더 정보를 추가하고있다. – Nacho321

+0

MVC 패턴에서 어느 것을 사용합니까? JSF, Spring MVC, Struts, Servlet –

+0

추가 정보를 추가했습니다. 도움이 되었기를 바랍니다! – Nacho321