不支持请求方法“GET”。为啥我会收到此错误?

Posted

技术标签:

【中文标题】不支持请求方法“GET”。为啥我会收到此错误?【英文标题】:Request method 'GET' not supported. Why am I getting this error?不支持请求方法“GET”。为什么我会收到此错误? 【发布时间】:2021-08-01 04:53:50 【问题描述】:

我无法登录网站。给出错误消息。已解决 [org.springframework.web.HttpRequestMethodNotSupportedException:不支持请求方法“GET”] 好像什么都没忘记……用户注册成功,但是无法授权。告诉我我做错了什么? Сlass WebSecurityConfig

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)

public class WebSecurityConfig extends WebSecurityConfigurerAdapter 
@Autowired
UserService userService;

@Bean
public BCryptPasswordEncoder bCryptPasswordEncoder() 
    return new BCryptPasswordEncoder();


@Override
protected void configure(HttpSecurity httpSecurity) throws Exception 
    httpSecurity
            .csrf()
            .disable()
            .authorizeRequests()
            .antMatchers("/resources/**").permitAll()
            //Доступ только для не зарегистрированных пользователей
            .antMatchers("/","/index","/login","/registration").permitAll()
            //Доступ только для пользователей с ролью Администратор
            .antMatchers("/admin/**").hasRole("ADMIN")
            .antMatchers("/blog").hasRole("USER")
            //Все остальные страницы требуют аутентификации
            .anyRequest().authenticated()
            .and()
            //Настройка для входа в систему
            .formLogin()
            .loginPage("/login")
            //Перенарпавление на главную страницу после успешного входа
            .defaultSuccessUrl("/")
            .permitAll()
            .and()
            .logout()
            .permitAll()
            .logoutSuccessUrl("/");


@Autowired
protected void configureGlobal(AuthenticationManagerBuilder auth) throws Exception 
    auth.userDetailsService(userService).passwordEncoder(bCryptPasswordEncoder());


@Override
public void configure(WebSecurity web) throws Exception 
    web.ignoring().antMatchers("/resources/**", "/static/**",
            "/css/**", "/js/**", "/images/**","/vendor/**","/fonts/**").anyRequest();


类用户服务

@Service
public class UserService implements UserDetailsService 

@Autowired
public UserRepository userRepository;
@Autowired
public RoleRepository roleRepository;
@Autowired
public BCryptPasswordEncoder bCryptPasswordEncoder;

@Override
public UserDetails loadUserByUsername(String username) throws UsernameNotFoundException 
    User user = userRepository.findByUsername(username);
    if (user == null) 
        throw new UsernameNotFoundException("Пользователь не найден");
    
    return user;


public User findUserById(Long userId) 
    Optional<User> userFromDb = userRepository.findById(userId);
    return userFromDb.orElse(new User());


public List<User> allUsers() 
    return userRepository.findAll();


public boolean saveUser(User user) 
    User userFromDB = userRepository.findByUsername(user.getUsername());

    if (userFromDB != null) 
        return false;
    

    user.setUsername(user.getUsername());
    user.setRoles(Collections.singleton(new Role(1L, "ROLE_USER")));
    user.setPassword(bCryptPasswordEncoder.encode(user.getPassword()));
    userRepository.save(user);
    return true;


public boolean deleteUser(Long userId) 
    if (userRepository.findById(userId).isPresent()) 
        userRepository.deleteById(userId);
        return true;
    
    return false;


类输入控制器

  @Controller
  public class InputController 

   //@GetMapping("/login")
   @RequestMapping(value = "/login", method = RequestMethod.GET)
   public String login()
    return "login";
  
  

登录.html

  <div class="container">
  <div class="row main-form">
     <form class="" method="post" action="/login" modelAttribute="userForm">

        <div class="form-group">
            <label for="username" class="cols-sm-2 control-label">Ваш Логин</label>
            <div class="cols-sm-10">
                <div class="input-group">
                           <span class="input-group-addon"><i class="fa fa-users fa" aria-hidden="true"></i> </span>
                    <input type="text" class="form-control" name="username" id="username" placeholder="Введите ваш логин"/>
                </div>
            </div>
        </div>

        <div class="form-group">
            <label for="password" class="cols-sm-2 control-label">Пароль</label>
            <div class="cols-sm-10">
                <div class="input-group">
                    <span class="input-group-addon"><i class="fa fa-lock fa-lg" aria-hidden="true"></i></span>
                    <input type="password" class="form-control" name="password" id="password" placeholder="Введите ваш пароль"/>
                </div>
            </div>
        </div>

        <div class="form-group ">
            <input type="submit" value="Войти"id="button" class="btn btn-primary btn-lg btn-block login-button" />
        </div>

        </form>
        </div>
        </div>

看来我写的都是正确的,我不明白是什么问题……

【问题讨论】:

包括导致该错误的请求的详细信息。 您有一个发送post 请求的按钮和一个需要get 的方法 - 为什么您认为它应该工作?这是很好的article 关于您的问题 请发布完整的 Spring 调试日志以及来自开发控制台(F12 -> 网络)的网络浏览器中请求的日志,而不是猜测, 【参考方案1】:

我复制了您的设置,405 Method Not Allowed 是由您发布的代码中的.anyRequest() 引起的。通过在WebSecurityweb.ignoring() 末尾添加它,您将指示Spring Security 的过滤器链忽略所有请求。 405 特别是因为没有 Spring Security(因为它被任何请求忽略),您在应用程序中实现了 GET /login,但没有实现 POST /login。

Spring Security 文档中HttpFirewall 的主题可能对您有所帮助。

【讨论】:

如果您删除.anyRequest(),是否解决了您的问题?如果是这样,您介意接受答案吗?谢谢。 如果我删除 .anyRequest(),然后我得到错误 999。我尝试然后添加 web.ignoring() "/error",但结果是一堆错误。例如样式未应用或身份验证成功后,主页的位置在浏览器中打开样式文件 css 您能否更具体地说明您收到 999 的地点?发布的 login.html 是整个文件还是您省略了一部分?【参考方案2】:

我假设您在尝试导航到登录页面时遇到了错误。 /login 是默认的登录处理 URL,Spring 期望它是一个 POST。这可以用 formLogin().loginProcessingUrl() 改变,但我不怀疑你想这样做。更改您的 get 映射、您的 ant 匹配器和 .loginPage("/login") 以使用 /loginPage 之类的内容。

【讨论】:

不,当我已经输入用户名和密码并按下登录按钮时出现错误 Spring Security 使用GET /login 来检索登录表单。这是由 Spring Security 以基本格式自动提供的,可以完全按照 OP 演示的方式替换。 我不太明白在这种情况下我有什么问题

以上是关于不支持请求方法“GET”。为啥我会收到此错误?的主要内容,如果未能解决你的问题,请参考以下文章

为啥我会收到此错误:“不支持此功能(数字商品)。”?

为啥我会收到 CORS 错误原因:CORS 请求未成功

POST 请求不支持 Postman GET 请求

为啥我会收到 UnsafeMutablePointer 错误?

为啥我会收到“您的请求产生错误”。 [newNullResponse]' 在我的应用程序的 iTunes 页面上?

java.net.ProtocolException:方法不支持请求正文:GET