我在jboss eap 6(jboss as 7)上部署了一个类似以下简化示例的Web服务:
@Stateless
@RolesAllowed("basic_role")
@WebService(name = "MyWebService", serviceName = "MyWebService")
@WebContext(contextRoot = "api", urlPattern = "/MyWebService", authMethod = "BASIC")
public class MyWebService {
@Resource
private WebServiceContext webServiceContext;
@WebMethod
public void doSomething(String parameter) {
System.out.println(webServiceContext.getUserPrincipal());
if (!webServiceContext.isUserInRole("role_for_parameter_" + parameter)) {
throw new HTTPException(401);
}
}
}
我想根据传入的参数进行权限检查,但不知道如何正确返回401状态码。如果调用者没有提供任何凭证,或者提供的用户没有“基本\角色”,则服务器将按预期返回401。但是一旦我的代码被调用,如果我抛出任何类型的异常,就会返回一个状态码500。我以为这就是httpexception的用途,但是如果我使用httpexception、runtimeexception或者我尝试过的任何其他异常,这都没有区别。
我唯一能想到的办法是:
@WebMethod
public void doSomething(String parameter) {
System.out.println(webServiceContext.getUserPrincipal());
if (!webServiceContext.isUserInRole("role_for_parameter_" + parameter)) {
HttpServletResponse response = (HttpServletResponse)webServiceContext.getMessageContext().get(MessageContext.SERVLET_RESPONSE);
try {
response.sendError(401, "Not authorized");
throw new RuntimeException("Not authorized");
}
catch (IOException e) {
throw propagate(e);
}
}
}
通过这种方式,401状态代码被返回,但是我也需要抛出异常以防止进一步的处理,而且从日志来看,jax-ws试图返回一个带有runtimeexception的500,但是它不能,因为响应已经提交了。这似乎不是一个干净的方法。
1条答案
按热度按时间ar7v8xwq1#
不确定这是不是最好的方法,但对我来说很有效: