问题1
当用户尝试访问他/她没有角色的受限文件时,会将HTTP-403返回给用户。
当尝试使用相同的链接(BASIC身份验证)重新登录以键入不同的凭据时,会记住失败的登录尝试并直接转到HTTP-403,而不需要用户名/密码。
问题2
当用户成功登录并终止他/她的会话时,再次单击登录按钮,他们不会被要求输入他们的登录凭据,因为他们之前的登录“会话”被记住了。
为了尝试修复此行为,我尝试了不同的解决方案,但没有运气
解决方案1
调用.invalidate()
对象
request.getSession(false)
方法
解决方案2
通过针对请求
上的所有* .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?
解决方案3
在/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,在登录测试前清除了我的测试浏览器并尝试了私有浏览器窗口。
重定向回登录错误
当我收到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外观对话框。它将身份验证信息存储在客户端,并在每个后续请求中作为请求标头发送
答案 0 :(得分:0)
我认为过滤器可以解决这个问题,如果用户没有角色,重定向到登录页面,否则他/她可以访问服务器中的资源