Spring安全性抛出javax.servlet.ServletException:无法解析名为“j_spring_security_check”的视图

前端之家收集整理的这篇文章主要介绍了Spring安全性抛出javax.servlet.ServletException:无法解析名为“j_spring_security_check”的视图前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我正在尝试将Spring安全性与自定义登录页面和对数据库的访问权限添加到我的Spring MVC应用程序中.看起来我的映射是错误的,因为它无法映射j_spring_security_check.

为了解决这个问题,我看了下面的页面1,2,3,但还没有解决问题.

如果您没有太多时间,请阅读下面的第2部分,即问题的编辑部分开始的地方.否则,请阅读第1部分和第2部分.

第1部分

我还在我的web.xml文件添加了以下行,但应用程序返回以下异常.

  1. Failed during start
  2. java.util.concurrent.ExecutionException: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]
  3. at java.util.concurrent.FutureTask.report(FutureTask.java:122)
  4. at java.util.concurrent.FutureTask.get(FutureTask.java:188)
  5. at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1123)
  6. at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:302)
  7. at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
  8. at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
  9. at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
  10. at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:732)
  11. at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
  12. at org.apache.catalina.startup.Catalina.start(Catalina.java:691)
  13. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  14. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  15. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  16. at java.lang.reflect.Method.invoke(Method.java:606)
  17. at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322)
  18. at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:456)
  19. Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina].StandardHost[localhost]]
  20. at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
  21. at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1559)
  22. at org.apache.catalina.core.ContainerBase$StartChild.call(ContainerBase.java:1549)
  23. at java.util.concurrent.FutureTask.run(FutureTask.java:262)
  24. at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
  25. at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
  26. at java.lang.Thread.run(Thread.java:744)
  27. Caused by: org.apache.catalina.LifecycleException: A child container Failed during start
  28. at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1131)
  29. at org.apache.catalina.core.StandardHost.startInternal(StandardHost.java:800)
  30. at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
  31. ... 6 more
  32. Jun 13,2015 2:44:54 PM org.apache.catalina.startup.Catalina start
  33. SEVERE: The required Server component Failed to start so Tomcat is unable to start.
  34. org.apache.catalina.LifecycleException: Failed to start component [StandardServer[8005]]
  35. at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
  36. at org.apache.catalina.startup.Catalina.start(Catalina.java:691)
  37. at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
  38. at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
  39. at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
  40. at java.lang.reflect.Method.invoke(Method.java:606)
  41. at org.apache.catalina.startup.Bootstrap.start(Bootstrap.java:322)
  42. at org.apache.catalina.startup.Bootstrap.main(Bootstrap.java:456)
  43. Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardService[Catalina]]
  44. at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
  45. at org.apache.catalina.core.StandardServer.startInternal(StandardServer.java:732)
  46. at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
  47. ... 7 more
  48. Caused by: org.apache.catalina.LifecycleException: Failed to start component [StandardEngine[Catalina]]
  49. at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:154)
  50. at org.apache.catalina.core.StandardService.startInternal(StandardService.java:443)
  51. at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
  52. ... 9 more
  53. Caused by: org.apache.catalina.LifecycleException: A child container Failed during start
  54. at org.apache.catalina.core.ContainerBase.startInternal(ContainerBase.java:1131)
  55. at org.apache.catalina.core.StandardEngine.startInternal(StandardEngine.java:302)
  56. at org.apache.catalina.util.LifecycleBase.start(LifecycleBase.java:150)
  57. ... 11 more

在提交表单后不添加该过滤器,请求将由以下控制器捕获.

  1. @Controller
  2. public class MainController {
  3. @RequestMapping("/{viewName}")
  4. public String index(@PathVariable String viewName) {
  5. ...
  6. }

web.xml中

我-security.xml文件

AppConfig.java

  1. @EnableWebMvc
  2. @Configuration
  3. @ComponentScan({ "com.myproject.*" })
  4. @EnableTransactionManagement
  5. @Import({ SecurityConfig.class })
  6. public class AppConfig {
  7. @Bean
  8. public SessionFactory sessionFactory() {
  9. LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder(
  10. dataSource());
  11. builder.scanPackages("com.myproject.model").addProperties(
  12. getHibernateProperties());
  13. return builder.buildSessionFactory();
  14. }
  15. private Properties getHibernateProperties() {
  16. Properties prop = new Properties();
  17. prop.put("hibernate.format_sql","true");
  18. prop.put("hiberate.show_sql","true");
  19. prop.put("hibernate.dialect","org.hibernate.dialect.MySQL5Dialect");
  20. return prop;
  21. }
  22. @Bean(name = "dataSource")
  23. public BasicDataSource dataSource() {
  24. BasicDataSource ds = new BasicDataSource();
  25. ds.setDriverClassName("com.mysql.jdbc.Driver");
  26. ds.setUrl("jdbc:mysql://localhost:3306/test");
  27. ds.setUsername("jack");
  28. ds.setPassword("jack");
  29. return ds;
  30. }
  31. @Bean
  32. public HibernateTransactionManager txManager() {
  33. return new HibernateTransactionManager(sessionFactory());
  34. }
  35. }

SecurityConfig.java

  1. @Configuration
  2. @EnableWebSecurity
  3. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  4. @Autowired
  5. @Qualifier("userDetailsService")
  6. UserDetailsService userDetailsService;
  7. @Autowired
  8. public void configureGlobal(AuthenticationManagerBuilder auth)
  9. throws Exception {
  10. auth.userDetailsService(userDetailsService).passwordEncoder(
  11. passwordEncoder());
  12. }
  13. @Override
  14. protected void configure(HttpSecurity http) throws Exception {
  15. http.authorizeRequests().antMatchers("/profile/**")
  16. .access("hasRole('ADMIN')").and().formLogin()
  17. .loginPage("/signin").failureUrl("/signin?error")
  18. .usernameParameter("username").passwordParameter("password")
  19. .and().logout().logoutSuccessUrl("/index").and().csrf().and()
  20. .exceptionHandling().accessDeniedPage("/403");
  21. }
  22. @Bean
  23. public PasswordEncoder passwordEncoder() {
  24. PasswordEncoder encoder = new BCryptPasswordEncoder();
  25. return encoder;
  26. }
  27. }

SpringMVCInitializer.java

  1. import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;
  2. public class SpringMvcInitializer extends
  3. AbstractAnnotationConfigDispatcherServletInitializer {
  4. @Override
  5. protected Class

LoginController.java

  1. @Controller
  2. public class LoginController {
  3. @RequestMapping(value = "/login",method = RequestMethod.GET)
  4. public ModelAndView login(
  5. @RequestParam(value = "error",required = false) String error,@RequestParam(value = "logout",required = false) String logout) {
  6. ModelAndView model = new ModelAndView();
  7. if (error != null) {
  8. model.addObject("error","Invalid username and password!");
  9. }
  10. if (logout != null) {
  11. model.addObject("msg","You've been logged out successfully.");
  12. }
  13. model.setViewName("login");
  14. return model;
  15. }
  16. }

**

第2部分

根据Thomas的建议,我将代码更改为以下内容

**

web.xml中

AppConfig.java

  1. @EnableWebMvc
  2. @Configuration
  3. @ComponentScan({ "com.myproject" })
  4. @EnableTransactionManagement
  5. @Import({ SecurityConfig.class })
  6. public class AppConfig {
  7. @Bean
  8. public SessionFactory sessionFactory() {
  9. LocalSessionFactoryBuilder builder = new LocalSessionFactoryBuilder(
  10. dataSource());
  11. builder.scanPackages("com.myproject.model").addProperties(
  12. getHibernateProperties());
  13. return builder.buildSessionFactory();
  14. }
  15. private Properties getHibernateProperties() {
  16. Properties prop = new Properties();
  17. prop.put("hibernate.format_sql","org.hibernate.dialect.MySQL5Dialect");
  18. return prop;
  19. }
  20. @Bean(name = "dataSource")
  21. public BasicDataSource dataSource() {
  22. BasicDataSource ds = new BasicDataSource();
  23. ds.setDriverClassName("com.mysql.jdbc.Driver");
  24. ds.setUrl("jdbc:mysql://localhost:3306/test");
  25. ds.setUsername("jack");
  26. ds.setPassword("jack");
  27. return ds;
  28. }
  29. @Bean
  30. public HibernateTransactionManager txManager() {
  31. return new HibernateTransactionManager(sessionFactory());
  32. }
  33. }

SecurityConfig.java

  1. @Configuration
  2. @EnableWebMvcSecurity
  3. public class SecurityConfig extends WebSecurityConfigurerAdapter {
  4. @Autowired
  5. @Qualifier("userDetailsService")
  6. UserDetailsService userDetailsService;
  7. @Autowired
  8. public void configureGlobal(AuthenticationManagerBuilder auth)
  9. throws Exception {
  10. auth.inMemoryAuthentication().withUser("user").password("password").roles("USER");
  11. // auth.userDetailsService(userDetailsService).passwordEncoder(
  12. // passwordEncoder());
  13. }
  14. @Override
  15. protected void configure(HttpSecurity http) throws Exception {
  16. http.authorizeRequests().antMatchers("/profile/**")
  17. .access("hasRole('ADMIN')").and().formLogin()
  18. .loginPage("/login").failureUrl("/login?error")
  19. .and().logout().logoutSuccessUrl("/index").and().csrf().and()
  20. .exceptionHandling().accessDeniedPage("/403");
  21. }
  22. @Bean
  23. public PasswordEncoder passwordEncoder() {
  24. PasswordEncoder encoder = new BCryptPasswordEncoder();
  25. return encoder;
  26. }
  27. }

SpringMVCInitializer.java

  1. public class SpringMvcInitializer extends
  2. AbstractAnnotationConfigDispatcherServletInitializer {
  3. @Override
  4. protected Class

MainController

  1. @Controller
  2. public class MainController {
  3. @RequestMapping("/{viewName}")
  4. public String index(@PathVariable String viewName) {
  5. System.err.println("View Name is :" + viewName);
  6. if (isValidView(viewName)) {
  7. return viewName;
  8. }
  9. return null;
  10. }

关于MainController,这是我处理静态页面的方式,例如www.myproject.com/index,www.myproject.com/contactus等.关于这个问题的另一个问题是here

最佳答案
我强烈建议您遵循Java或XML配置.我个人更喜欢Java配置.

>删除所有与Spring Security相关的XML配置并创建以下内容
文件.
>修改您拥有的许可地址.

  1. public class MessageSecurityWebApplicationInitializer extends
  2. AbstractSecurityWebApplicationInitializer { //register the springSecurityFilterChain with the war
  3. }
  4. public class MessageWebApplicationInitializer extends
  5. AbstractAnnotationConfigDispatcherServletInitializer {
  6. @Override
  7. protected Classlogout().logoutUrl("/singout").permitAll();
  8. }

有关进一步说明和访问DB,请参阅documentation

猜你在找的Spring相关文章