У меня есть веб-сервиса, как в следующем упрощенном примере, развернутого на JBoss EAP 6 (JBoss AS 7):Как вернуть правильный код состояния HTTP из проверки программной авторизации в JAX-WS Webservice?
@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. Если вызывающий абонент не предоставляет никаких учетных данных, или предоставленный пользователь не имеет «basic_role», сервер возвращает 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 пытается вернуть 500 с RuntimeException, только это невозможно, потому что ответ уже завершен. Это не похоже на чистый способ сделать это.