首页 > 解决方案 > Spring Boot MVC 应用程序中的无效会话(注销)

问题描述

我正在尝试最简单的登录和注销方式Spring MVC。我是 .NET 人,当我记得我很快就实现了会话身份验证ASP.NET。现在,我必须使用Spring MVC我面临的问题是我在我的logout方法中得到了不同的会话对象,所以我不能取消它。我在login方法中创建会话属性,我使用逻辑的地方在我的ProductsController. 这是代码:

登录方式:

 @PostMapping
    @RequestMapping(value = {"login"},method = RequestMethod.POST)
    public ResponseEntity Login(@RequestBody @Valid LoginModel user, HttpServletRequest request,HttpSession session){



        List<User> userFromDb=service.findByEmailAndPassword(user.getEmail(),user.getPassword());
        if(!userFromDb.isEmpty()){
            session.setAttribute("loggedInUser", user );
            return new ResponseEntity(HttpStatus.OK);
        }
        return new ResponseEntity(HttpStatus.UNAUTHORIZED);
    }

注销方法:

 @GetMapping
   @RequestMapping(value = {"logout"},method = RequestMethod.GET)
   public ResponseEntity Logout(HttpServletRequest request, SessionStatus 
 status,HttpSession session, HttpServletResponse response){

    session.invalidate();
//        request.getSession(true).removeAttribute("loggedInUser");
//
//        request.getSession(true).invalidate();
    Cookie[] cookies = request.getCookies();
    if(cookies!=null) {
        for (Cookie cookie : cookies) {
            cookie.setMaxAge(0);
            cookie.setValue(null);
            cookie.setPath("/");
            response.addCookie(cookie);
        }
    }
    return new ResponseEntity(HttpStatus.OK);
}

产品控制器:

RequestMapping(value = {"","/"},method = RequestMethod.GET)
    @GetMapping
    public ResponseEntity Products(HttpServletRequest request, HttpSession session){

        if(session==null || session.getAttribute("loggedInUser")==null){
            return new ResponseEntity(HttpStatus.UNAUTHORIZED);
        }
        List<Product> products= service.getAll();
        return new ResponseEntity(products,HttpStatus.OK);
    }

我可以登录并且用户保存在会话中。但是,当我注销时,我仍然可以访问我的产品页面,这意味着该会话没有被清除。

create-react-app如果这很重要,我正在使用端口上的前端创建 react 应用程序,localhost:3000并且我的服务器处于打开状态localhost:8080

标签: javaspringspring-bootspring-mvcsession

解决方案


WebSecurityConfigurerAdapter在配置类(实现)中使用 spring 安全约束和注销配置:

@Configuration
@EnableWebSecurity
public class SecurityConfig extends WebSecurityConfigurerAdapter {

    .
    ...
    ...
    @Override
    protected void configure(HttpSecurity http) throws Exception {
         http
          .csrf().disable()
          .authorizeRequests()
          .antMatchers("/login*").permitAll()
          .anyRequest().authenticated()  
          .anyRequest().authenticated()
          ....
          .
          .
          .and()
          .logout()
          .invalidateHttpSession(true)
          .deleteCookies("JSESSIONID")

    }
    ...
    ...
    ...    
}

推荐阅读