为了账号安全,请及时绑定邮箱和手机立即绑定

为什么war包在Windows的tomcat正常运行,在linux服务器报errorpage错误?

/ 猿问

为什么war包在Windows的tomcat正常运行,在linux服务器报errorpage错误?

木子锦 2019-08-19 10:55:11
最近项目完成后打包成war发布到服务器遇到访问应用404问题,用的是tomcat8.5,错误信息如下:
o.s.b.w.servlet.support.ErrorPageFilter  : Cannot forward to error page for request [/login] as the response has already been committed. As a result, the response may have the wrong status code. If your application is running on WebSphere Application Server you may be able to resolve this problem by setting com.ibm.ws.webcontainer.invokeFlushAfterService to false

项目是springboot+security+mybatis,ide 用的idea,打包方式用的是build菜单中的Build Artifactis

security配置

protected void configure(HttpSecurity http) throws Exception {
    http.authorizeRequests()
                //处理preflight请求
                //.requestMatchers(CorsUtils::isPreFlightRequest).permitAll()
                .antMatchers("/user/login").permitAll()
                .antMatchers("/login").permitAll()
                .antMatchers("/login/error").permitAll()
                .anyRequest().authenticated()
                .and()
                //设置登录页
            .formLogin()
                //设置登录成功页
                .loginPage("/login")
                .successHandler(securityLoginSuccessHandler)
                .failureHandler(securityLoginFailureHandler)
                .and()
            .logout()
                .logoutUrl("/logout")
                .logoutSuccessHandler(securityLogoutSuccessHandler)
                .deleteCookies("JSESSIONID")
                .and()
            .sessionManagement()
                //session超时处理
                .invalidSessionUrl("/login/invalid")
                .maximumSessions(1)
                //老用户被踢出后操作
                .expiredSessionStrategy(new SecurityExpiredSessionStrategy());
    http.csrf().disable()
            .exceptionHandling().accessDeniedHandler(securityAccessDeniedHandler);
}

loginpage的“/login”配置如下:

@RequestMapping("/login")
public String  showLogin() throws IOException {
    System.out.println("调用loginController的登录方法");
    return "index.html#/login";
}

遇到这个问题时,参考https://blog.csdn.net/weixin_41622183/article/details/84652437

这篇博客在启动类加入配置:

public class KpApplication extends SpringBootServletInitializer {

    public static void main(String[] args) {
        SpringApplication.run(KpApplication.class, args);
    }

    @Bean
    public ErrorPageFilter errorPageFilter() {
        return new ErrorPageFilter();
    }

    @Bean
    public FilterRegistrationBean disableSpringBootErrorFilter(ErrorPageFilter filter) {
        FilterRegistrationBean filterRegistrationBean = new FilterRegistrationBean();
        filterRegistrationBean.setFilter(filter);
        filterRegistrationBean.setEnabled(false);
        return filterRegistrationBean;
    }

}
重新打包发布到linux服务器,新的错误信息为:

 o.s.b.d.LoggingFailureAnalysisReporter   : 


***************************

APPLICATION FAILED TO START

***************************


Description:


The bean 'errorPageFilter', defined in org.springframework.boot.web.servlet.support.ErrorPageFilterConfiguration, could not be registered. A bean with that name has already been defined in com.kpzdh.kp.KpApplication and overriding is disabled.


Action:


Consider renaming one of the beans or enabling overriding by setting spring.main.allow-bean-definition-overriding=true

然后参考:https://blog.csdn.net/weixin_42633131/article/details/84782516 这篇博客,在yml配置中加入配置:

spring:
  jmx:
    default-domain: demo
  datasource:
    driver-class-name: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://localhost:3306/demo?useUnicode=true&characterEncoding=utf-8&useSSL=true&serverTimezone=GMT%2B8
    username: root
    password: root
  main:
    allow-bean-definition-overriding: true
    
如上配置之后,两个错误信息都没有出现了,但是还是404,查看日志,"/login"路径的"调用loginController的登录方法"已经输出了,
但是浏览器控制台中,/login路径还是404,请问该如何解决呢?

这个问题已经困扰很久了,希望大家能帮帮我,万分感谢!

查看完整描述

1 回答

?
我什么都不会的

您好,请问您解决这个问题了么?我被这个问题困了好几天了😭

查看完整回答
反对 回复 2019-09-06

添加回答

回复

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信