我正在尝试在不利用cookie的情况下管理Spring Security中的会话.原因是 - 我们的应用程序显示在另一个域的iframe中,我们需要在我们的应用程序中管理会话,并且Safari限制跨域cookie的创建.(上下文:domainA.com在iframe中显示domainB.com.domainB.com正在设置一个JSESSIONID cookie以在domainB.com上使用,但由于用户的浏览器显示domainA.com - Safari限制domainB.com创建cookie) .
我能想到的唯一方法(针对OWASP安全建议) - 将URL中的JSESSIONID作为GET参数包含在内.我不想这样做,但我想不出另一种选择.
所以这个问题都是关于:
回顾Spring的文档,使用enableSessionUrlRewriting应该允许这样做
所以我做到了这一点:
@Override
protected void configure(HttpSecurity http) throws Exception {
http
.sessionManagement()
.sessionCreationPolicy(SessionCreationPolicy.ALWAYS)
.enableSessionUrlRewriting(true)
Run Code Online (Sandbox Code Playgroud)
这没有将JSESSIONID添加到URL,但现在应该允许它.然后我利用此问题中的一些代码将"跟踪模式"设置为URL
@SpringBootApplication
public class MyApplication extends SpringBootServletInitializer {
@Override
public void onStartup(ServletContext servletContext) throws ServletException {
super.onStartup(servletContext);
servletContext
.setSessionTrackingModes(
Collections.singleton(SessionTrackingMode.URL)
);
Run Code Online (Sandbox Code Playgroud)
即使在此之后 - 应用程序仍然将JSESSIONID添加为cookie而不是URL.
有人可以帮助我指出正确的方向吗?
在我的例子中,我有一个id为"foo1Closed"的div.当我点击"foo1Closed"时,我希望在div中更改许多元素(例如高度,宽度,颜色,可见性等).
我完成此操作的一种方法是为.css文件中的每个元素编写两种样式.例如,"foo1Closed"的一种样式和"foo1Opened"的一种样式.喜欢:
#foo1Closed {
visibility:hidden;
}
#foo1Opened {
visibility:visible;
}
Run Code Online (Sandbox Code Playgroud)
然后我使用JavaScript函数来更改这些ID,例如:
document.getElementById("foo1Opened").id = "foo1Closed";
Run Code Online (Sandbox Code Playgroud)
由于我不知道这种方法的潜在缺点,我希望有人可以回答,如果这是一种"好的"方式来实现这种交互性,或者我应该直接通过JavaScript修改样式,如下所示:
document.getElementById("foo1Opened").style.visibility = "hidden";
Run Code Online (Sandbox Code Playgroud)
显然,一个解决方案将有更多的CSS代码,一个将有更多的JavaScript代码.我不知道的是,哪一个更有效(就项目的性能和/或建模而言).
重新提出的问题:由于ID用于标识特定对象(意味着它们通常不应被更改),是否有不同的方法可以在不编辑ID的情况下实现此目的,而且还不依赖于通过JavaScript手动更改每个元素?