谢谢你调查我的问题。
我正在使用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:/";
}
}
我找到了一个解决办法;我仍然无法执行自定义控制器方法,但我可以让用户登录,这是我的目标。
顺便说一下,这个项目使用的是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未经授权的远
问题内容: 使用AlamoFire框架后,我注意到完成处理程序在主线程上运行。我想知道下面的代码是否是在完成处理程序中创建Core Data导入任务的好习惯: 问题答案: 这是一个非常好的问题。您的方法是完全有效的。但是,Alamofire实际上可以帮助您进一步简化此流程。 您的示例代码调度队列细分 在示例代码中,您将在以下调度队列之间跳转: NSURLSession分派队列 TaskDelega
我正在使用带有thymeleaf的Spring Boot,我所有的资源都在Spring应用程序之外的路径上,例如。在dev env上应该使用url解析路径,并且live env继续路径。 为什么资源处理程序不处理这些类型的资源,但是如果我处理没有问题?我错过了什么吗? 编辑:如果是并且位置是url也没有被处理