- ubuntu12.04环境下使用kvm ioctl接口实现最简单的虚拟机
- Ubuntu 通过无线网络安装Ubuntu Server启动系统后连接无线网络的方法
- 在Ubuntu上搭建网桥的方法
- ubuntu 虚拟机上网方式及相关配置详解
CFSDN坚持开源创造价值,我们致力于搭建一个资源共享平台,让每一个IT人在这里找到属于你的精彩世界.
这篇CFSDN的博客文章浅谈cookie和session(小结)由作者收集整理,如果你对这篇文章有兴趣,记得点赞哟.
cookie和session在java web开发中扮演了十分重要的作用,本篇文章对其中的重要知识点做一些探究和总结.
1.cookie存在于浏览器 。
随意打开一个网址,用火狐的调试工具,随意选取一个链接,查看其请求头。你就会看到cookie的信息。如下图所示.
如上图所示,我们访问了新浪网,通过火狐浏览器的调试窗口可以看到cookie存在于请求头也就是httprequest中,并且是以键值对(数组)的形式存在.
只要有请求,就会在请求头携带一个cookie的数组(键值对)。cookie是浏览器层面的东西.
2.java中获取cookie 。
事实上,在java的servlet体系里,我们可以通过如下方式获取cookie. 。
1
2
3
4
5
6
|
httpservletrequest req=servletactioncontext.getrequest();
cookie[] cookies=req.getcookies();
for
(
int
i=
0
;i<cookies.length;i++){
cookie cookie=cookies[i];
system.out.println(
"name:"
+cookie.getname()+
",domain"
+cookie.getdomain()+
",value:"
+cookie.getvalue()+
",maxage:"
+cookie.getmaxage());
}
|
可以看到,在servlet体系中,把cookie作为一个属性放到了httprequest对象里面。通过getcookies()方法得到一个cookie数组.
我们在一个action中加入上述代码,并且访问这个action,则可以看到控制台打印出如下信息.
servlet对cookie进行了封装,cookie对象有几个属性,如name,domain,value,maxage等,具体的意义可以参考servlet的api文档.
以上的请求的cookie是我首次访问某一个网站的链接时候产生的。可以看到cookie数组中只有一个元素。这边先注意一下,后续会有更进一步的说明.
3.java中向cookie中添加元素 。
说了获取cookie数组和cookie,我们一定也想知道如何把我们自己的一些信息放进cookie,其实很简单。http的一次请求总是伴随着一次响应,我们就将cookie信息放入到响应中,传递给浏览器。在java下代码是这样写的.
1
2
3
|
httpservletresponse res=servletactioncontext.getresponse();
cookie cookie=
new
cookie(
"xdx"
,
"i'm xdx"
);
res.addcookie(cookie);
|
可以看到当我们发起这个请求时,在响应头有下列信息.
也就是通过这次请求,我们把xdx=i'm xdx 这个cookie通过response放进了浏览器.
当我们再次访问该网站上的其他页面的时候,在请求头都将带有这个cookie。如下图所示.
而假如我们清除历史记录,包括cookie.
再次访问该网站的某一个地址。刚才我们加进去的cookie就不存在了.
总结来说就是:servlet通过response将cookie放入到cookie数组中,这样浏览器端就会拥有这一个cookie信息。浏览器会在以后的请求过程中把这个cookie信息放在请求头.
4.session是什么 。
session我们一般指的是httpsession,为了理解它,我们直接打开httpsession的源码来一看究竟.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
|
/**
*
* provides a way to identify a user across more than one page
* request or visit to a web site and to store information about that user.
*
* <p>the servlet container uses
this
interface
to create a session
* between an http client and an http server. the session persists
*
for
a specified time period, across more than one connection or
* page request from the user. a session usually corresponds to one
* user, who may visit a site many times. the server can maintain a
* session in many ways such as using cookies or rewriting urls.
*
* <p>
this
interface
allows servlets to
* <ul>
* <li>view and manipulate information about a session, such as
* the session identifier, creation time, and last accessed time
* <li>bind objects to sessions, allowing user information to persist
* across multiple user connections
* </ul>
*
* <p>when an application stores an object in or removes an object from a
* session, the session checks whether the object
implements
* {
@link
httpsessionbindinglistener}.
if
it does,
* the servlet notifies the object that it has been bound to or unbound
* from the session. notifications are sent after the binding methods complete.
*
for
session that are invalidated or expire, notifications are sent after
* the session has been invalidated or expired.
*
* <p> when container migrates a session between vms in a distributed container
* setting, all session attributes implementing the {
@link
httpsessionactivationlistener}
*
interface
are notified.
*
* <p>a servlet should be able to handle cases in which
* the client does not choose to join a session, such as when cookies are
* intentionally turned off. until the client joins the session,
* <code>isnew</code> returns <code>
true
</code>.
if
the client chooses
* not to join
* the session, <code>getsession</code> will
return
a different session
* on each request, and <code>isnew</code> will always
return
* <code>
true
</code>.
*
* <p>session information is scoped only to the current web application
* (<code>servletcontext</code>), so information stored in one context
* will not be directly visible in another.
*
*
@author
various
*
*
@see
httpsessionbindinglistener
*
@see
httpsessioncontext
|
简单的翻译一下:
--提供一个在多页面请求切换的情况下用于验证、存储用户信息的手段.
--servlet容器使用httpsession来创建连接客户端和服务端的一个会话(session)。这个会话能持续一段指定的时间(也就是我们常说的session过期时间),该会话能在多个请求之间共享.
--这个会话一般跟用户信息关联,由于这个用户可能多次访问网站,所以我们把他们存储在这个会话(也就是httpsession)里.
--服务端通常是通过cookies或者rewriting urls来保持一个session.
我的理解,session是一种持久的会话,它的存在主要是为了克服http无状态的特点,关于http无状态,或者说没有记忆,这里不多阐述,涉及到计算机网络的知识,简单来说就是http一次请求对应一次响应,在这个过程中会携带一些信息,但这些信息也仅仅在这个过程中有效。当一个请求结束,我们进入下一个请求的时候,上一个请求里面的信息对当前的请求就没什么意义了,因为当前的请求根本不会知道上一个请求里面所包含的信息.
那么当我们需要一些在各个请求都能公用的信息的时候,该怎么办呢?有很多办法,可以把信息存在数据库,然后每次从数据库去取出来,当然io存取会浪费很多时间,它仅仅针对大数据量。还有一种就是将这些信息存在内存当中。没错session其实就是这样一种对象,他把项目当中一些常用的信息存在内存当中,这些常用的信息通常是跟用户相关的,比如用户名,用户昵称,用户角色等。因为他们需要经常用到,所以把这些信息存在session中进行管理再好不过了.
5.如何获取一个session 。
在servlet体系里,我们可以用如下代码来获取session.
1
2
3
|
httpservletrequest request = servletactioncontext.getrequest();
httpsession httpsession=request.getsession();
system.out.println(httpsession);
|
我们来查阅httpservletrequest的源码,看看其getsession()方法.
1
2
3
4
5
6
7
8
9
10
11
12
13
|
/**
*
* returns the current session associated with this request,
* or if the request does not have a session, creates one.
*
* @return the <code>httpsession</code> associated
* with this request
*
* @see #getsession(boolean)
*
*/
public
httpsession getsession();
|
它的解释是返回当前与request关联的session,如果这个请求不存在session,就新建一个.
我们在两个请求中加入上述代码并运行,得到如下结果.
。
可以看到在整个项目内,这个session被共享着调用.
6.session和cookie到底有什么关系呢?
简单点说,每一个session对象都有一个sessionid,而在cookie数组中,又一个元素叫做jsessionid,服务器将session对象的sessionid,以名称叫做jsessionid,值为sessionid的形式存入cookie数组中,这样cookie和session就发生了关联.
上面的描述可以用下图来表示.
上述的过程可以用类似如下的代码来实现.
1
2
3
4
|
httpservletrequest req=servletactioncontext.getrequest();
httpservletresponse res=servletactioncontext.getresponse();
cookie cookie=
new
cookie(
"jsessionid"
, req.getsession().getid());
res.addcookie(cookie);
|
只不过我们并不需要写这个代码,servlet自动帮我们完成了如上的操作.
7.具体过程 。
具体的过程是这样的:
(1)当我们首次在某个请求中通过调用request.getsession去获取session的时候(这个调用不一定是显式的,很多框架把session封装成map等其他的类型,名称也不一定是session,但是本质都是在调用session),首先servlet通过getcookie的到本次请求的cookie信息,然后去寻找cookie数组中是否有否有一个名为jsessionid的cookie,没有的话就创建一个session,并且把sessionid做为jsessionid这个cookie的值,然后调用addcookie()方法把该cookie放入cookie数组.
(2)如果上一步中从cookie数组中取到的cookie数组已经包含了jsessionid这个cookie,这时候我我们取出jsessionid的值,然后去内存中的session(内存中有很多session)去寻找对应的sessionid为jsessionid的值的session,如果找得到的话,就使用这个session,找不到的话,就新建一个session,并且同样的调用addcookie()方法覆盖掉原来的jsessionid这个cookie的值.
上述的过程可以用类似如下的代码来表示.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
|
httpservletrequest req=servletactioncontext.getrequest();
//具体获取request的情况可能有所不同
httpsession session;
cookie jsessionid=
null
;
cookie[] cookies=req.getcookies();
for
(
int
i=
0
;i<cookies.length;i++){
cookie cookie=cookies[i];
if
(cookie.getname().equals(
"jsessionid"
)){
jsessionid=cookie;
}
}
if
(jsessionid==
null
){
session= createsession();
//创建一个session
}
else
{
session=findsessionbysessionid(jsessionid.getvalue());
//通过sessionid获取session
if
(session==
null
){
session= createsession();
//创建一个session
}
httpservletrequest req=servletactioncontext.getresponse();
//具体情况可能有所不同
cookie cookie=
new
cookie(
"jsessionid"
, session.getid());
res.addcookie(cookie);
|
我们将浏览器缓存清除,这样cookie中就没有jsessionid了,然后我们访问一个action。如下.
8.当我们清空浏览器的时候,session会消失吗?
这个问题包含着一些陷阱。因为很多时候当我们清空浏览器以后,确实需要重新登录系统才可以操作,所以很多人自然而然认为清空浏览器缓存(包含cookie)以后。session就会消失.
其实这种结论是错误的。要知道,session是存在于服务器的,你清除浏览器缓存,只是清除了cookie,跟session一点关系都没有。那么为什么我们却不能访问网站,而需要重新登录了呢?
一般的web项目会通过session来判断用户是否有登录,常用的判断语句是if(session.get("userid")==null。如果为空,则表示需要重新登录。这时候其实隐式地调用了getsession()方法,这就回到了上一步我们所讲的session获取的具体步骤了.
因为清空了浏览器缓存,这时候cookie数组中必定不会有jsessionid这个cookie,所以必须得新建一个session,用新的sessionid来给jsessionid这个cookie赋值。由于是新建的session,session中必定没有userid这样的属性值,所以判断结果自然为空,所以需要重新登录。这次赋值以后,下一次再请求该网站的时候,由于cookie数组中已经有了jsessionid这个cookie,并且能通过该jsessionid的值找到相应的session,所以就不需要再重新登录了.
9.讨论几种极端情况 。
第一种:当项目正常运行,我们清空浏览器,cookie和session会发生什么变化.
因为清空了浏览器,所以不会存在jsessionid这个cookie,servlet无法找到对应的session,所以他会新建一个session,然后在本次请求的响应中将sessionid传入cookie中.
下一次请求,cookie数组中就带有jsessionid这个cookie了,servlet就可以找到对应的session,沿用即可.
第二种:浏览器正常,项目重启(可停止tomcat来模拟这种情况),cookie和session会发生什么变化.
因为项目重启,内存中的一切session都消失了,虽然访问一个action,请求头中有jsessionid这个cookie,但是通过它的值(sessionid)并不能找到session(因为根本没有任何session),所以还是得重新创建一个session,并且这个session的sessionid跟当前cookie数组中的jsessionid的值不一样,所以它会将新的sessionid覆盖掉cookie数组中原来的jsessionid,并且由于此时的session是崭新的,所以他不可能有userid这样的属性值,所以在拦截的时候依然会被截获,因此也是需要重新登录的.
有兴趣的同学可以去试验一下.
10.session的时限 。
可以通过setmaxinactiveinterval()方法来设置session的时限,比如可以设为半个小时。这个时间指的是session不活跃开始计算的时间。超过这个时间,session就失效了。此时若再getsession(),则会创建一个新的session,并且其sessionid为此时浏览器中jsessionid的值.
有三种方式来设置session的时限:
--通过在web容器中设置(以tomcat为例),在tomcat-7.0\conf\web.xml中设置,以下是tomcat7.0中默认配置:
1
2
3
|
<session-config>
<session-timeout>
30
</session-timeout>
</session-config>
|
--通过web项目的web.xml文件来设置。设置15分钟失效.
1
2
3
|
<session-config>
<session-timeout>
15
</session-timeout>
</session-config>
|
--直接在代码中设置 。
1
|
session.setmaxinactiveinterval(
30
*
60
);
//以秒为单位,即在没有活动30分钟后,session将失效
|
上述三种方法的优先级:1<2<3. 。
我们来做个试验,在web.xml中设置session的过期时间为1分钟,然后观察session和cookie的变化.
第一次访问:
过了一分钟后,再次访问 。
发现还是没变,但马上再次访问.
结合我们之前所说的session和cookie的作用过程来解释一下:第二次访问的时候,因为过了一分钟,超过了session的过期时间,所以此时虽然cookie中还是原来的sessionid(这也是为什么第二次与第一次的请求头中sessionid相同的原因),但是通过此sessionid是无法再找到那个已经失效的session,所以服务端必须重新创建一个session,并且把新的sessionid放到cookie中,覆盖掉原来旧的。所以当我们马上再次访问的时候,这一次就是新的cookie了.
ps:其实这个过程跟服务端暂停服务的效果是一样的,只不过服务端暂停服务影响的是内存中的所有session,而session过期只是影响当前过期的这个session.
pss:cookie过期与session过期类似,只不过是发生在客户端,大家可以依照前面讲的作用过程试着推导cookie过期会发生什么事情.
psss:如果用了redis等内存数据库来管理session,那么设置过期时间将不起作用.
12.非浏览器平台使用session 。
cookie依赖于浏览器,session依赖于服务器。如果项目不在浏览器上面运行,那么cookie也就无用武之地,但是我们还是想要使用session。不巧的是,session依赖cookie进行管理,这时候要怎么办呢?
举个很常见的场景,我们想要在安卓,或者ios、或者微信小程序等非浏览器的项目中使用session。这时候这些客户端不会自动帮我们做管理cookie的工作。那么这时候我们需要自己来做.
前面讲到过,servlet底层帮我们自动使用cookie来管理session,大体过程是:从cookie中找寻sessionid,根据sessionid去找session,找到合适的就用,找不到的话就新建一个,并且用新的sessionid覆盖掉cookie中旧的.
而现在需要明白两点:
(1)我们没有浏览器了,所以不会在http的请求头中携带cookie信息,servlet后台收不到cookie信息,自然找不到jessionid,所以他会在每次请求都创建一个新的session,这对于服务端来说,是一笔严重的性能开销.
(2)因为没有浏览器了,servlet在更新完sessionid以后,不会自动执行set-cookie操作将新的sessionid去覆盖旧的cookie中的jessionid的值.
根据以上两点,我我们需要做如下几件事情.
(1):模拟http请求的时候在请求头中带上cookie,在cookie中塞入从jessionid。这样服务端就可以取到jessionid,从而获取sessionid,进行比对来获取session; 。
(2),在响应给客户端的时候,手动调用set-cookie方法将本次的sessionid放入jessionid中,这样客户端就可以得到最新的jessionid.
(3):然后客户端需要维护一个cookie的静态变量(或者用其他方法,总之就是维护一个cookie的内存变量)。将服务端响应回来的jessionid的值存在这个变量里面。作为下次请求的时候放入请求头.
(4):我们同样可以在服务端写一个拦截器,客户端的每个请求都必须先经过拦截器,这样就可以通过session来判断用户是否处于登录状态了。这个过程与在浏览器平台毫无二致.
下面我们来实现上面的功能.
由于本人不会写安卓和ios的代码,所以以一个客户端程序来模拟安卓端.
首先,定义一个静态变量用于存储jessionid.初始值为空.
1
|
public
static
string j_sessionid=
""
;
|
接下来我们编写模拟http请求的类,需要在这个类中的请求头中加入cookie,并且在响应的时候得到响应头中的cookie.具体代码如下.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
|
public
static
string http4cookie(string url, string param,string jsessionid) {
string result =
""
;
bufferedreader in =
null
;
try
{
string urlnamestring = url +
"?"
+ param;
url realurl =
new
url(urlnamestring);
// 打开和url之间的连接
httpurlconnection connection = (httpurlconnection) realurl
.openconnection();
// 设置通用的请求属性
connection.setrequestproperty(
"accept"
,
"*/*"
);
connection.setrequestproperty(
"connection"
,
"keep-alive"
);
connection.setrequestproperty(
"user-agent"
,
"mozilla/4.0 (compatible; msie 6.0; windows nt 5.1;sv1)"
);
connection.setrequestproperty(
"cookie"
,
"jsessionid="
+jsessionid);
//请求头中加入jessionid
// 建立实际的连接
connection.connect();
// 获取所有响应头字段
map<string, list<string>> map = connection.getheaderfields();
// 遍历所有的响应头字段,获取响应头中的jessionid信息
for
(string key : map.keyset()) {
// system.out.println(key + "--->" + map.get(key));
if
(
"set-cookie"
.equals(key)){
string setcookie=map.get(key).tostring();
string newjessionid=setcookie.substring(
12
,setcookie.lastindexof(
"]"
));
j_sessionid=newjessionid;
// 维护新的j_sessionid
system.out.println(setcookie.substring(
12
,setcookie.lastindexof(
"]"
)));
}
}
// 定义 bufferedreader输入流来读取url的响应
in =
new
bufferedreader(
new
inputstreamreader(
connection.getinputstream(),
"utf-8"
));
string line;
while
((line = in.readline()) !=
null
) {
result += line;
}
}
catch
(exception e) {
system.out.println(
"发送get请求出现异常!"
+ e);
e.printstacktrace();
}
// 使用finally块来关闭输入流
finally
{
try
{
if
(in !=
null
) {
in.close();
}
}
catch
(exception e2) {
e2.printstacktrace();
}
}
return
result;
}
|
然后我们在服务端写一个action让客户端来模拟请求.
1
2
3
4
5
6
7
8
9
10
11
|
@responsebody
@requestmapping
(
"httpcookietest"
)
public
string httptest(httpservletrequest req,httpservletresponse res) {
cookie[]cookies=req.getcookies();
for
(cookie cookie:cookies){
if
(cookie.getname().equals(
"jsessionid"
));
system.out.println(cookie.getvalue());
}
outputmsg.outputmsg(res, req,
"httpcookietest"
);
return
null
;
}
|
特别注意这里的outputmsg,它的代码如下.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
|
public
static
void
outputmsg(httpservletresponse response,httpservletrequest request,string msg) {
response.setcharacterencoding(
"utf-8"
);
string sessionid = request.getsession().getid();
response.setcontenttype(
"text/html; charset=utf-8"
);
response.setheader(
"set-cookie"
,
"jsessionid="
+ sessionid);
printwriter writer =
null
;
try
{
writer = response.getwriter();
writer.print(msg);
writer.flush();
}
catch
(ioexception e) {
e.printstacktrace();
}
finally
{
if
(writer !=
null
)
writer.close();
}
}
|
注意到第4和第5行代码,这两行代码往响应头中加入了此时的sessionid,作为jsessionid的值,放入到cookie中。这样客户端才能从响应头中获取最新的jsessionid,以更新静态变量j_sessionid的值,对应http4cookie中的代码.
然后我们来看看客户端的主函数.
1
2
3
|
public
static
void
main(string args[]){
httputil.http4cookie(
"http://192.168.1.185:8080/warrior/httpcookietest"
,
"1=1"
,j_sessionid);
}
|
这样以后,其实这个过程已经跟浏览器的cookie运作机制并无二致了.
最后,我们在写一个拦截器,对所有客户端请求进行拦截。客户端每次请求之间都率先访问这个拦截器.
1
2
3
4
5
6
7
8
9
|
@responsebody
@requestmapping
(
"otherplatformintercept"
)
public
string otherplatformintercept(httpservletrequest req){
httpsession httpsession=req.getsession();
if
(httpsession.getattribute(
"userid"
)!=
null
){
return
"valid"
;
}
return
"invalid"
;
}
|
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我.
原文链接:http://www.xdxxdxxdx.com/article/31 。
最后此篇关于浅谈cookie和session(小结)的文章就讲到这里了,如果你想了解更多关于浅谈cookie和session(小结)的内容请搜索CFSDN的文章或继续浏览相关文章,希望大家以后支持我的博客! 。
是否为每个 Shiny session 分配了 session ID/ session key (如果部署在 Shiny 服务器上)?如果是,我如何访问该信息?我已阅读文档here然而上网查了一下,并
我正在使用 this koajs session 模块。 我检查了源代码,但我真的无法理解。 我想知道它保存 session 数据的位置,因为我没有看到创建的文件,并且当服务器重新启动时, sessi
实现高可扩展性的一种方法是使用网络负载平衡在多个服务器之间分配处理负载。 这种方法提出的一个挑战是服务器是否具有状态意识 - 将用户状态存储在“ session ”中。 此问题的一个解决方案是“粘性
在负载平衡服务器的上下文中, session 亲和性和粘性 session 之间有什么区别? 最佳答案 我见过这些术语可以互换使用,但有不同的实现方式: 在第一个响应中发送 cookie,然后在后续响
我希望其他人向我解释哪种方法更好:使用 session 或设计无 session 。我们正在开始开发一个新的 Web 应用程序,但尚未决定要遵循什么路径。 无 session 设计在我看来更可取: 优
现在用户在他的权限中有很多角色,我将允许他点击 href 并在新窗口中扮演另一个角色。每个角色都有自己的 session 。 既然浏览器打开窗口不能用新 session 打开,我必须在服务器端想办法。
我正在尝试为express.js Node 应用程序实现 session 存储我的问题是: 如何删除具有浏览器 session 生命周期的 cookie(根据连接文档标记有 expires = fal
在开始在 golang 中使用 session 之前,我需要回答一些问题 session 示例 import "github.com/gorilla/sessions" var store = ses
我读过 Namespaced Attributes . 我尝试使用此功能: #src/Controller/CartController.php public function addProduct(
我正在努力完成以下工作: 根据用户的类型更改用户的 session cookie 到期日期。 我有一个 CakePHP Web 应用程序,其中我使用 CakePHP session 创建了我的身份验证
这是我在这里的第一个问题,我希望我做对了。 我需要处理一个 Java EE 项目,所以在开始之前,我会尝试做一些简单的事情,看看我是否能做到。 我坚持使用有状态 session Bean。 这是问题:
ColdFusion session 与 J2EE session 相比有什么优势吗? ColdFusion session documentation提到了 J2EE session 的优点,但没有
在执行任何任务之前,我需要准确地在创建 session 时创建一个 session 范围变量(因为我的所有任务都需要一个初始 session 范围变量才能运行)。因为,创建 session 时,gra
我们当前的应用使用 HTTP session ,我们希望将其替换为 JWT。 该设置仅允许每个用户进行一次 session 。这意味着: 用户在设备 1 上登录 用户已在设备 1 上登录(已创建新 s
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
假设我在两个或更多设备上打开了两个或更多用户 session (同一用户没有管理员权限)。 在当前 session 中,如果我注销,是否意味着所有其他 session 也会关闭?如果没有,有没有办法通
我正在评估在 tomcat 中使用带有 session 复制的粘性 session 的情况。根据我的初步评估,我认为如果我们启用 session 复制,那么在一个 tomcat 节点中启动的 sess
我开始使用 golang 和 Angular2 构建一个常规的网络应用程序,最重要的是我试图在 auth0.com 的帮助下保护我的登录.我从 here 下载快速入门代码并尝试运行代码,它运行了一段时
我在 Spring Controller 中有一个方法,它接受两个相同类型的参数其中一个来自 session ,另一个来自表单提交(UI)。 问题是在 Controller 方法中我的非 sessio
在我登录之前,我可以点击我的安全约束目录之外的任何内容。如果我尝试转到安全约束目录内的某个位置,它会将我重定向到表单登录页面。如您所料。 登录后,我可以继续我的业务,并访问我的安全约束内外的资源。
我是一名优秀的程序员,十分优秀!