如何使用Spring Web Mvc实现Logout功能

时间:2009-11-18 10:46:25

标签: java spring spring-mvc

我是Spring Web MVC的新手..

我可以获得一些示例或在线链接,向我展示如何使用spring web mvc实现注销功能吗?

我不想使用Spring安全性的内置功能(即ACEGI)..

提前致谢...

3 个答案:

答案 0 :(得分:14)

会话失效的诀窍不起作用。似乎Spring身份验证会在某处缓冲会话ID,并且如果会话无效,则会接受COOKIE。

另一种解决方案是手动清除Spring安全上下文:

public void manualLogout() {
    SecurityContextHolder.getContext().setAuthentication(null);
}

以下是代码,如何手动登录用户(如果有人需要):

public void doManualLogin(HttpServletRequest request, String u, String p) {
    UsernamePasswordAuthenticationToken token = 
            new UsernamePasswordAuthenticationToken(u, p);
    token.setDetails(new WebAuthenticationDetails(request));
    Authentication auth = authenticationProvider.authenticate(token);
    SecurityContextHolder.getContext().setAuthentication(auth);
}

其中authenticationProvider是来自spring spring配置的bean,它实现了

org.springframework.security.authentication.AuthenticationProvider

答案 1 :(得分:9)

您只需要使会话无效并且用户已注销。 servlet api:HttpSession.invalidate()直接支持这一点。您可以编写一个仅调用invalidate的控制器。

class Logout implements Controller{
 public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response){
   ModelAndView view = //?;
   request.getSession().invalidate();
   return view;
 }      
}

答案 2 :(得分:2)

@Controller
    public class LogoutController {

        @RequestMapping(value="/logout",method = RequestMethod.GET)
        public String logout(HttpServletRequest request){
            HttpSession httpSession = request.getSession();
            httpSession.invalidate();
            return "redirect:/";
        }

    }

请使用上面的代码实现注销过滤器