Spring Boot Security: java.lang.StackOverflowError - PullRequest
2 голосов
/ 17 октября 2019

Я создал пустой проект, добавил один контроллер с одним методом, чтобы напечатать привет. URL-адрес: http://localhost:8080/hello/abc

package com.test.security.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;

@Controller
public class HelloController {
    @GetMapping("/hello/{name}")
    public String sayHello(@PathVariable("name") String name){
        return "Hello " + name;
    }
}

Я добавил следующую зависимость и вижу форму входа.

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.2.0.RELEASE</version>
        <relativePath/> <!-- lookup parent from repository -->
    </parent>
    ...
    ...
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-security</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-devtools</artifactId>
            <scope>runtime</scope>
            <optional>true</optional>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.security</groupId>
            <artifactId>spring-security-test</artifactId>
            <scope>test</scope>
        </dependency>
    </dependencies>

Я ввел имя пользователя / пароль как пользователь / что-либо напечатано в консоли Примерно так же, как пароль: 3f6d06f6-2936-4c88-aaee-c8f125e91663

Пользователь аутентифицирован и на следующемНа странице я вижу трассировку большого стека. Примерно так:

java.lang.StackOverflowError
    at org.apache.catalina.connector.Request.doGetSession(Request.java:2953)
    at org.apache.catalina.connector.Request.getSession(Request.java:2432)
    at org.apache.catalina.connector.RequestFacade.getSession(RequestFacade.java:908)
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:241)
    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:582)
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:241)
    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:582)
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:241)
    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:582)
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:241)
    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:582)
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:241)
    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:582)
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:241)
    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:582)
...
...

Я могу отредактировать это, чтобы при необходимости обеспечить полную трассировку стека, но я не нашел ничего особенного. Я попытался найти несколько сообщений по этому вопросу, но для них это произошло с их пользовательской конфигурацией.

В данный момент я не добавил конфигурацию.

Что здесь не так?

Редактировать

Эти две строки повторяются в трассировке стека

    at org.apache.catalina.core.ApplicationHttpRequest.getSession(ApplicationHttpRequest.java:582)
    at javax.servlet.http.HttpServletRequestWrapper.getSession(HttpServletRequestWrapper.java:241)

1 Ответ

4 голосов
/ 17 октября 2019

Если вы хотите отправить строковый ответ из метода контроллера, вы используете

@GetMapping("/hello/{name}")
public @ResponseBody String sayHello(@PathVariable("name") String name)
{
    return "Hello " + name;
}

Или

@GetMapping("/hello/{name}")
@ResponseBody
public String sayHello(@PathVariable("name") String name)
{
    return "Hello " + name;
}

Или используйте @RestController для вашего класса контроллера вместо @Controller

Так почему же ошибка переполнения стека

Из документа
контроллер обычно возвращает логическое имя представления

Таким образом, возвращаемая строка используется для создания URL, а новый запрос создается с новым путем запроса. Здесь новый запрос снова будет иметь тот же базовый путь, и снова он достигнет того же метода, и снова он повторяет тот же метод, повторяя бесконечно, что приводит к ошибке переполнения стека.

Просто взгляните на код и журналы отладки, которые дают вамясная идея, и это само объяснено

@GetMapping("/hello/{name}")
public String sayHello(@PathVariable("name") String name, HttpServletRequest request)
{
    System.out.println("-----------------------------------------");
    System.out.println("Request URL: "+request.getRequestURL());
    System.out.println("name: "+name);
    return "Hello " + name;
}

и журналы идут здесь

-----------------------------------------
Request URL: http://localhost:8080/jwt/hello/praveen
name: praveen
-----------------------------------------
Request URL: http://localhost:8080/jwt/hello/Hello praveen
name: Hello praveen
-----------------------------------------
Request URL: http://localhost:8080/jwt/hello/Hello Hello praveen
name: Hello Hello praveen
-----------------------------------------
Request URL: http://localhost:8080/jwt/hello/Hello Hello Hello praveen
name: Hello Hello Hello praveen
-----------------------------------------
Request URL: http://localhost:8080/jwt/hello/Hello Hello Hello Hello praveen
name: Hello Hello Hello Hello praveen
-----------------------------------------
Request URL: http://localhost:8080/jwt/hello/Hello Hello Hello Hello Hello praveen
name: Hello Hello Hello Hello Hello praveen
-----------------------------------------
Request URL: http://localhost:8080/jwt/hello/Hello Hello Hello Hello Hello Hello praveen
name: Hello Hello Hello Hello Hello Hello praveen
-----------------------------------------
Request URL: http://localhost:8080/jwt/hello/Hello Hello Hello Hello Hello Hello Hello praveen
name: Hello Hello Hello Hello Hello Hello Hello praveen
-----------------------------------------
Request URL: http://localhost:8080/jwt/hello/Hello Hello Hello Hello Hello Hello Hello Hello praveen
name: Hello Hello Hello Hello Hello Hello Hello Hello praveen
-----------------------------------------
Request URL: http://localhost:8080/jwt/hello/Hello Hello Hello Hello Hello Hello Hello Hello Hello praveen
name: Hello Hello Hello Hello Hello Hello Hello Hello Hello praveen
-----------------------------------------
Request URL: http://localhost:8080/jwt/hello/Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello praveen
name: Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello praveen
-----------------------------------------
Request URL: http://localhost:8080/jwt/hello/Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello praveen
name: Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello praveen
-----------------------------------------
Request URL: http://localhost:8080/jwt/hello/Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello praveen
name: Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello Hello praveen
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...