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 未找到的主要内容,如果未能解决你的问题,请参考以下文章