- 浏览: 138589 次
- 性别:
- 来自: 重庆
文章分类
最新评论
-
酱油男js:
不错...学习了。
oracle sql 优化大全 -
浪子秋水:
网页编码就是那点事 -
shenghuorulan:
通俗易懂。好文章,直接想到的问题都提到了。
oracle 全文检索实践 -
飞儿9530:
lucene 3.0.1 学习
1,键入用户名、密码,单击“登入”按钮,登录请求发送到/JForum/jforum.page。请求类型为POST。
1.1由于采用了URL重写,因此有时后面会跟有jsessionid。即,/JForum/jforum.page;jsessionid=7222129E440E2DBEF098A2D26D9994E6
1.2该请求提交时,会发送5个参数,其中有两个是隐藏域。
(1)<input type="hidden" name="module" value="user" />
(2)<input type="hidden" name="action" value="validateLogin" />
(3)<input class="post" size="10" name="username" type="text"/>
(4)<input class="post" type="password" size="10" name="password" />
(5)<input class="text" type="checkbox" name="autologin" id="autologin"/>
2,服务器截获JForum/jforum.page请求;交给一个名为net.jforum.JForum的Servlet处理
3,名叫net.jforum.JForum的Servlet执行service()方法
3.1取得JForumExecutionContext对象
3.2创建WebRequestContext对象
(1)获取请求的方法类型并转换成大写(GET/POST),登录用例的请求类型是POST。
(2)获取请求的上下文路径,即/JForum。
(3)借助WebRequestContext类的extractRequestUri()方法,提取uri。在该方法中:
a.剔除原始uri中含有的上下文部分,即将/JForum/jforum.page;jsessionid=7222129E440E2DBEF098A2D26D9994E6中的/JForum剔除,余下/jforum.page;jsessionid=7222129E440E2DBEF098A2D26D9994E6
b.如果uri中含有jsessionid,则将其剔除。剔除后即是/jforum.page
(4)获取编码方式,即UTF-8。
(5)获取servlet截获的后缀名,即.page。
(6)判断是否是POST请求,isMultipart判断HTTP MIME类型是否以multipart/开头。登录用例是POST请求,而且HTTP MIME类型不是以multipart/开头。
注意:isMultipart变量的值用于保存原始请求的Content-Type的类型。JForum论坛在发一个帖子时,即使没有上传附件,提交的仅仅是普通文本字符,表单的 enctype属性值也被设置成MULTIPART/FORM-DATA,我们平时用表单提交数据时经常不设置enctype属性,那么它的默认值是application/x-www-form-urlencoded。只有当enctype属性值是application/x-www-form-urlencoded时,我们才能够在原始请求中通过request.getParameter("parameterName")的形式获取参数值,而当属性值是MULTIPART/FORM-DATA时,必须亲自获取输入流,从输入流中解析参数值,或者借助第三方的组件,JForum中使用的是apache的commons file upload组件。
(7)通过HTTP请求头"X-Requested-With",判断是否是AJAX请求,即异步请求。登录用例不是AJAX请求。
(8)设置HTTPRequest请求的字符编码为UTF-8。
(9)设置容器编码。
(10)收集请求中的参数,借助WebRequestContext类的addParameter()方法,将请求中的参数名与值存储到WebRequestContext类的query属性中。该属性是一个HashMap类型,键的类型是一个String,值的类型或者是一个ArrayList或者是一个String。
(11)判断参数列表中是否含有"module"参数与"action"参数。如果没有,则从uri中解析出这两个参数。
注意:有的请求中含有参数存储了"module"与"action"的值。比如,登录请求。有的请求中没有这样的参数,但是在uri中含有了"module"与"action"。比如,启动请求。
注意:"module"参数代表特定的Action类,"action"参数代表该Action类中某个特定的方法。
3.3创建WebResponseContext对象
3.4检查数据库状态。借助JForum类的checkDatabaseStatus()方法,检测isDatabaseUp标记观察数据库是否启动。在登录用例运行时,数据库已经启动。
3.5创建JForumContext类对象forumContext,该对象持有/JForum上下文路径、servlet截获的后缀名、WebRequestContext类的request对象、WebResponseContext类的response对象。
3.6将上述JForumContext类对象存储到JForumExecutionContext中,并更新到ThreadLocal。
3.7借助JForumExecutionContext类的getTemplateContext()方法获取FreeMarker的SimpleHash类对象context。
3.8借助ControllerUtils的refreshSession()方法刷新用户UserSession
注意:据推测,UserSession类起到将User类与HttpSession类建立联系的作用。
(1)借助SessionFacade的getUserSession()方法返回UserSession对象。这个方法的本质作用是通过当前HttpSession的id从缓存(即DefaultCacheEngine类的对象,该类中有一个Map属性cache,cache中又嵌套了若干个Map,其中一个Map里可以通过HttpSession的id取出UserSession类对象)中取出UserSession类对象。这个过程曲折得离奇:
a.通过JForumExecutionContext类,获取在3.5步骤中创建的JForumContext类对象。
b.通过JForumContext类对象获取存储其中的WebRequestContext类对象。
c.通过WebRequestContext类对象获取一个WebSessionContext类对象。WebSessionContext类实质上是HttpSession类的一个自定义外覆类,对当前请求HttpRequest的HttpSession对象进行了封装,通过WebSessionContext类提供的接口访问HttpSession类一些属性。
d.通过WebSessionContext类对象获取当前HttpSession的id。
e.通过SessionFacade的getUserSession(String sessionId)方法,在缓存中获取UserSession对象。
(2)通过JForumExecutionContext获取RequestContext对象
a.通过JForumExecutionContext类,获取在3.5步骤中创建的JForumContext类对象。
b.通过JForumContext类对象获取存储其中的WebRequestContext类对象。
(3)如果获取UserSession对象为空
a.创建UserSession对象
b.注册UserSession基本信息,包括当前HttpRequest访问本站的开始时间,最后访问时间,设置UserId(此时登录过程还未完成,因此先设置成匿名用户id,该id值为1)。
c.设置会话id
d.设置用户IP
e.借助SessionFacade类的makeUnlogged()方法清除登录StandardSessionContext中的logged属性
f.判断是否是机器人发送的登录请求,如果不是
f1.判断是否是单点登录,如果不是
f11.判断自动登录的验证标记是否为true。在登录用例中该标记是true,则调用ControllerUtils类的checkAutoLogin(UserSession userSession)方法对自动登录进行验证。在该方法中:
step1:通过调用三次ControllerUtils类的getCookieTemplate()方法获取名为jforumUserId、jforumUserHash、jforumAutoLogin的三个Cookie对象。在登录用例中,后两个Cookie对象为null。
step2:如果名为jforumUserHash的Cookie对象为null,则checkAutoLogin(UserSession userSession)方法直接返回false。
g.调用SessionFacade类的add(UserSession us)方法添加用户userSession。在该方法中:
g1.通过JForumExecutionContext类,获取在3.5步骤中创建的JForumContext类对象。
g2.通过JForumContext类对象获取存储其中的WebRequestContext类对象。
g3.通过WebRequestContext类对象获取一个WebSessionContext类对象。
WebSessionContext类实质上是HttpSession类的一个自定义外覆类,对当前请求HttpRequest的HttpSession对象进行了封装,通过WebSessionContext类提供的接口访问HttpSession类一些属性。
g4.通过WebSessionContext类对象获取当前HttpSession的id。
g5.调用SessionFacade类的add(UserSession us, String sessionId)方法,在该方法中:
step1.调用DefaultCacheEngine类的add()方法,将sessionid与usersession之间的映射关系存储到缓存(即DefaultCacheEngine类的对象,该类中有一个Map属性)中。存储的机制是缓存里有一个Map,该Map与字符串"sessions"之间有一个映射关系。通过字符串"sessions"可以取得该Map。这个Map对象存储着sessionid与usersession之间的映射。"sessions"存储在SessionFacade.FQN中。
step2.如果不是登录机器人登录,如果是匿名用户登录(由于登录过程还未完成,因此用户还是匿名身份),调用SessionFacade类的changeUserCount方法,使匿名用户的数量加1,实现的具体细节是:
——调用DefaultCacheEngine类的get方法取出当前匿名用户的登录数量。取出的机制是缓存里有一个Map,该Map与字符串"sessions/count"有一个映射关系。通过字符串"sessions/count"可以取得该Map。"sessions/count"存储在SessionFacade.FQN_COUNT中。这个Map里存储着一些数值,其中就有匿名用户登录的数量。该值与字符串" anonymousCount"之间有一个映射关系。" anonymousCount"存储在SessionFacade.ANONYMOUS_COUNT中。
——数量加1。changeUserCount方法的第二个参数表示数量增减的标记,登录加1,登出减1。
——数量改变后,重新存入缓存。
3.9在FreeMarker的SimpleHash中设置登录标记"logged"。
3.10借助SecurityRepository类的load方法加载用户权限,实际上创建了一个PermissionControl对象。在缓存(即DefaultCacheEngine类的对象,该类中有一个Map属性)中有一个"security"字符串与一个存储权限的Map映射。在该Map中,维护着userid与该用户对应的PermissionControl对象间的映射。在PermissionControl对象中,存储着该用户的角色列表。
3.11借助ControllerUtils类的prepareTemplateContext()方法,将装载模板页面需要的数据存储到SimpleHash对象context中。
3.12依据"module"值,获取对应的Action的全限定类名称,即net.jforum.view.forum.UserAction
3.13通过远程访问的IP地址,借助JForum类的shouldBan()方法判定是否为不受欢迎的用户。
3.14如果不在阻止的用户列表中,就把模块名(模块名实质是指net.jforum.view.forum.UserAction的名字)即module的值"user"与模块的方法名即action的值"validateLogin"存储到SimpleHash类的对象context中。
3.15在SimpleHash中添加语言类型、用户Session、Http请求Request对象req、外覆类ResponseContext对象response。
3.16调用JForum类的processCommand()方法。在该方法中:
(1)借助JForum类的retrieveCommand()方法,创建module对应的Action的实例,即net.jforum.view.forum.UserAction类的对象。
(2)调用父类Command的process()方法处理特定的业务逻辑。在该方法中:
a.获取处理特定业务逻辑的方法名,即"action"的值"validateLogin"。
b.借助反射机制调用net.jforum.view.forum.UserAction类的validateLogin()方法。在该方法中:
b0.首先取出用户名、密码。用户名、密码既有可能包含HTTP请求头,也可能直接包装在HTTP请求中,需要借助parseBasicAuthentication()方法进行甄别。然后用不同的方式取出用户名、密码。
b1.调用net.jforum.view.forum.UserAction类的validateLogin(String name, String password)方法进行验证。在该方法中:
b11.获取一个GenericUserDAO类对象。
b12.调用GenericUserDAO类的validateLogin(String username, String password)方法进行验证。在该方法中:
b121.调用DefaultLoginAuthenticator类型的validateLogin(String username, String password, Map extraParams)方法进行验证。在该方法中:
step1.通过查询语句SELECT user_id FROM jforum_users WHERE LOWER(username) = LOWER(?) AND user_password = ?查询是否具有满足条件的记录
step2.如果查询结果集为空,不创建User对象。
step3.返回null
b2.判断返回的User对象是否为null,如果不为空
b21.调用UserAction类的buildSucessfulLoginRedirect()方法,设定登录成功后,页面跳转到位置。/Forum/forums/list.page。
b22.借助SessionFacade类的makeLogged()方法将HttpSession中设置属性logged值为1。实质上是由WebSessionContext类对象完成的工作。WebSessionContext类是HttpSession类的一个自定义外覆类,对当前请求HttpRequest的HttpSession对象进行了封装,通过WebSessionContext类提供的接口访问HttpSession类一些属性。
b23.借助SessionFacade类的isUserInSession(int userId)方法,判断是否存在一个Seesion对象和User对象存在映射关系(即DefaultCacheEngine类的对象,该类中有一个Map属性)。存储的机制是缓存里有一个Map,该Map与字符串"sessions/userId"之间有一个映射关系。通过字符串"sessions/userId"可以取得该Map。这个Map对象存储着sessionid与usersession之间的映射。sessions/userId"存储在SessionFacade.FQN中。
b24.以"sessions"Map中的Session为蓝本,克隆一个新的UserSession对象。
注意:为什么要克隆?因为如果仅仅是引用的话,删除一个Map中的UserSession,其他的Map也会受影响。为了保证数据的独立性,所以采用了克隆。
b25.借助SessionFacade类的remove(String sessionId)方法在"sessions/userId"Map、"sessions/logged"Map、"sessions"Map中删除当前的UserSession对象。同时,匿名用户数量减1。
b26.把用户数据(即验证后返回的User对象)添加到当前的UserSession中。
b27.从数据库中取出上次登录的开始时间和停留时间,并相加,计算出上次退出系统的时间
b28.将UserSession对象存储到缓存中。
b29.在HttpRequest中添加"topics.tracking"属性,类型是HashMap。(用处暂时未知)。
b30.添加"cookie.name.data"cookie。
b31.载入用户权限。生成权限对象。
b3.判断合法登录的标记是否为真,如果不为真
b31.在SimpleHash类对象context中,置invalidLogin属性值为1
b32.设置模版为forum_login.htm
c.借助JForumExecutionContext.templateConfig().getTemplate(
new StringBuffer(SystemGlobals.getValue(ConfigKeys.TEMPLATE_DIR)).
append('/').append(this.templateName).toString(),"UTF-8");装载模板Template对象。注意:"UTF-8"否则中文无法正常显示。
(3)Template对象输出。
5.16调用JForum类的handleFinally方法,如果检测到重定向URL不为空,就执行重定向操作。
1.1由于采用了URL重写,因此有时后面会跟有jsessionid。即,/JForum/jforum.page;jsessionid=7222129E440E2DBEF098A2D26D9994E6
1.2该请求提交时,会发送5个参数,其中有两个是隐藏域。
(1)<input type="hidden" name="module" value="user" />
(2)<input type="hidden" name="action" value="validateLogin" />
(3)<input class="post" size="10" name="username" type="text"/>
(4)<input class="post" type="password" size="10" name="password" />
(5)<input class="text" type="checkbox" name="autologin" id="autologin"/>
2,服务器截获JForum/jforum.page请求;交给一个名为net.jforum.JForum的Servlet处理
3,名叫net.jforum.JForum的Servlet执行service()方法
3.1取得JForumExecutionContext对象
3.2创建WebRequestContext对象
(1)获取请求的方法类型并转换成大写(GET/POST),登录用例的请求类型是POST。
(2)获取请求的上下文路径,即/JForum。
(3)借助WebRequestContext类的extractRequestUri()方法,提取uri。在该方法中:
a.剔除原始uri中含有的上下文部分,即将/JForum/jforum.page;jsessionid=7222129E440E2DBEF098A2D26D9994E6中的/JForum剔除,余下/jforum.page;jsessionid=7222129E440E2DBEF098A2D26D9994E6
b.如果uri中含有jsessionid,则将其剔除。剔除后即是/jforum.page
(4)获取编码方式,即UTF-8。
(5)获取servlet截获的后缀名,即.page。
(6)判断是否是POST请求,isMultipart判断HTTP MIME类型是否以multipart/开头。登录用例是POST请求,而且HTTP MIME类型不是以multipart/开头。
注意:isMultipart变量的值用于保存原始请求的Content-Type的类型。JForum论坛在发一个帖子时,即使没有上传附件,提交的仅仅是普通文本字符,表单的 enctype属性值也被设置成MULTIPART/FORM-DATA,我们平时用表单提交数据时经常不设置enctype属性,那么它的默认值是application/x-www-form-urlencoded。只有当enctype属性值是application/x-www-form-urlencoded时,我们才能够在原始请求中通过request.getParameter("parameterName")的形式获取参数值,而当属性值是MULTIPART/FORM-DATA时,必须亲自获取输入流,从输入流中解析参数值,或者借助第三方的组件,JForum中使用的是apache的commons file upload组件。
(7)通过HTTP请求头"X-Requested-With",判断是否是AJAX请求,即异步请求。登录用例不是AJAX请求。
(8)设置HTTPRequest请求的字符编码为UTF-8。
(9)设置容器编码。
(10)收集请求中的参数,借助WebRequestContext类的addParameter()方法,将请求中的参数名与值存储到WebRequestContext类的query属性中。该属性是一个HashMap类型,键的类型是一个String,值的类型或者是一个ArrayList或者是一个String。
(11)判断参数列表中是否含有"module"参数与"action"参数。如果没有,则从uri中解析出这两个参数。
注意:有的请求中含有参数存储了"module"与"action"的值。比如,登录请求。有的请求中没有这样的参数,但是在uri中含有了"module"与"action"。比如,启动请求。
注意:"module"参数代表特定的Action类,"action"参数代表该Action类中某个特定的方法。
3.3创建WebResponseContext对象
3.4检查数据库状态。借助JForum类的checkDatabaseStatus()方法,检测isDatabaseUp标记观察数据库是否启动。在登录用例运行时,数据库已经启动。
3.5创建JForumContext类对象forumContext,该对象持有/JForum上下文路径、servlet截获的后缀名、WebRequestContext类的request对象、WebResponseContext类的response对象。
3.6将上述JForumContext类对象存储到JForumExecutionContext中,并更新到ThreadLocal。
3.7借助JForumExecutionContext类的getTemplateContext()方法获取FreeMarker的SimpleHash类对象context。
3.8借助ControllerUtils的refreshSession()方法刷新用户UserSession
注意:据推测,UserSession类起到将User类与HttpSession类建立联系的作用。
(1)借助SessionFacade的getUserSession()方法返回UserSession对象。这个方法的本质作用是通过当前HttpSession的id从缓存(即DefaultCacheEngine类的对象,该类中有一个Map属性cache,cache中又嵌套了若干个Map,其中一个Map里可以通过HttpSession的id取出UserSession类对象)中取出UserSession类对象。这个过程曲折得离奇:
a.通过JForumExecutionContext类,获取在3.5步骤中创建的JForumContext类对象。
b.通过JForumContext类对象获取存储其中的WebRequestContext类对象。
c.通过WebRequestContext类对象获取一个WebSessionContext类对象。WebSessionContext类实质上是HttpSession类的一个自定义外覆类,对当前请求HttpRequest的HttpSession对象进行了封装,通过WebSessionContext类提供的接口访问HttpSession类一些属性。
d.通过WebSessionContext类对象获取当前HttpSession的id。
e.通过SessionFacade的getUserSession(String sessionId)方法,在缓存中获取UserSession对象。
(2)通过JForumExecutionContext获取RequestContext对象
a.通过JForumExecutionContext类,获取在3.5步骤中创建的JForumContext类对象。
b.通过JForumContext类对象获取存储其中的WebRequestContext类对象。
(3)如果获取UserSession对象为空
a.创建UserSession对象
b.注册UserSession基本信息,包括当前HttpRequest访问本站的开始时间,最后访问时间,设置UserId(此时登录过程还未完成,因此先设置成匿名用户id,该id值为1)。
c.设置会话id
d.设置用户IP
e.借助SessionFacade类的makeUnlogged()方法清除登录StandardSessionContext中的logged属性
f.判断是否是机器人发送的登录请求,如果不是
f1.判断是否是单点登录,如果不是
f11.判断自动登录的验证标记是否为true。在登录用例中该标记是true,则调用ControllerUtils类的checkAutoLogin(UserSession userSession)方法对自动登录进行验证。在该方法中:
step1:通过调用三次ControllerUtils类的getCookieTemplate()方法获取名为jforumUserId、jforumUserHash、jforumAutoLogin的三个Cookie对象。在登录用例中,后两个Cookie对象为null。
step2:如果名为jforumUserHash的Cookie对象为null,则checkAutoLogin(UserSession userSession)方法直接返回false。
g.调用SessionFacade类的add(UserSession us)方法添加用户userSession。在该方法中:
g1.通过JForumExecutionContext类,获取在3.5步骤中创建的JForumContext类对象。
g2.通过JForumContext类对象获取存储其中的WebRequestContext类对象。
g3.通过WebRequestContext类对象获取一个WebSessionContext类对象。
WebSessionContext类实质上是HttpSession类的一个自定义外覆类,对当前请求HttpRequest的HttpSession对象进行了封装,通过WebSessionContext类提供的接口访问HttpSession类一些属性。
g4.通过WebSessionContext类对象获取当前HttpSession的id。
g5.调用SessionFacade类的add(UserSession us, String sessionId)方法,在该方法中:
step1.调用DefaultCacheEngine类的add()方法,将sessionid与usersession之间的映射关系存储到缓存(即DefaultCacheEngine类的对象,该类中有一个Map属性)中。存储的机制是缓存里有一个Map,该Map与字符串"sessions"之间有一个映射关系。通过字符串"sessions"可以取得该Map。这个Map对象存储着sessionid与usersession之间的映射。"sessions"存储在SessionFacade.FQN中。
step2.如果不是登录机器人登录,如果是匿名用户登录(由于登录过程还未完成,因此用户还是匿名身份),调用SessionFacade类的changeUserCount方法,使匿名用户的数量加1,实现的具体细节是:
——调用DefaultCacheEngine类的get方法取出当前匿名用户的登录数量。取出的机制是缓存里有一个Map,该Map与字符串"sessions/count"有一个映射关系。通过字符串"sessions/count"可以取得该Map。"sessions/count"存储在SessionFacade.FQN_COUNT中。这个Map里存储着一些数值,其中就有匿名用户登录的数量。该值与字符串" anonymousCount"之间有一个映射关系。" anonymousCount"存储在SessionFacade.ANONYMOUS_COUNT中。
——数量加1。changeUserCount方法的第二个参数表示数量增减的标记,登录加1,登出减1。
——数量改变后,重新存入缓存。
3.9在FreeMarker的SimpleHash中设置登录标记"logged"。
3.10借助SecurityRepository类的load方法加载用户权限,实际上创建了一个PermissionControl对象。在缓存(即DefaultCacheEngine类的对象,该类中有一个Map属性)中有一个"security"字符串与一个存储权限的Map映射。在该Map中,维护着userid与该用户对应的PermissionControl对象间的映射。在PermissionControl对象中,存储着该用户的角色列表。
3.11借助ControllerUtils类的prepareTemplateContext()方法,将装载模板页面需要的数据存储到SimpleHash对象context中。
3.12依据"module"值,获取对应的Action的全限定类名称,即net.jforum.view.forum.UserAction
3.13通过远程访问的IP地址,借助JForum类的shouldBan()方法判定是否为不受欢迎的用户。
3.14如果不在阻止的用户列表中,就把模块名(模块名实质是指net.jforum.view.forum.UserAction的名字)即module的值"user"与模块的方法名即action的值"validateLogin"存储到SimpleHash类的对象context中。
3.15在SimpleHash中添加语言类型、用户Session、Http请求Request对象req、外覆类ResponseContext对象response。
3.16调用JForum类的processCommand()方法。在该方法中:
(1)借助JForum类的retrieveCommand()方法,创建module对应的Action的实例,即net.jforum.view.forum.UserAction类的对象。
(2)调用父类Command的process()方法处理特定的业务逻辑。在该方法中:
a.获取处理特定业务逻辑的方法名,即"action"的值"validateLogin"。
b.借助反射机制调用net.jforum.view.forum.UserAction类的validateLogin()方法。在该方法中:
b0.首先取出用户名、密码。用户名、密码既有可能包含HTTP请求头,也可能直接包装在HTTP请求中,需要借助parseBasicAuthentication()方法进行甄别。然后用不同的方式取出用户名、密码。
b1.调用net.jforum.view.forum.UserAction类的validateLogin(String name, String password)方法进行验证。在该方法中:
b11.获取一个GenericUserDAO类对象。
b12.调用GenericUserDAO类的validateLogin(String username, String password)方法进行验证。在该方法中:
b121.调用DefaultLoginAuthenticator类型的validateLogin(String username, String password, Map extraParams)方法进行验证。在该方法中:
step1.通过查询语句SELECT user_id FROM jforum_users WHERE LOWER(username) = LOWER(?) AND user_password = ?查询是否具有满足条件的记录
step2.如果查询结果集为空,不创建User对象。
step3.返回null
b2.判断返回的User对象是否为null,如果不为空
b21.调用UserAction类的buildSucessfulLoginRedirect()方法,设定登录成功后,页面跳转到位置。/Forum/forums/list.page。
b22.借助SessionFacade类的makeLogged()方法将HttpSession中设置属性logged值为1。实质上是由WebSessionContext类对象完成的工作。WebSessionContext类是HttpSession类的一个自定义外覆类,对当前请求HttpRequest的HttpSession对象进行了封装,通过WebSessionContext类提供的接口访问HttpSession类一些属性。
b23.借助SessionFacade类的isUserInSession(int userId)方法,判断是否存在一个Seesion对象和User对象存在映射关系(即DefaultCacheEngine类的对象,该类中有一个Map属性)。存储的机制是缓存里有一个Map,该Map与字符串"sessions/userId"之间有一个映射关系。通过字符串"sessions/userId"可以取得该Map。这个Map对象存储着sessionid与usersession之间的映射。sessions/userId"存储在SessionFacade.FQN中。
b24.以"sessions"Map中的Session为蓝本,克隆一个新的UserSession对象。
注意:为什么要克隆?因为如果仅仅是引用的话,删除一个Map中的UserSession,其他的Map也会受影响。为了保证数据的独立性,所以采用了克隆。
b25.借助SessionFacade类的remove(String sessionId)方法在"sessions/userId"Map、"sessions/logged"Map、"sessions"Map中删除当前的UserSession对象。同时,匿名用户数量减1。
b26.把用户数据(即验证后返回的User对象)添加到当前的UserSession中。
b27.从数据库中取出上次登录的开始时间和停留时间,并相加,计算出上次退出系统的时间
b28.将UserSession对象存储到缓存中。
b29.在HttpRequest中添加"topics.tracking"属性,类型是HashMap。(用处暂时未知)。
b30.添加"cookie.name.data"cookie。
b31.载入用户权限。生成权限对象。
b3.判断合法登录的标记是否为真,如果不为真
b31.在SimpleHash类对象context中,置invalidLogin属性值为1
b32.设置模版为forum_login.htm
c.借助JForumExecutionContext.templateConfig().getTemplate(
new StringBuffer(SystemGlobals.getValue(ConfigKeys.TEMPLATE_DIR)).
append('/').append(this.templateName).toString(),"UTF-8");装载模板Template对象。注意:"UTF-8"否则中文无法正常显示。
(3)Template对象输出。
5.16调用JForum类的handleFinally方法,如果检测到重定向URL不为空,就执行重定向操作。
发表评论
-
linux重启oracle 各种方法
2013-01-15 09:53 1320来自 : http://blog.sina.com.cn/s/ ... -
SVN服务器配置
2013-01-10 22:49 1257来自:http://air-blue55.blog.163.c ... -
网页编码就是那点事
2012-11-24 16:10 1045来自 : http://www.kuqin.com/webpa ... -
Tomcat 配置 CAS 的一个问题。unable to find valid certification path to requested target
2012-11-11 21:40 1648来自: http://blog.csdn.net/cool_ ... -
Tomcat SSL配置大全
2012-11-11 21:02 1245来源: http://www.iteye.com/topi ... -
Html中td自动换行问题
2012-10-25 17:57 1099来自:http://blog.csdn.net/dududu0 ... -
oracle 全角、半角转换,和oracle 的 DUMP函数
2012-06-18 09:56 2192to_single_byte(c)转换成半角 to_multi ... -
tomcat sso 配置
2012-05-29 23:18 1670源: http://www.oecp.cn/hi/single ... -
Hibernate 利用配置文件配置HQL/SQL
2012-05-21 17:14 1846Query.hbm.xml <?xml version= ... -
CAS工作流程
2012-05-19 22:25 1616CAS3.0的工作流程: 0.app将用户转发到CAS处, 并 ... -
jforum 表目录
2012-04-18 18:37 3048目 录 1、附件关系表JFORUM_ATTACH 2 2、附件 ... -
Jfroum集成cas单点登录
2012-04-17 21:35 16201.安装CAS 下载cas server ,设置好服务器端, ... -
tinyMCE 详细文档
2012-03-28 10:57 2164http://www.iwms.net/n2065c17.as ... -
JBPM3.1.4 相关表的 意义
2012-03-18 22:54 1036JBPM_ACTION action记录表 JBPM_DEC ... -
JBPM环境配置
2012-03-18 18:56 1864jBPM 需要数据库支持, j ... -
xfire 编写webservice例子
2012-02-23 16:51 1092来自 : http://www.blogjava.net/j ... -
ArrayUtils常用的用法
2012-02-21 10:51 1608// 1.打印数组 ArrayUtils.toString(n ... -
Tomcat自动缓存context.xml,导致在eclipse中修改后,不能立即启作用
2012-02-18 11:56 1809http://blog.csdn.net/shiqidide/ ... -
JavaScript CSS Style属性对照表
2012-02-11 22:36 1140CSS语法 (不区分大小写) JavaScript语法 (区分 ... -
JQUERY TREE
2012-01-09 14:49 1229要使用jquery.treeview.js,当然第一步是要把它 ...
相关推荐
Jforum是一款基于Java技术的开源论坛软件,它提供了丰富的社区功能,包括主题讨论、用户管理、权限控制、单点登录等。这款论坛系统以其稳定性和可扩展性而受到开发者的青睐。在深入理解Jforum的过程中,源码解析是至...
《深入解析jforum3.0所需jar包》 在Java Web开发领域,jForum是一款流行的开源论坛系统,它基于Java语言编写,提供了丰富的社区交流功能。jForum3.0是其一个重要的版本,针对该版本的运行,我们需要一系列的jar包来...
如果匿名用户尝试访问受保护的页面,JForum会引导用户去登录页面,并传递登录成功后的跳转地址。 **JForum SSO实现的关键步骤:** 1. **实现SSO类**:你需要创建一个类来获取来自另一个系统的用户登录信息。这里...
《jForum与MS SQLServer整合学习笔记》 jForum是一款基于Java的开源论坛系统,它以其高度可定制性、灵活性和强大的功能深受开发者喜爱。在本文中,我们将深入探讨如何将jForum与Microsoft SQL Server(简称MS SQL...
JForum3是一款基于Java开发的开源论坛系统,其核心设计目标是提供一个高效、稳定且功能丰富的在线讨论平台。这款论坛软件使用了Java语言编写,遵循开放源代码的原则,允许用户自由地使用、修改和分发。JForum3是...
JForum3可能提供了API接口,允许与其他系统进行集成,如社交媒体登录、第三方统计分析等。 通过研究JForum3的源代码,开发者不仅可以学习到Java Web开发的最佳实践,还能掌握如何构建一个健壮、易扩展的社区平台。...
Jforum提供了用户角色和权限的管理,包括登录验证、权限分配、访问控制等。理解权限控制的逻辑,可以有效地防止未授权的访问,保护论坛内容的安全。 通过深入学习和理解这些知识点,无论是开发者还是管理员,都能够...
为了成功运行JForum 3.0,我们需要了解和掌握以下几个关键知识点: 1. **Java环境**:首先,确保你已经安装了Java Development Kit (JDK)。JForum是用Java编写的,因此运行它需要Java环境支持。至少需要JDK 1.8或更...
1、附件关系表JFORUM_ATTACH 2 2、附件详细信息表JFORUM_ATTACH_DESC 2 3、附件配置限定关系表JFORUM_ATTACH_QUOTA 2 4、封锁表JFORUM_BANLIST 2 5、标识表JFORUM_BANNER 3 6、书签表JFORUM_BOOKMARKS 3 7、...
《JForum漏洞利用源代码解析》 JForum是一款流行的开源Java论坛系统,它以其功能丰富、社区友好而受到许多用户的青睐。然而,如同任何复杂的软件系统一样,JForum也存在安全漏洞,这些漏洞可能被恶意用户利用,对...
**JForum3 完整项目详解** JForum3 是一个基于Java开发的开源论坛系统,提供了丰富的社区交流功能。这个项目包含的是从版本控制系统Subversion(SVN)中导出的完整源代码,未经任何修改,因此用户可以深入研究其...
JForum提供了用户认证和授权功能,包括注册、登录、权限管理等。源码中可以了解到如何实现基于session的身份验证,以及如何通过过滤器防止SQL注入和跨站脚本攻击。 5. **国际化与本地化** JForum支持多语言环境,...
**JForum3源代码数据库详解** JForum3是一款基于Java的开源论坛系统,它提供了丰富的社区功能,包括用户管理、论坛板块、主题讨论、帖子回复等。本篇将深入探讨JForum3的源代码和其与数据库的交互,以及如何进行...
**Jforum 2.19** 是一个基于Java的开源论坛系统,以其高效、稳定和易用性而受到开发者和社区管理员的欢迎。这个版本的Jforum提供了丰富的功能,包括用户管理、论坛分类、主题发布、回复讨论、搜索功能以及各种自定义...
6. 测试与调试:在开发过程中,使用JUnit等单元测试框架编写测试用例,确保新功能的正确性。同时,使用IDE的调试功能排查问题。 7. 集成与优化:将新开发的功能整合到现有系统中,确保与原有功能兼容。优化代码性能...
JForum是一款流行的Java论坛软件,它提供了一个用户友好的界面,支持多语言,且具有高度可扩展性。CKEditor则是一个先进的在线文本编辑器,广泛用于网站内容管理系统,提供丰富的富文本编辑功能。在JForum中整合...
标题"jforum2论坛源码"表明了我们关注的是一个名为jforum2的开源论坛系统的源代码。jforum2是一个基于Java技术的讨论板平台,允许用户进行互动交流,提供社区建设和管理功能。源码通常包含程序的所有原始代码,可供...
安装完成后,你可以登录管理后台进行进一步的设置和定制,例如调整板块分类、设置权限、管理用户等。`language_zh_CN.properties`和`language_zh_CN.txt`文件中的内容会在后台设置界面和用户界面中显示,确保了论坛...