Я не уверен, но, я думаю, вы можете использовать @ResponseEntity
и @ResponseBody
и отправить 2 разных: Успех, а второй - сообщение об ошибке, например:
@RequestMapping(value ="/book2", produces =MediaType.APPLICATION_JSON_VALUE )
@ResponseBody
Book bookInfo2() {
Book book = new Book();
book.setBookName("Ramcharitmanas");
book.setWriter("TulasiDas");
return book;
}
@RequestMapping(value ="/book3", produces =MediaType.APPLICATION_JSON_VALUE )
public ResponseEntity bookInfo3() {
Book book = new Book();
book.setBookName("Ramayan");
book.setWriter("Valmiki");
return ResponseEntity.accepted().body(book);
}
Вы расширяете класс Authenticator и регистрируете его. Документация javadoc по ссылке объясняет, как.
Я не знаю, работает ли это с методом nio, который получил принятый ответ на вопрос, но он наверняка работает для старомодного способа, который был ответом под этим.
В реализации класса аутентификатора вы, вероятно, собираетесь использовать PasswordAuthentication и переопределить метод getPasswordAuthentication () вашей реализации Authenticator, чтобы вернуть его. Это будет класс, которому передаются нужные вам имя пользователя и пароль.
По вашему запросу, вот некоторый образец кода:
public static final String USERNAME_KEY = "username";
public static final String PASSWORD_KEY = "password";
private final PasswordAuthentication authentication;
public MyAuthenticator(Properties properties) {
String userName = properties.getProperty(USERNAME_KEY);
String password = properties.getProperty(PASSWORD_KEY);
if (userName == null || password == null) {
authentication = null;
} else {
authentication = new PasswordAuthentication(userName, password.toCharArray());
}
}
protected PasswordAuthentication getPasswordAuthentication() {
return authentication;
}
И вы регистрируете его в основном методе (или где-нибудь в строке, прежде чем вызывать метод URL):
Authenticator.setDefault(new MyAuthenticator(properties));
Использование простое, но я нахожу API запутанным и отчасти обратным в том, как вы обычно думаете об этих вещах. Довольно типично для синглтон-дизайна.
Вы пытались создать свой URL-адрес в форме http: // user: password @ domain / path ?
Я бы предложил проверить HttpClient из apache http: / /hc.apache.org/httpclient-3.x/ это упрощает загрузку / аутентификацию
Это код, который я написал, который выбирает веб-сайт и отображает его содержимое в System.out. Он использует обычную аутентификацию:
import java.net.*;
import java.io.*;
public class foo {
public static void main(String[] args) throws Exception {
URL yahoo = new URL("http://www.MY_URL.com");
String passwdstring = "USERNAME:PASSWORD";
String encoding = new
sun.misc.BASE64Encoder().encode(passwdstring.getBytes());
URLConnection uc = yahoo.openConnection();
uc.setRequestProperty("Authorization", "Basic " + encoding);
InputStream content = (InputStream)uc.getInputStream();
BufferedReader in =
new BufferedReader (new InputStreamReader (content));
String line;
while ((line = in.readLine()) != null) {
System.out.println (line);
}
in.close();
}
Проблемы с приведенным выше кодом:
Этот код не готов к производству (но он дает понять суть).
Код дает следующее предупреждение компилятора:
foo.java:11: warning: sun.misc.BASE64Encoder is Sun proprietary API and may be removed in a future release sun.misc.BASE64Encoder().encode(passwdstring.getBytes()); ^ 1 warning
Это действительно нужно использовать класс Authenticator, но, хоть убей, я не мог понять, как, и я не мог найти никаких примеров, что просто показывает, что людям Java на самом деле не нравится, когда вы используете их язык для выполнения крутые вещи. :-P
Таким образом, приведенное выше не является хорошим решением, но оно действительно работает и может быть легко изменено позже.
В этой библиотеке с открытым исходным кодом, http://spnego.sourceforge.net также есть несколько примеров того, как использовать ее класс SpnegoHttpURLConnection.
Один из конструкторов в классе позволяет передавать имя пользователя и пароль.
Взгляните на java-документацию класса для примеров.