HTTP Status 405 错误

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了HTTP Status 405 错误相关的知识,希望对你有一定的参考价值。

import java.io.IOException;
import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class TestLiftCycleServlet extends HttpServlet

public void destroy()

System.out.print("DESTORY");


@Override
public void init(ServletConfig config) throws ServletException

System.out.print("INIT");


public TestLiftCycleServlet()
System.out.println("construct");


protected void doGet(HttpServletRequest request, HttpServlet response) throws ServletException,IOException

//doPost(request,(HttpServletResponse) response);
System.out.println("doGet");


程序没错
话说405什么意思啊

405是你方法的问题,JSP页面提交的时候用的是POST方法,你在servlet类里只重写了doget方法,只能处理get请求,处理不了post请求。可以重写service方法,两种请求都可以处理。 参考技术A

错误可能源于两方面:

1、可能是在servlet中没有调用post()方法引起的;

2、可能是在在serlvet中跳转没有用外跳(response.sendRedirect());

对于错误1:在servlet中没有调用post().我在jsp页面中提交一个XMLHTTPRequest请求到servlet时,在相应的Servlet中没用到post(),因此报这个错误。

解决方案:在Servlet中调用这个方法就行了。

对于错误2:

解决方案:把request.getRequestDispatcher("FindByIdServlet?id="+commentPostId).forward(request, response);

改成response.sendRedirect("FindByIdServlet?id="+commentPostId);

参考技术B 回答

亲您好, 1、打开浏览器,点“工具”→“管理加载项”那里禁用所有可疑插件,或者你能准确知道没问题的保留。然后→工具→INTERNET选项→常规页面→删除cookies→删除文件→钩选删除所有脱机内容→确定→设置使用的磁盘空间为:8MB或以下(我自己使用1MB)→确定→清除历史纪录→网页保存在历史记录中的天数:3以下→应用确定(我自己使用的设置是0天)。2、还原浏览器高级设置默认值:工具→INTERNET选项→高级→还原默认设置。3、恢复默认浏览器的方法“工具”→Internet选项→程序→最下面有个“检查Internet Explorer是否为默认的浏览器”把前面的钩选上,确定。4、设置主页:“工具”→Internet选项→常规→可以更改主页地址→键入你喜欢的常用网址→应用。5、如果浏览器中毒就使用金山毒霸系统修复选择系统清理选项,点击立即清理选择安全百宝箱中系统修复,即可解决网页上有错误解问题如果是手机建议使用免费金山手机卫士,清理你的 手机病毒和垃圾再打开网页

禁止,Http.status=403 与 jdbcAuthentication()

【中文标题】禁止,Http.status=403 与 jdbcAuthentication()【英文标题】:Forbidden, Http.status=403 with jdbcAuthentication() 【发布时间】:2021-09-04 22:25:27 【问题描述】:

可能是我犯了任何愚蠢的错误。 在我使用jdbcAuthentication() 配置身份验证后,在我通过 chrome 登录后出现以下错误(在此底部)。 inMemoryAuthentication() 也是如此

当我有这个时工作 -

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception 
    auth.inMemoryAuthentication().withUser("user").password("pass").roles("REGISTERED_USER").and().withUser("admin")
            .password("pass").roles("ADMIN");
        

这是我的代码 -

@EnableWebSecurity
public class FplUserOperationAuthentication extends WebSecurityConfigurerAdapter 

    @Autowired
    private DataSource dataSource;

    @Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception 
        auth.jdbcAuthentication()
            .dataSource(dataSource)
            .usersByUsernameQuery("select m.username as username, m.password as password, "
                    + "m.enabled as enabled from ***.users_main m where m.username = ?")
            .authoritiesByUsernameQuery("select a.username as username, a.role as authority "
                    + "from ***.authorities a where a.username = ?");
    


    @Bean
    public PasswordEncoder getPasswordEncoder() 
        return NoOpPasswordEncoder.getInstance();
    
    @Override
    protected void configure(HttpSecurity http) throws Exception 
        http.authorizeRequests()
            .antMatchers("/user-profile/admin/**").hasAnyRole("ADMIN")
            .antMatchers("/user-profile/users/**").hasAnyRole("REGISTERED_USER","ADMIN")
            .antMatchers("/welcome").permitAll().and().formLogin()
            .and().csrf().disable();
    

Application.properties -

endpoints.shutdown.enabled=true
spring.application.name=fpl-user-operations
management.endpoints.web.exposure.include = *
spring.datasource.url = jdbc:oracle:thin:@localhost:1521/ORCLPDB
spring.datasource.username = FPLADMIN
spring.datasource.password = oracle1
spring.devtools.add-properties = false
spring.config.import=optional:configserver:http://localhost:8888
spring.datasource.initialization-mode=always
spring.jpa.hibernate.ddl-auto=none

SQL -

alter session set current_schema = ***;
create table users_main 
(
    username varchar2(20) primary key,
    password varchar2(20),
    enabled char(1)
);

create table authorities
(
    username varchar2(20),
    role varchar2(15),
    
    constraint authorities_c1 foreign key (username) references users_main (username)

);

SQL 数据

TABLE users_main

表权威

当我尝试使用用户名作为“用户”和密码作为“通过”登录后,当我访问 API 时出错。 -

错误 -

Whitelabel Error Page

This application has no explicit mapping for /error, so you are seeing this as a fallback.
Mon Jun 21 12:18:32 IST 2021
There was an unexpected error (type=Forbidden, status=403).

控制台错误 -

2021-06-21 14:49:11.520 DEBUG 11856 --- [nio-8080-exec-5] o.s.security.web.FilterChainProxy        : Secured GET /error
2021-06-21 14:49:11.520 DEBUG 11856 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : "ERROR" dispatch for GET "/error", parameters=
2021-06-21 14:49:11.521 DEBUG 11856 --- [nio-8080-exec-5] s.w.s.m.m.a.RequestMappingHandlerMapping : Mapped to org.springframework.boot.autoconfigure.web.servlet.error.BasicErrorController#errorHtml(HttpServletRequest, HttpServletResponse)
2021-06-21 14:49:11.521 DEBUG 11856 --- [nio-8080-exec-5] o.j.s.OpenEntityManagerInViewInterceptor : Opening JPA EntityManager in OpenEntityManagerInViewInterceptor
2021-06-21 14:49:11.537 DEBUG 11856 --- [nio-8080-exec-5] o.s.w.s.v.ContentNegotiatingViewResolver : Selected 'text/html' given [text/html, text/html;q=0.8]
2021-06-21 14:49:11.538 DEBUG 11856 --- [nio-8080-exec-5] o.j.s.OpenEntityManagerInViewInterceptor : Closing JPA EntityManager in OpenEntityManagerInViewInterceptor
2021-06-21 14:49:11.538 DEBUG 11856 --- [nio-8080-exec-5] o.s.web.servlet.DispatcherServlet        : Exiting from "ERROR" dispatch, status 403
2021-06-21 14:49:11.538 DEBUG 11856 --- [nio-8080-exec-5] s.s.w.c.SecurityContextPersistenceFilter : Cleared SecurityContextHolder to complete request

注意 - 但是,如果我故意提供错误的凭据,它会显示“Bad Credentials”

【问题讨论】:

如果需要任何额外信息,请告诉我 【参考方案1】:

不知道确切的原因,如果有人有任何想法。请告诉我。

更改 - 在 DB 中,我在所有类型的权限/角色前面附加了 ROLE

所以我现在有 "ROLE_REGISTERED_USER",而不是 "REGISTERED_USER"

找到了here

我没有发现作为协议明确提及的附加 ROLE。所以我错过了。

我的授权方式-

@Override
    protected void configure(HttpSecurity http) throws Exception 
        http.authorizeRequests()
            .antMatchers("/user-profile/admin/**").hasAnyRole("ADMIN")
            .antMatchers("/user-profile/users/**").hasAnyRole("REGISTERED_USER","ADMIN")
            .antMatchers("/welcome").permitAll().and().formLogin()
            .and().csrf().disable();
    

【讨论】:

在 Spring Security 中,角色相当于以“ROLE_”为前缀的权限。当您使用内存中的用户存储时,您指定了.roles("ADMIN")。这意味着用户获得了ROLE_ADMIN 的权限。使用 JDBC 时,您只需授予用户权限ADMIN,这是不同的,因为它不是角色。如果您不想使用角色,您可以保留具有ADMIN 权限的用户并将.hasAnyRole("ADMIN") 更改为.hasAnyAuthority("ADMIN") ROLE 和 AUTHORITY 之间的主要区别是什么。一个主要的区别显然是角色被读取为以实际角色为前缀的“ROLE_”。但是在它们服务的目的上两者是否相同?为什么我这么说是因为在 spring 文档中它说我们从 db 中读取它 - .authoritiesByUsernameQuery(select email,authority from authorities where email = ? 但我们最终可以通过 .hasAnyRole() 方法使用它。 @EleftheriaStein-Kousathana【参考方案2】:

您没有在配置方法中包含密码编码器

@Override
    protected void configure(AuthenticationManagerBuilder auth) throws Exception 
        auth.jdbcAuthentication()
            .dataSource(dataSource)
            **.passwordEncoder(getPasswordEncoder())**
            .usersByUsernameQuery("select m.username as username, m.password as password, "
                    + "m.enabled as enabled from ***.users_main m where m.username = ?")
            .authoritiesByUsernameQuery("select a.username as username, a.role as authority "
                    + "from ***.authorities a where a.username = ?");
    

【讨论】:

感谢您的回答。我想既然我把它声明为@Bean,spring 自动配置它。尽管如此,我确实尝试过。但同样的问题。 :( 很奇怪 如果这不起作用,我会检查 user_main 表中“启用”字段的数据类型。我见过布尔类型。由于您使用的是 MySQL (TINYINT),您应该存储 0 还是 1?创建表users_main(用户名varchar_ignorecase(50)非空主键,密码varchar_ignorecase(50)非空,启用BIT(1)非空); 非常感谢您阅读我的问题所付出的努力。不过,我发现了这个问题,请查看我对这个问题的回答。让我知道您对此的看法

以上是关于HTTP Status 405 错误的主要内容,如果未能解决你的问题,请参考以下文章

Js 跨域CORS报错 Response for preflight has invalid HTTP status code 405

转 Js 跨域CORS报错 Response for preflight has invalid HTTP status code 405

SVN 首次用TortoiseSVN Checkout 提示Unexpected HTTP status 405

http status code

如何解决 HTTP 错误 405

如何解决 HTTP“404”和“405”错误消息?