当前位置: 首页 > 知识库问答 >
问题:

404使用SpringMVC和SpringSecurity注销

西门旻
2023-03-14

我正在学习springsecurity(基于java的配置),我无法使注销正常工作。当我点击注销时,我看到URL更改为http://localhost:8080/logout并获取“HTTP 404-/logout”。登录功能工作正常(即使使用自定义登录表单),但问题是注销,我怀疑重定向的url“localhost:8080/logout”应该类似于“localhost:8808/springtest/logoout”

我遵循一本书和这些例子的组合:http://docs . spring . io/spring-security/site/docs/3.2 . x/guides/hello MVC . html

我正在使用:

   <dependency>
        <groupId>org.springframework</groupId>
        <artifactId>spring-core</artifactId>
        <version>4.1.4.RELEASE</version>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-config</artifactId>
        <version>4.0.2.RELEASE</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-core</artifactId>
        <version>4.0.2.RELEASE</version>
        <scope>compile</scope>
    </dependency>
    <dependency>
        <groupId>org.springframework.security</groupId>
        <artifactId>spring-security-web</artifactId>
        <version>4.0.2.RELEASE</version>
        <scope>compile</scope>
    </dependency>

这是 MVC 初始值设定项:

    public class MvcInitializer extends AbstractAnnotationConfigDispatcherServletInitializer {

    @Override
    protected Class<?>[] getRootConfigClasses() {
        return new Class[] { RootApplicationContextConfig.class };
    }

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

    @Override
    protected String[] getServletMappings() {
        return new String[] { "/" };
    }

    @Override
    protected Filter[] getServletFilters() {
        return new Filter[] { new HiddenHttpMethodFilter() };
    }
 }

这是安全初始化器:

    public class SecurityInitializer extends AbstractSecurityWebApplicationInitializer {

}

这是Web配置:

@Configuration
@EnableWebMvc
@EnableTransactionManagement
@ComponentScan(basePackages = { "org.munilvc.springtest" })
public class WebApplicationContextConfig extends WebMvcConfigurerAdapter {

    @Bean(name = "viewResolver")
    public InternalResourceViewResolver getViewResolver() {
        InternalResourceViewResolver viewResolver = new InternalResourceViewResolver();
        viewResolver.setPrefix("/WEB-INF/views/");
        viewResolver.setSuffix(".jsp");
        return viewResolver;
    }

    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/login").setViewName("login");
        registry.setOrder(Ordered.HIGHEST_PRECEDENCE);
    }

    // Serve static content like <mvc:resources/> tags
    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/resources/**").addResourceLocations("/resources/magic/").setCachePeriod(31556926);
    }

}

这是安全配置:

@Configuration
@EnableWebMvcSecurity
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    public void configureGlobal(AuthenticationManagerBuilder auth) throws Exception {
        auth.inMemoryAuthentication().withUser("user").password("password").roles("USER");
    }
}

我也有一个home控制器,我不确定这是最好的方法,但是我希望localhost:8080/springtest重定向到home,Spring security应该用登录页面拦截它。这种方法现在对我很有效,但是我想知道这是不是正确的方法?

@Controller
public class HomeController {

  @RequestMapping("/")
  public String showLoginForm(Model model) {
    return "home";
  }

}

最后,这是我主页中的注销:

        <p class="navbar-text navbar-right">
            Signed in as <a href="#" class="navbar-link">${pageContext.request.remoteUser}</a>

        <form class="navbar-form pull-right" action="/logout"
            method="post">
            <input type="hidden" name="${_csrf.parameterName}"
                value="${_csrf.token}" /> <input type="submit" value="Log out" />
        </form>

我是否需要为注销执行显式请求映射?我已经检查了spring文档中的示例应用hellomvc jc,但我没有看到任何显式的请求映射,所以我认为SpringSecurity 4已经处理好了,不是吗?

非常感谢你!我真的很感谢你的时间,我希望这对其他人有所帮助。

共有1个答案

陆星文
2023-03-14

使用操作="注销"而不是操作="/注销"

 类似资料:
  • 问题内容: 我有以下控制器… 我的servlet上下文使用以下值设置… 现在,如果我转到那,我得到的视图就是userManagement.jsp,这正是我想要的… 但是,如果我转到404错误。 我看不到的是为什么会发生这种情况,因为我将requestMapping设置为与上面完全相同,并且在/ WEB-INF / views中我有一个createUser.jsp和userManagement.js

  • 我在这里有很多问题要解决。一直试图将上述3项技术集成到我们的WebApp中…我们要使用 null web.xml: 我的servlet-context.xml: My manager-context.xml: 编辑2 我认为主要的问题是SpringSecurity需要webapp上下文(ContextLoaderListener)才能工作,但web应用程序是在servlet上下文中运行的。控制器方

  • 本文向大家介绍使用注解开发SpringMVC详细配置教程,包括了使用注解开发SpringMVC详细配置教程的使用技巧和注意事项,需要的朋友参考一下 1、使用注解开发SpringMVC 1、新建一个普通的maven项目,添加web支持 2、在pom.xml中导入相关依赖 SpringMVC相关 Servlet jsp 为了防止资源导出失败,我们加入以下代码 3、配置web.xml 注意web.xml

  • 如何使用java注释创建多个404响应(或者更广泛地说,多个相同的HTTP代码响应)。 我试过: 还有多个: 我能得到类似于多重的东西的唯一方法是使用: 这并不理想,因为它需要人与人之间的互动来查看所有这些内容,而这只是不需要的;我们的期望是: 或者更好: 我正在使用springdoc和以下dep:

  • 我正试图将SpringSecurity5.1.4.RELEASE集成到一个已经在运行的JSF2.2-PrimeFaces6.1应用程序中,以实现安全性。当我尝试访问受保护的页面“logged.xhtml”时,spring会触发并将我带到登录页面“login.xhtml”,因此spring似乎工作正常。 问题是,一旦我配置了Spring,所有Primeface都停止工作(以及其他Primeface组

  • 我想在一个项目中使用两种方法(反应式和标准式)。 我尝试将一个REST APIendpoint迁移到反应式webflux,并在迁移其余endpoint之前测试性能。但没用。我为他添加了路由器和处理程序,但直到我没有从依赖项中删除,并禁用之前,我一直得到http代码。有没有可能?还是我应该将所有项目迁移到反应式方法?