【问题标题】: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 -> 网络)的网络浏览器中请求的日志,而不是猜测,

标签: java spring spring-boot spring-security spring-data-jpa


【解决方案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 演示的方式替换。
  • 我不太明白在这种情况下我有什么问题
猜你喜欢
  • 2015-07-10
  • 2021-10-13
  • 2011-03-21
  • 1970-01-01
  • 2023-01-02
  • 2015-11-27
  • 1970-01-01
  • 2013-06-19
  • 2013-08-11
相关资源
最近更新 更多