Spring Security中的注销不起作用
Posted
技术标签:
【中文标题】Spring Security中的注销不起作用【英文标题】:Logout in Spring Security does not work 【发布时间】:2013-05-24 16:35:29 【问题描述】:我已经使用 Spring Security 创建了一个应用程序。在 Spring Security Context 文件中,我添加了以下代码:
<http auto-config="true">
<intercept-url pattern="/index.jsp" access="ROLE_ADMIN" />
<intercept-url pattern="/metrics.jsp#chart" access="ROLE_ADMIN" />
<intercept-url pattern="/metrics.jsp" access="ROLE_ADMIN" />
<intercept-url pattern="/j_spring_security_logout#chart" access="ROLE_ADMIN" />
<form-login login-page="/login.jsp" authentication-failure-url="/loginerror.jsp" default-target-url="/index.jsp" />
<logout logout-success-url="/login.jsp" invalidate-session="true" delete-cookies="JSESSIONID" />
</http>
在应用程序上下文文件中,我添加了以下代码:
<bean id="webContentInterceptor" class="org.springframework.web.servlet.mvc.WebContentInterceptor">
<property name="cacheSeconds" value="0" />
<property name="useExpiresHeader" value="true" />
<property name="useCacheControlHeader" value="true" />
<property name="useCacheControlNoStore" value="true" />
</bean>
在应用程序的页面中(我使用JSP),我为注销按钮添加了以下代码:
<a href="j_spring_security_logout" class="ui-btn-right">Logout</a>
好吧,当用户单击按钮时,他被重定向到登录页面,但是他仍然可以转到应用程序的其他页面,这不应该发生,有谁知道问题可能出在哪里?我错过了什么吗?提前致谢!
【问题讨论】:
不应该是<a href="/j_spring_security_logout"
而不是<a href="j_spring_security_logout"
吗?
@devnull,我们同时回答了:)。我已经在这里回答了类似的问题***.com/questions/16391219/…
伙计们,我添加了 / 符号:仍然是相同的行为
您是否检查过您没有查看缓存页面?您是否查看了调试日志以了解每个阶段发生了什么?
另外,您为什么要尝试为具有管理员访问权限的注销 URL 声明一个拦截 URL 模式?这将不起作用,因为 URL 片段(在 # 字符之后)对服务器不可见。
【参考方案1】:
使用
<a href="/j_spring_security_logout" class="ui-btn-right">Logout</a>
【讨论】:
【参考方案2】:在 Servlet-context 中写这个:
<mvc:interceptors>
<bean id="webContentInterceptor"class="org.springframework.web.servlet.mvc.WebContentInterceptor">
<property name="cacheSeconds" value="0"/>
<property name="useExpiresHeader" value="false"/>
<property name="useCacheControlHeader" value="true"/>
<property name="useCacheControlNoStore" value="true"/>
</bean>
</mvc:interceptors>
同理:
response.setHeader("pragma", "no-cache");
response.setHeader("Cache-control", "no-cache, no-store, must-revalidate");
response.setHeader("Expires", "0");
【讨论】:
以上是关于Spring Security中的注销不起作用的主要内容,如果未能解决你的问题,请参考以下文章
单次注销在 keycloak 和 spring security 中不起作用
Spring Security:注销不起作用 - “请求的资源不可用”
Spring Security Oauth2 removeAccessToken 不起作用
调用 j_spring_security_logout 不起作用
AspNet.Security.OpenIdConnect.Server 令牌吊销和注销不起作用
Spring security - 自定义 AuthenticationProvider 不起作用 - Java Config