[英]How to retrieve ServletRequest using Jersey and Java EE 5
我正在創建一個安全庫,該庫將由多個RESTful客戶端使用。 我正在使用Java EE 5,Jersey 1.17和Maven。 客戶將使用我的圖書館使用令牌來調用第三方應用程序。 然后,第三方應用程序將返回其在該令牌上擁有的所有信息,例如到期,范圍和用戶ID。 我的想法是制作一個過濾器,該過濾器將檢查是否存在“授權”標頭,如果是,它將調用第三方應用程序。 如果第三方應用程序驗證了令牌並返回了令牌的信息,那么我需要將該信息(存儲在TokenInformation對象中)返回到資源中。 在上一篇文章中,有人說我可以這樣做:
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
執行以下操作:
<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
類具有以下內容:
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
類具有以下功能:
@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;
}
}
您不必在Dao層訪問ServletRequest。 在Servlet中,您可以獲取ServletRequest對象,並將該值傳遞到Dao層。 如果您確實要訪問,則通過引用將ServletRequest對象傳遞給Dao層。
<servlet-name>Security API</servlet-name>
<servlet-class>com.packagename.MyServlet</servlet-class>
public MyServlet extends com.sun.jersey.spi.container.servlet.ServletContainer{}
您可以擴展jersey Servlet,也可以通過應用程序類通過應用程序初始化Servlet。
在MyServlet中,您可以到達請求對象。
Servlet信息: https : //jersey.java.net/apidocs/1.17/jersey/com/sun/jersey/spi/container/servlet/ServletContainer.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.