Вики , о которых вы упомянули , также содержат некоторую информацию об этом сценарии с несколькими доменами. По сути, вам нужно захватить предпочтительное имя пользователя и отправить его вместе с запросом на вход. Чтобы получить имя пользователя для всех приложений одновременно, я бы предложил сохранить его в файле cookie всего домена, который известен всем приложениям.
// Store the username after login
document.cookie = "msal_username=Paul@xyz-corp.com;domain=.xyz-corp.com;path=/"
// use the username
var username = getCookieByName("msal_username"); // find some code to do that
userAgentApplication.loginRedirect(scopes, "&login_hint=" + username);
Недостатком этого является то, что вам необходимо реализовать это в во всех ваших приложениях.
Приложения в другом домене
Когда приложения размещены в разных доменах, MSAL.js не может получить доступ к токенам, кэшированным в домене A, в домене B.
Автоматически выбирать учетную запись в Azure AD
...
Использование подсказки для входа в систему
Если у вас нет настроенного утверждения SID или вам необходимо пропустить запрос на выбор учетной записи при интерактивных вызовах аутентификации, вы можете сделать это, указав login_hint и, при необходимости, domain_hint как extraQueryParameters в интерактивных методах MSAL.js (loginPopup, loginRedirect, acquTokenPopup и acquTokenRedirect). Например:
userAgentApplication.loginRedirect(scopes, "&login_hint=
&domain_hint=organizations"); Вы можете получить значения для login_hint и domain_hint, прочитав утверждения, возвращенные в токене ID для пользователя.
Для логина логина должно быть указано утверждение предпочитаемого имени пользователя в маркере идентификатора.
BLOCKQUOTE>
А, и вот я только что начал писать
System.out.println(-2147483648);
System.out.println(-2147483647);
System.out.println(-2147483646);
Ладно, дайте мне несколько недель, чтобы закончить набирать это ...
В инструкциях не говорилось, что я должен используйте цикл, и, по крайней мере, этот метод не имеет проблем с переполнением.
Учитывая обзор лучших ответов, я понял, что у нас серьезно не хватает в отделе грубой силы. Ответ Джея хорош, но на самом деле это не сработает. От имени Science я представляю - Bozo Range:
import java.util.Random;
import java.util.HashSet;
class Test {
public static void main(String[] args) {
Random rand = new Random();
HashSet<Integer> found = new HashSet<Integer>();
long range = Math.abs(Integer.MAX_VALUE - (long) Integer.MIN_VALUE);
while (found.size() < range) {
int n = rand.nextInt();
if (!found.contains(n)) {
found.add(n);
System.out.println(n);
}
}
}
}
Обратите внимание, что вам нужно выделить как минимум 4 ГБ ОЗУ для запуска этой программы. (Возможно, 8 ГБ, если вы работаете на 64-битной машине, что вам, вероятно, потребуется для запуска этой программы ...). Этот анализ не учитывает раздувание, которое класс Integer добавляет к какому-либо данному int, ни размер самого HashSet.
Простейшая форма (минимальный код):
for (long i = Integer.MIN_VALUE; i <= Integer.MAX_VALUE; i++) {
System.out.println(i);
}
Без целочисленного переполнения, без дополнительных проверок (только немного больше использования памяти, но у кого нет 32 запасных бита).
Хотя я полагаю, что в
for (long i = Integer.MIN_VALUE; i <= Integer.MAX_VALUE; i++)
System.out.println(i);
меньше символов, я не могу сказать, что он проще . Короче не обязательно проще, но в нем меньше кода.
I just have to add an answer...
public class PrintInts {
public static void main(String[] args) {
int i = Integer.MIN_VALUE;
do {
System.out.println(i);
++i;
} while (i != Integer.MIN_VALUE);
}
}
Когда я впервые посмотрел на это, первым моим вопросом было: «Как определить наименьшее и наибольшее». Для того, что я считал наиболее очевидным определением («наименьший» == «ближайший к 0»), ответ будет
for (int i = 0; i >= 0; i++) {
System.out.println(i);
System.out.println(-i-1);
}
Но все остальные, кажется, читают «наименьший» как «минимум» и «наибольший» как «максимум»
Пакет fj взят из здесь .
import static fj.pre.Show.intShow;
import static fj.pre.Show.unlineShow;
import static fj.data.Stream.range;
import static java.lang.Integer.MIN_VALUE;
import static java.lang.Integer.MAX_VALUE;
public class ShowInts
{public static void main(final String[] args)
{unlineShow(intShow).println(range(MIN_VALUE, MAX_VALUE + 1L));}}
При скорости 1000 строк в секунду вы сделаете примерно за 7 недель. Может, нам сейчас кофе?
Просто немного улучшив подход StringBuilder
:
2 потока + 2 буфера (например, StringBuilder
): Основная идея заключается в том, что один поток заполняет один буфер, в то время как другой поток выгружает содержимое другого буфера.
Очевидно, что поток «дампера» всегда будет работать медленнее, чем поток «заполнитель».
class Test {
public static void main(String[] args) {
for (int a = Integer.MIN_VALUE; a < Integer.MAX_VALUE; a++) {
System.out.println(a);
}
System.out.println(Integer.MAX_VALUE);
}
}
Меня наняли?
Да ладно, ребята, он сказал, что с использованием java. Он не сказал использовать int в цикле for. : -)
public class Silly {
public static void main(String[] args) {
for (long x = Integer.MIN_VALUE; x <= Integer.MAX_VALUE; x++) {
System.out.println(x);
}
}
}
Есть что-то сложное, чего я не улавливаю? Вероятно, есть ... ( edit: да, есть!)
class AllInts {
public static void main(String[] args) {
// wrong -- i <= Integer.MAX_VALUE will never be false, since
// incrementing Integer.MAX_VALUE overflows to Integer.MIN_VALUE.
for (int i = Integer.MIN_VALUE; i <= Integer.MAX_VALUE; i++) {
System.out.println(i);
}
}
}
Поскольку печать является узким местом, буфер значительно повысил бы скорость (я знаю, потому что только что попробовал):
class AllInts {
public static void main(String[] args) {
// a rather large cache; I did no calculations to optimize the cache
// size, but adding the first group of numbers will make the buffer
// as large as it will ever need to be.
StringBuilder buffer = new StringBuilder(10000000);
int counter = 0;
// note that termination check is now <
// this means Integer.MAX_VALUE won't be printed in the loop
for (int i = Integer.MIN_VALUE; i < Integer.MAX_VALUE; i++) {
buffer.append(i).append('\n');
if (++counter > 5000000) {
System.out.print(buffer);
buffer.delete(0, buffer.length()-1);
counter = 0;
}
}
// take care of the last value (also means we don't have to check
// if the buffer is empty before printing it)
buffer.append(Integer.MAX_VALUE);
System.out.println(buffer);
}
}
Кроме того, эта версия фактически прекратит работу (спасибо Дэниелу Лью за указание на то, что на самом деле была кое-что сложное, чего я не заметил).
Общее время выполнения этой версии (запускается с -Xmx512m ) было 1:53. Это более 600000 номеров в секунду; совсем неплохо! Но я подозреваю, что это было бы медленнее, если бы я не запустил его в свернутом виде.
Another way to loop through every value using an int type.
public static void main(String[] args) {
int i = Integer.MIN_VALUE;
do {
System.out.println(i);
} while (i++ < Integer.MAX_VALUE);
}
Максимальное значение для int
- Integer.MAX_VALUE
, а минимальное - Integer.MIN_VALUE
. Используйте цикл, чтобы распечатать их все.