Java 配置 /j_spring_security_check 未找到

Posted

技术标签:

【中文标题】Java 配置 /j_spring_security_check 未找到【英文标题】:Java config /j_spring_security_check not found 【发布时间】:2015-07-26 08:40:10 【问题描述】:

我是 Spring 框架的菜鸟。

尝试为应用配置安全选项。我有以下作为我的(xml-less)安全配置:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter 
@Autowired
@Qualifier("accountService")
UserDetailsService userDetailsService;

@Autowired
public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception 
    auth.userDetailsService(userDetailsService).passwordEncoder(passwordEncoder());


@Override
protected void configure(HttpSecurity http) throws Exception 

    http.csrf().disable().authorizeRequests()
            .antMatchers("/admin/**" ).hasRole( "Admin" )
            .and()
            .formLogin()
            .loginPage("/")
            .loginProcessingUrl( "/j_spring_security_check" )
            .failureUrl( "/loginfailed" )
            .permitAll()
            .and().logout().logoutSuccessUrl("/logout")
            .and().exceptionHandling().accessDeniedPage("/403");


@Bean
public PasswordEncoder passwordEncoder()
    PasswordEncoder encoder = new BCryptPasswordEncoder();
    return encoder;



它显示登录页面,但是当我提交它时会抛出一个/j_spring_security_check Not Found 异常。非常感谢任何帮助。

我的网络配置是这样的:

public class WebConfig implements WebApplicationInitializer 

public void onStartup( ServletContext servletContext ) throws ServletException 

    AnnotationConfigWebApplicationContext applicationContext = new AnnotationConfigWebApplicationContext();
    applicationContext.register( MvcServletConfig.class );
    applicationContext.register( SecurityConfig.class );

    //Add the servlet mapping manually and make it initialize automatically
    ServletRegistration.Dynamic servlet = servletContext.addServlet( "dispatcher", new DispatcherServlet( applicationContext ) );
    servletContext.addListener(new ContextLoaderListener(applicationContext));
    servlet.addMapping( "/" );
    servlet.setLoadOnStartup( 1 );


【问题讨论】:

类似于***.com/questions/27469834/… ? 尝试从j_spring_security_check 中删除/ 或使用上下文的绝对路径创建URL 然后/j_spring_security_check @BretC - 我确实尝试过,它在一定程度上有所帮助,但我很快就被j_spring_security_logout 卡住了。我现在已经更新了答案。 @OO7 - 谢谢,但这也无济于事。 【参考方案1】:

见docs

.loginPage("/") 覆盖您必须提交到的网址。

可能你想要的是.loginPage("/j_spring_security_check")

【讨论】:

并非如此,因为这就是在 servlet 映射中设置登录页面的方式。相反,.loginProcessingUrl( "/j_spring_security_check" ) 为我工作。【参考方案2】:

这样更改了我的 WebConfig

@Configuration
public class WebConfig extends AbstractAnnotationConfigDispatcherServletInitializer 
@Override
protected String[] getServletMappings() 
    return new String[ ]  "/" ;


@Override
protected Class<?>[] getRootConfigClasses() 
    return new Class<?>[ ]  AppConfig.class, SecurityConfig.class ;


@Override
protected Class<?>[] getServletConfigClasses() 
    return new Class<?>[ ] MvcServletConfig.class ;


添加AbstractSecurityWebApplicationInitializer如下:

public class SecurityInitialiser extends AbstractSecurityWebApplicationInitializer 

我在SecurityConfig 中的configure() 方法覆盖现在看起来像这样:

@Override
protected void configure(HttpSecurity http) throws Exception 

    http.authorizeRequests()
            .anyRequest().authenticated()
            .and()
            .formLogin()
                .loginPage( "/" )
                .loginProcessingUrl( "/j_spring_security_check" )
                .defaultSuccessUrl( "/hello" )
                .failureUrl( "/loginfailed" )
                .permitAll()
            .and()
            .logout()
                .logoutUrl( "/j_spring_security_logout" )
                .logoutSuccessUrl( "/" )
                .invalidateHttpSession( true )
            .and()
            .exceptionHandling().accessDeniedPage( "/WEB-INF/pages/403.jsp" )
            .and()
            .csrf()
            .and()
            .httpBasic();

希望这对某人有所帮助!感谢所有提出建议的人。 :-)

【讨论】:

以上是关于Java 配置 /j_spring_security_check 未找到的主要内容,如果未能解决你的问题,请参考以下文章

Java环境变量怎么配置?Java环境变量设置教程

java_home环境变量配置的问题?

linux 下java读取配置文件

Spring的Java配置方式—@Configuration和@Bean实现Java配置

如何配置Java HTTPS CA证书

java 读取配置文件路径问题