Ich habe einen Webservice, wie die folgenden vereinfachten Beispiel bereitgestellt auf JBoss EAP 6 (JBoss AS 7):Wie wird der korrekte HTTP-Statuscode aus der programmatischen Berechtigungsprüfung im JAX-WS Webservice zurückgegeben?
@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);
}
}
}
Ich möchte eine Berechtigungsprüfung tun, auf der Basis der Parameter übergeben, aber ich weiß nicht, wie man Geben Sie einen 401-Statuscode ordnungsgemäß zurück. Wenn der Aufrufer keine Anmeldeinformationen angibt oder der angegebene Benutzer nicht über die "basic_role" verfügt, gibt der Server 401 wie erwartet zurück. Aber sobald mein Code aufgerufen wird, wenn ich irgendeine Art von Ausnahme ausspreche, wird ein Statuscode 500 zurückgegeben. Ich dachte, das war, wofür die HTTPException war, aber es macht keinen Unterschied, wenn ich HTTPException oder RuntimeException oder irgendeine andere Ausnahme, die ich versuchte, verwende.
Der einzige Weg, ich tun konnte, ist dies:
@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);
}
}
}
diese Weise wird der Statuscode 401 zurückgegeben, aber ich brauche auch die Ausnahme werfen weitere Verarbeitung zu verhindern, und es scheint aus die Protokolle, die JAX-WS versucht, eine 500 mit der RuntimeException zurückzugeben, nur kann es nicht, da die Antwort bereits festgeschrieben ist. Dies scheint kein sauberer Weg zu sein.