我是Web服务的新手,并且已经对它进行了大量的研究,但我目前无法捕获我需要用于身份验证的请求标头。
这是一个场景:我在我的JAX-RS RESTful Web服务上调用了一个login()方法,在将一个用户名/密码组合添加到请求标头之后。然后,Web服务(在JBoss AS 7.1上运行)应该捕获这些头文件。
问题是每次调用此login()方法时,请求似乎尚未得到服务,因此在执行WebServiceContext.getMessageContext()时会导致IllegalStateException。
我已经尝试将@PostConstruct注释添加到方法的标题中,但无济于事。当我这样做时,该方法似乎根本没有初始化。相反,我在调用它时会遇到ClassNotFoundException。
我如何解决这个问题?我已经坚持了几天,并在客户端和Web服务上尝试了多种不同的方法来捕获这些标题,但它们要么不适用于项目的体系结构,要么根本不能按预期工作。
这是服务的界面:
@ApplicationPath("/apppath")
@Path("/wspath")
public interface LoginService {
@GET
@Path("/login")
@Produces(MediaType.APPLICATION_JSON)
public String login();
}
这是服务的实现:
@Stateless
@Local(LoginService.class)
public class LoginServiceImpl implements LoginService {
@Resource
WebServiceContext wsContext;
@Override
public String login() {
// This line throws an IllegalStateException.
MessageContext msgContext = wsContext.getMessageContext();
// TODO: Capture authentication data from headers.
@SuppressWarnings("unchecked")
Map<String, List<String>> headers = (Map<String, List<String>>) msgContext.get(MessageContext.HTTP_REQUEST_HEADERS);
// Dummy return for testing purposes.
return "It works" + headers.toString();
}
}
这是一个简单的JUnit测试代码,我正在尝试解决客户端的问题。
public class LoginServiceTest {
@Test
public void test() {
String mEmail = "a@a.com";
String mPassword = "aaaa";
HttpGet request = new HttpGet("http://localhost:8080/apppath/wspath/login");
String auth = Base64.encodeBytes((mEmail + ":" + mPassword).getBytes());
request.addHeader("Authorization", "Basic " + auth);
HttpClient httpClient = new DefaultHttpClient();
try {
InputStream inputStream = httpClient.execute(request).getEntity().getContent();
BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(inputStream));
String wsReturn;
while ((wsReturn = bufferedReader.readLine()) != null) {
System.out.println(wsReturn);
}
} catch (IllegalStateException e) {
e.printStackTrace();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
}
答案 0 :(得分:0)
这不是在JAX-RS服务中访问服务上下文的正确方法,WebServiceContext
类被注入到JAX-WS Web服务中。在JAX-RS服务类中,您可以使用@Context
注释来注入HttpServletRequest
请求对象并向其询问标头。
例如:
@GET
@Path("/login")
@Produces(MediaType.APPLICATION_JSON)
public String login(@Context HttpServletRequest request);
您可以查看此link以获取有关JAX-RS的更多信息,或浏览Java EE 6 Tutorial。