==
тесты для ссылочного равенства (независимо от того, являются ли они одним и тем же объектом).
.equals()
тесты для равенства значений (независимо от того, являются ли они логически «равными»).
Objects.equals () проверяет наличие null
перед вызовом .equals()
, поэтому вам не нужно (доступно с JDK7, также доступным в Guava ).
String.contentEquals () сравнивает содержимое String
с содержимым любого CharSequence
(доступно с Java 1.5).
Следовательно, если вы хотите проверить, имеет ли две строки одно и то же значение, вы, вероятно, захотите использовать Objects.equals()
.
// These two have the same value
new String("test").equals("test") // --> true
// ... but they are not the same object
new String("test") == "test" // --> false
// ... neither are these
new String("test") == new String("test") // --> false
// ... but these are because literals are interned by
// the compiler and thus refer to the same object
"test" == "test" // --> true
// ... string literals are concatenated by the compiler
// and the results are interned.
"test" == "te" + "st" // --> true
// ... but you should really just call Objects.equals()
Objects.equals("test", new String("test")) // --> true
Objects.equals(null, "test") // --> false
Objects.equals(null, null) // --> true
Вы почти всегда хотите использовать Objects.equals()
. В редкой ситуации, когда вы знаете, что имеете дело с интернированными строками, вы можете использовать ==
.
Из JLS 3.10. 5. Строковые литералы :
Кроме того, строковый литерал всегда ссылается на тот же экземпляр класса
String
. Это связано с тем, что строковые литералы, или, в более общем смысле, строки, которые являются значениями константных выражений ( §15.28 ), «интернированы», чтобы обмениваться уникальными экземплярами, используя методString.intern
.. Подобные примеры также можно найти в JLS 3.10.5-1 .
У вас есть пара опций, самым простым из которых будет использование подписанных URL-адресов , чтобы позволить resend
принять параметр пользователя id
, тогда когда пользователь входит в систему и Убедитесь, что вы перенаправили их на страницу resend
с их id
для идентификации их учетной записи без активного сеанса пользователя.
Например, ваш контроллер входа будет выглядеть примерно так:
if (! $user->hasVerifiedEmail()()) {
return redirect()->to(URL::signedRoute('resend', ['id' => $user->id]));
}
И ваш метод VerificationController@resend
будет выглядеть примерно так:
public function resend(Request $request)
{
if ($request->input('id') && $request->hasValidSignature()) {
$user = User::findOrFail($request->input('id'));
}
$user = $user ?: $request->user();
if ($user->hasVerifiedEmail()) {
return redirect($this->redirectPath());
}
$user->sendEmailVerificationNotification();
return back()->with('resent', true);
}
Тем не менее, Laravel включает в себя промежуточное ПО для запроса проверки электронной почты: оно разрешает вход в систему, но не позволяет пользователю ничего делать, пока они не подтвердят, поэтому, если у вас нет причин полностью запретить вход, промежуточное ПО удовлетворяет ваши потребности. Вы можете найти информацию о промежуточном программном обеспечении здесь .