思路:
1.shiro有许多过滤器,其中就有一个LogoutFilter的过滤器,只需要继承并重写preHandle方法
2.在配置文件中注入自定义实现的过滤器,在此配置当退出的时候应重定向到某个页面
3.注入自定义filter,并且配置过滤器链
4.直接在页面中配置相应退出链接
1.自定义实现LogoutFilter
@Service
public class SystemLogoutFilter extends LogoutFilter {
@Override
protected boolean preHandle(ServletRequest request, ServletResponse response) throws Exception {
//在这里执行退出系统前需要清空的数据
Subject subject=getSubject(request,response);
String redirectUrl=getRedirectUrl(request,response,subject);
ServletContext context= request.getServletContext();
try {
subject.logout();
context.removeAttribute("error");
}catch (SessionException e){
e.printStackTrace();
}
issueRedirect(request,response,redirectUrl);
return false;
}
}
2.配置要重定向的路径
<!--自定义LogoutFilter,退出-->
<bean id="logoutFilter" class="filter.SystemLogoutFilter">
<property name="redirectUrl" value="/admin/login"/>
</bean>
第三步:
<!--自定义的filter-->
<property name="filters">
<map>
<!-- 将自定义 的FormAuthenticationFilter注入shiroFilter中 -->
<entry key="authc" value-ref="formAuthenticationFilter"/>
<entry key="logout" value-ref="logoutFilter"/>
</map>
</property>
<!-- 过虑器链定义,从上向下顺序执行,一般将/**放在最下边 -->
<property name="filterChainDefinitions">
<value>
<!--对静态资源设置匿名访问-->
/resources/images/**=anon
/resources/style/**=anon
/resources/bootstrap/**=anon
/resources/fonts/**=anon
/resources/jquery/**=anon
/resources/layui/**=anon
/resources/js/**=anon
/favicon.ico=anon
/front/**=anon
<!--/kaptcha**=anon-->
/admin/**=authc
<!-- 请求logout.action地址,shiro去清除session -->
/logout=logout //这才是对退出的配置
<!-- /**=authc 表示所有的url都必须认证通过才可以访问-->
/**=anon
</value>
</property>
4.:直接在页面相应的退出操作中配置链接:/logout 即可,并不需要实现controller层