用户退出登录实质是使当前登录用户的session失效的操作。一般来说,用户退出后,将会被重定向到站点的非安全保护页,比如登录页面.
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jstl/core"%>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>title>
head>
<body>
<c:url value="/logout" var="logoutUrl"/>
<a href="${logoutUrl }">退出系统a>
body>
html>
<%@include file="header.jsp" %>
...
...
...
spring-security.xml
...
...
"true" use-expressions="true">
"/*" access="hasRole('ROLE_USER')" />
"/loginPage" login-processing-url="/login"
always-use-default-target="true" default-target-url="/welcome"
authentication-failure-url="/loginPage?error=error" />
"/logout" logout-success-url="/loginPage" invalidate-session="true"/>
"true" />
...
...
现在我们启动项目,登录成功后可以看到如下页面
点击退出登录,会返回到登录页面。
这里需要注意的一点是,spring security 3.x默认的注销拦截url为/j_spring_security_logout,而4.x则默认使用/logout
spring security实现注销功能涉及的三个核心类为LogoutFilter,LogoutHandler,LogoutSuccessHandler
LoginFilter是实现注销功能的过滤器,默认拦截/logout或者logout属性logout-url指定的url
LogoutHandler接口定义了退出登录操作的方法
void logout(HttpServletRequest request, HttpServletResponse response,
Authentication authentication);
LogoutSuccessHandler接口定义了注销之后的操作方法
void onLogoutSuccess(HttpServletRequest request, HttpServletResponse response,
Authentication authentication) throws IOException, ServletException;
它们之间的类结构图:
spring security在实现注销功能时,大致流程如下
1. 使得HTTP session失效(如果invalidate-session属性被设置为true);
2. 清除SecurityContex(真正使得用户退出)
3. 将页面重定向至logout-success-url指明的URL。
源码下载地址https://github.com/SmallBadFish/spring_security_demo/archive/0.2.0-logout.zip