1

一般来说,我是 Web 服务的新手,并且一直在对其进行大量研究,但我目前无法捕获用于身份验证所需的请求标头。

场景如下:在向请求标头添加用户名/密码组合后,我有一个 Android 客户端在我的 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();
        }
    }
}
4

1 回答 1

0

这不是在 JAX-RS 服务中访问服务上下文的正确方法,WebServiceContext该类被注入到 JAX-WS Web 服务中。在 JAX-RS 服务类中,您可以使用@Context注释来HttpServletRequest注入请求对象并要求它提供标头。例如:

@GET
@Path("/login")
@Produces(MediaType.APPLICATION_JSON)
public String login(@Context HttpServletRequest request);

您可以查看此链接以获取有关 JAX-RS 的更多信息或浏览Java EE 6 教程

于 2013-01-21T08:32:42.783 回答