Обзор
После успешного входа вы будете перенаправлены на главную страницу.
На главной странице есть кнопка с надписью «Кнопка проверки». При нажатии предполагается вызов API, который загружает «тестовую» страницу.
Однако выполняется только запрос API, а страница не меняется.
Инструменты разработчика отображают только HTML-код этой страницы.
index.html
<script>
$(document).ready(function() {
// Logout button event
$('#logoutButton').click(function() {
// Remove token from local storage
localStorage.removeItem('accessToken');
// Redirect to login page
window.location.href = '/login';
});
// Test button event
$('#testButton').click(function() {
// Retrieve token from local storage
const token = localStorage.getItem('accessToken');
if (token) {
$.ajax({
url: '/api/test', // URL of the server to request
type: 'GET', // HTTP method
beforeSend: function(xhr) {
// Add token to request header
xhr.setRequestHeader('Authorization', token);
},
success: function(data) {
// Logic on request success
console.info("Test request successful:", data);
alert("Test request successful");
},
error: function(xhr, status, error) {
// Logic on request failure
console.error("Test request failed:", xhr.responseText);
alert("Test request failed");
}
});
} else {
alert("Token not found. Please login again.");
}
});
});
Как показано, токен извлекается из локального хранилища и впоследствии повторно присоединяется к заголовку запроса для передачи.
JwtAuthorizationFilter
@Override
protected void doFilterInternal(HttpServletRequest req, HttpServletResponse res, FilterChain filterChain) throws ServletException, IOException {
// Extract token from header
log.info("Extracting token from header");
String tokenValue = jwtUtil.getJwtFromHeader(req);
log.info("Token: " + tokenValue);
if (StringUtils.hasText(tokenValue)) {
// Token validation
if (!jwtUtil.validateToken(tokenValue)) {
log.info("Token Error");
return;
}
Claims info = jwtUtil.getUserInfoFromToken(tokenValue);
try {
setAuthentication(info.getSubject());
} catch (Exception e) {
log.error(e.getMessage());
return;
}
}
else {
log.info("No token present.");
}
filterChain.doFilter(req, res);
}
// Process authentication
public void setAuthentication(String loginId) {
log.info("Authentication successful");
SecurityContext context = SecurityContextHolder.createEmptyContext();
Authentication authentication = createAuthentication(loginId);
context.setAuthentication(authentication);
SecurityContextHolder.setContext(context);
}
// Create authentication object
private Authentication createAuthentication(String loginId) {
log.info("Creating authentication object");
UserDetails userDetails = userDetailsService.loadUserByUsername(loginId);
return new UsernamePasswordAuthenticationToken(userDetails, null, userDetails.getAuthorities());
}
Когда JwtAuthorizationFilter установлен, в журналах отображается весь процесс извлечения токена из заголовка, и я подтвердил, что объект аутентификации также успешно создан.
Консоль
2024-02-26T15:01:04.238+09:00 INFO 60005 --- [nio-8081-exec-1] JWT Verification and Authorization : Token: eyJhbGciOiJIUzI1NiJ9.eyJzdWIiOiJ0ZXN0NiIsImF1dGgiOiJPV05FUiIsImlhdCI6MTcwODkyNDY0NiwiZXhwIjoxNzA4OTI4MjQ2fQ.TLjHCc1_ZtTbzGb-2c0ueLmxgCyxQf1rUQs4DkqMv_c
2024-02-26T15:01:04.259+09:00 INFO 60005 --- [nio-8081-exec-1] JWT Verification and Authorization : Authentication successful
2024-02-26T15:01:04.259+09:00 INFO 60005 --- [nio-8081-exec-1] JWT Verification and Authorization : Creating authentication object
Hibernate:
/* <criteria> */ select
u1_0.id,
u1_0.email,
u1_0.login_id,
u1_0.password,
u1_0.role
from
users u1_0
where
u1_0.login_id=?
2024-02-26T15:01:04.330+09:00 INFO 60005 --- [nio-8081-exec-1] TestController : test controller
Из журналов я смог подтвердить, что вызывается тестовый контроллер. Однако страница не загружается, а в сообщении отображается только HTML-код.
Сообщение об инструментах разработчика введите сюда описание изображения
Тест.html
> <!DOCTYPE html> <html lang = "en"> <head>
> <meta charset = "UTF-8">
> <script src = "https://code.jquery.com/jquery-3.7.0.min.js"
> integrity = "sha256-2Pmvv0kuTBOenSvLm6bvfBSSHrUJ+3A7x6P5Ebd07/g = "
> crossorigin = "anonymous"></script>
> <title>Test Page</title> </head> <body> <h1>This is a test page.</h1> </body> </html>
Краткое содержание
Что мне может не хватать? 😭😭😭 Я ломаю над этим голову уже несколько дней,,, пожалуйста, помогите мне,,,



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Чтобы ответить на ваш вопрос, вам необходимо понять разницу между запросом AJAX и обычным запросом:
Насколько я знаю, единственный способ заставить браузер обрабатывать запрос как обычный запрос — отправить его через HTML-форму. Но в вашем случае я вижу, что вам нужно использовать $.ajax() для добавления токена в заголовок «Авторизация», тогда вам придется отобразить ответ самостоятельно.
Вы используете JavaScript, поэтому вам необходимо заменить содержимое самостоятельно.