问题一
当用户试图访问他/她无权访问的受限文件时,将向用户返回 HTTP-403。
当尝试使用相同的链接(BASIC 身份验证)重新登录以键入不同的凭据时,失败的登录尝试将被记住并直接转到 HTTP-403,而不询问用户名/密码。
问题2
当用户成功登录并终止他/她的 session 时,再次单击登录按钮他们不会被要求输入他们的登录凭据,因为他们之前的登录“ session ”被记住了。
为了尝试修复这种行为,我尝试了不同的解决方案,但都没有成功
解决方案一
在request.getSession(false)
对象上调用.invalidate()
方法
方案二
通过对请求中所有 *.jsp 页面的过滤器禁用浏览器缓存
httpResponse.setHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1
httpResponse.setHeader("Pragma", "no-cache"); // HTTP 1.0
httpResponse.setDateHeader("Expires", 0); // Proxies
我在这里找到的
Add an Expires or a Cache-Control header in JSP
How to control web page caching, across all browsers?
方案三
在/META-INF/context.xml 中禁用 Tomcat 8 缓存
antiJARLocking="true"
antiResourceLocking="true"
cachingAllowed="false"
cacheMaxSize ="0"
cacheTTL="1"
reloadable="false"
在这里找到
how to disable tomcat caching?
取消部署、重新部署项目并重新启动 Tomcat。
对于我尝试过的一切,我都禁用了浏览器缓存,例如解决方案 2,在登录测试之前清除了我的测试浏览器,并尝试了私有(private)浏览器窗口。
错误时重定向回登录
当我收到 HTTP-403 错误时,我通过 web.xml 调用一个 servlet,将用户发送回首页(登录链接所在的位置)
<error-page>
<error-code>403</error-code>
<location>/Http403</location>
</error-page>
通过 response.sendRedirect(url)
而不是转发,以强制浏览器为首页/欢迎页面创建一个“全新”的 HTTP-GET。我在某处读到这是这样做的方法,但如果这有任何优势,则不是 100%,如果有人知道,请告诉我。
发现问题
来自 Basic Authentication : Is it possible to setRemoteUser like getRemoteUser()
BASIC 身份验证是完全不同的东西。它显示了一个带有用户名/密码输入的裸 JavaScript 类似对话框。它将身份验证信息存储在客户端,这些信息作为每个后续请求的请求 header 发送
最佳答案
我认为过滤器可以解决这个问题,如果用户没有角色,重定向到登录页面,否则他/她可以访问服务器中的资源
关于JSP,Tomcat 8 BASIC 登录/失败尝试一直存在,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44458530/