当前位置: 首页 > 知识库问答 >
问题:

Spring Boot post请求处理程序未启动

封烈
2023-03-14

谢谢你调查我的问题。

我正在使用Spring Boot和Spring Security进行练习。我已经创建了一个简单的项目,带有基本的注册,但是我无法登录工作。我正在尝试手动将用户登录到一个POST: /login方法中,但是该方法没有启动。当我尝试用POST: /login登录时,它只是将302重定向到GET /login。我非常确定我已经正确地设置了安全配置和方法注释。但是post方法甚至没有运行。(我知道,因为我在帖子方法中有一个打印语句,即使在我启动应用程序并创建用户并登录时,它也不会打印任何内容。)我如何解决这个问题?

(我不确定post方法是否真的会正确登录用户,我只是想让它运行,这样我就可以弄清楚那部分。)

完整代码如下:https://github.com/Skyler827/SpacePong/tree/7530377a634f1a2fe55ce490402d947616439e72
安全配置程序方法:

protected void configure (HttpSecurity http) throws Exception {
    http
        .csrf()
            .ignoringAntMatchers("/h2/**")
            .and()
        .headers()
            .frameOptions().sameOrigin().and()
        .authorizeRequests()
            .antMatchers("/login", "/register", "/h2/**").permitAll()
            .antMatchers(HttpMethod.POST, "/login").permitAll()
            .anyRequest().authenticated()
            .and()
        .formLogin()
            .loginProcessingUrl("/login")
            .loginPage("/login")
            .failureUrl("/login?error=true")
            .successForwardUrl("/")
            .and()
        .logout()
            .logoutUrl("/logout")
            .logoutSuccessUrl("/")
            .permitAll();
}

控制器应该工作,但没有:

@Controller
@RequestMapping("/login")
public class LoginController {
    private final AuthenticationManager authManager;
    private final PlayerService playerService;
    public LoginController(AuthenticationManager authManager, PlayerService playerService) {
        this.authManager = authManager;
        this.playerService = playerService;
    }
    @GetMapping
    public String getLogin(Model model) {
        model.addAttribute("playerdto", new PlayerDto());
        System.out.println("running getLogin()");
        return "login";
    }
    @PostMapping
    public String postLogin(@ModelAttribute("playerdto") PlayerDto playerDto, Model model) {
        System.out.println("running postLogin()");
        Player player = playerService.getPlayerByName(playerDto.getUsername());
        if (player == null) {
            model.addAttribute("error", "invalid login");
            return "login";
        }

        UsernamePasswordAuthenticationToken authReq = new UsernamePasswordAuthenticationToken(
                playerDto.getUsername(), playerDto.getPassword());
        Authentication auth = authManager.authenticate(authReq);

        return "redirect:/";
    }
}

共有1个答案

方嘉志
2023-03-14

我找到了一个解决办法;我仍然无法执行自定义控制器方法,但我可以让用户登录,这是我的目标。

顺便说一下,这个项目使用的是Java 17。

我通过删除控制器中的整个postLogin()方法,并删除配置(HttpSecurity超文本传输协议)方法中formLogin()下的所有配置,启用用户登录。一旦我这样做了,我不再有我的自定义登录页面,但我有一个默认的登录页面,它确实起作用了。

我试图将. loginPage("/log")指令添加回配置方法以指定自定义登录页面,但这导致登录表单返回到302重定向到自身,即使在我不正确的控制器被删除后也是如此。

我更正的配置方法:

protected void configure (HttpSecurity http) throws Exception {
    http
        .csrf()
            .ignoringAntMatchers("/h2/**")
            .and()
        .headers()
            .frameOptions().sameOrigin().and()
        .authorizeRequests()
            .antMatchers("/login", "/register", "/h2/**").permitAll()
            .anyRequest().authenticated()
            .and()
        .formLogin()
        .and()
        .logout()
            .logoutUrl("/logout")
            .logoutSuccessUrl("/")
            .permitAll();
}

我的修正控制器:

@Controller
@RequestMapping("/login")
public class LoginController {
    private final AuthenticationManager authManager;
    private final PlayerService playerService;
    public LoginController(AuthenticationManager authManager, PlayerService playerService) {
        this.authManager = authManager;
        this.playerService = playerService;
    }
    @GetMapping
    public String getLogin(Model model) {
        model.addAttribute("playerdto", new PlayerDto());
        System.out.println("running getLogin()");
        return "login";
    }
}
 类似资料:
  • 我尝试用的一个实例替换错误处理程序,但没有成功。 我尝试创建自己的CustomErrorHandler,但这也不合适,因为在重新路由到自定义错误控制器时,原始异常已不再存在于该异常中。为了向客户端返回适当的响应,需要这些信息。 吾如何曰: 使SpringBoot不将异常转发到异常控制器。 还原@ControllerAdvice异常处理程序,这样我就可以返回适当的响应正文和状态代码。

  • 这是处理来自客户端列表请求的基类,如,从网格列表的请求。 让我们首先介绍该类是在何时及如何处理列表请求的: 首先必须从客户端触发列表请求。可能的情形有: a) 打开含网格的列表页面。在创建网格对象之后,基于当前的可见列、初始排序、过滤器等建立了一个 ListRequest 对象,并将其提交到服务器端。 b) 用户点击列头排序、点击分页按钮或者刷新按钮时触发与情形 A 同样的事件。 c) 手动使用

  • 请求处理 fpm_run()执行后将fork出worker进程,worker进程返回main()中继续向下执行,后面的流程就是worker进程不断accept请求,然后执行PHP脚本并返回。整体流程如下: (1)等待请求: worker进程阻塞在fcgi_accept_request()等待请求; (2)解析请求: fastcgi请求到达后被worker接收,然后开始接收并解析请求数据,直到req

  • 从浏览器到我的自助主机OWIN WebAPI的所有预飞行请求都不会被中间件处理。如果我从邮递员提出选项请求,它们将被处理。为什么是这样的行为? 请求URL:http://localhost:9000/api/v1/conversations/create?connectionId=13509f44-eacb-4950-8cc8-71bd37098975 请求方法:选项 状态代码:401未经授权的远

  • 当我在symfony4中提交json http post请求时,requesthandling不会提交我的表单。 我尝试将“方法”选项设置为要发布的表单,但似乎没有帮助。我将application/json头用于Content-type和Accept。 表格: 控制器: 还有我的http帖子: 标头:内容类型:应用程序/json接受:应用程序/json 正文:{“用户名”:“dunglas”} 我

  • 问题内容: 使用AlamoFire框架后,我注意到完成处理程序在主线程上运行。我想知道下面的代码是否是在完成处理程序中创建Core Data导入任务的好习惯: 问题答案: 这是一个非常好的问题。您的方法是完全有效的。但是,Alamofire实际上可以帮助您进一步简化此流程。 您的示例代码调度队列细分 在示例代码中,您将在以下调度队列之间跳转: NSURLSession分派队列 TaskDelega