Как исправить проблему, из-за которой страница не загружается при нажатии кнопки

Обзор

После успешного входа вы будете перенаправлены на главную страницу.

На главной странице есть кнопка с надписью «Кнопка проверки». При нажатии предполагается вызов 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>

Краткое содержание

  1. После успешного входа вы будете перенаправлены на главную страницу.
  2. Цель этой индексной страницы — перейти на тестовую страницу.
  3. Я подтвердил, что фильтр авторизации обрабатывает запрос и значение токена передается.
  4. Запрос достигает тестового контроллера, но реальная страница не загружается.

Что мне может не хватать? 😭😭😭 Я ломаю над этим голову уже несколько дней,,, пожалуйста, помогите мне,,,

Вы используете JavaScript, поэтому вам необходимо заменить содержимое самостоятельно.

M. Deinum 26.02.2024 09:47
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
1
58
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Чтобы ответить на ваш вопрос, вам необходимо понять разницу между запросом AJAX и обычным запросом:

  • При обычном запросе браузер выполнит запрос и загрузит ответ на экран. Это то, чего вы желаете.
  • Однако здесь вы отправляете запрос AJAX, используя метод $.ajax(). С AJAX-запрос, браузер позволит вам самостоятельно обработать ответ.

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

Другие вопросы по теме