gpt4 book ai didi

session - 在 Grails 中首次加载页面时显式创建 session

转载 作者:行者123 更新时间:2023-12-02 14:50:53 25 4
gpt4 key购买 nike

一旦页面加载,它就会呈现大量数据并显示在 View 上,这会降低性能。我想限制这一点并仅在应用过滤器时加载数据。
我需要一种方法, session 变量可以在第一次登录时存储值,并且在第一次 session 中不应加载任何数据,即当任何用户第一次使用他的登录名加载它时。类似于 Controller 类中的以下内容:

if(session.dtstartDate && session.dtstartDate != '')
{
SimpleDateFormat nsdf = new SimpleDateFormat('yyyy-MM-dd')
Date startDateValue = nsdf.parse(session.dtstartDate.substring(0, session.dtstartDate.lastIndexOf("T")))
eq("startDate", startDateValue)//if any filter is applied
}
else{
if this is the 1st session the startdate should be null --> need a piece of code to be replaced here
}

最佳答案

我不确定也许我还没有得到你试图正确提出的问题,我想我应该试着回答你的问题,以了解我如何理解你的问题。

If we take this basic filter并添加一些东西,我们也许可以使用更好的方法来实现您想要做的事情?我不确定 startDate 实际代表什么,但如果我们基于用户是否第一次点击 Controller ,答案将是这样的,如果它具有其他意义,您可以将逻辑替换为 startDate:

所以添加一些hashmap arrayset在用户单击 Controller /操作时调用操作之前调用的过滤器:

在你的 conf/MyFiters.groovy

class MyFilters {
static final Set<HashMap<String[],String[]>> userControl =
([:] as Set).asSynchronized()
//where controller is controllerName and action is actionName
def filters = {
MyLogger() {
before = {
if (verifyClientMaster(session.id as String ,controllerName)==false) {
clientMaster.add(session.id as String:controllerName)
// now here you have a new user so set
// some session value for gsp or load something
//according
}else{
// user has hit it before do something else or set something else
}
}
}
}
}


Boolean verifyClientMaster(String sessionId,String controller) {
// iterate
boolean found = false
userControl.each { k,v -> if (k == sessionId && v == controller) {
found = true
}
}
}

像这样的东西,你知道用户是否点击了 Controller 。记住 session 是每个用户的。所以一个新用户有一个新的 session 实体。

希望对您有所帮助,不要偏离轨道..

E2A

考虑一下,您确实会走这条路,那么您需要跟踪 session 何时到期并从 clientMaster 中删除用户。 take a look at this project如果你真的走这条路……就我个人而言,我什至会比这更简单……重新考虑……
  class MyFilters {
def filters = {
MyLogger() {
before = {
if (!sessions."${controllerName}") {
sessions."${controllerName}"="${controllerName}"
// now here you have a new user so set
// some session value for gsp or load something
//according
}else{
// user has hit it before do something else or set something else
}
}
}
}
}

如果您加载的内容可以基于它,甚至比这更简单的是使用gsp内置的智能......(没有测试过任何一个哈)
<g:if test="${!session."${controllerName}"}">
<g:set var="${controllerName}" value="${controllerName}" scope="session" />

<g:render template="firstTimeHitter"/>
</g:if>
<g:else>
<g:render template="secondTimeHitter"/>
</g:else>

或者只是您的 Controller 来检查和设置它,然后呈现不同的东西或设置 gsp 拾取的东西..
def myController {
def doSomething() {
boolean firstTime = false
if (!session."${controllerName}") {
// first time either render or set firsTime
firstTime = true
session."${controllerName}" = controllerName // or startDate
// render view: 'firstTime, model: [firstTime:firstTime, params:params]

} else{
// render view: 'firstTime, model: [firstTime:firstTime, params:params]
}
// if no render above:
render view: 'doSomething, model: [firstTime:firstTime, params:params]
// now in doSomething gsp you look for firstTime:

}

做点什么:
<g:if test="${firstTime.toString().equals('true')}">
<g:render template="firstTimeHitter"/>
</g:if>
<g:else>
<g:render template="secondTimeHitter"/>
</g:else>

可能性是无穷无尽的,不同之处在于过滤器适合所有情况,即它会检查每个用户点击的每个 Controller 。在 Controller 和 gsp 解决方案中,您必须在需要的地方声明它。您可以拥有一个抽象 Controller ,其他 Controller 扩展该 Controller 以重复该检查作为被调用以验证的更高类,无论它们都比简单的一次性过滤器重复得多......

提供其他其他选择的最终编辑将是:
 final Set<Session> jsessions = ([] as Set).asSynchronized()
jsessions.add('controller1')
jsessions.add('controller2')
jsessions.add('controller3')
jsessions.add(controllerName)

println "=== ${jsessions}"
if (jsessions.contains(controllerName)) {
println "--- We have ${controllerName} defined in our session set.... jsessions"
}

ArrayList jsessions2 = []
jsessions2.add(controllerName)
session.jsessions2 = jsessions2

//repeat this on every call
ArrayList jsessionsret = session.jsessions2
jsessionsret.add('controller1')

jsessionsret.add('controller2')
jsessionsret.add('controller3')

session.jsessions2 = jsessionsret

if (jsessions2.contains(controllerName)) {
println "--- We have ${controllerName} defined in our session set.... jsessionsret"
}
println "222 --- ${jsessions2}"

上面的这个部分是两个不同的实现,首先使用一个全局的 session 集,如果你不关心 Controller 是否被 usera userb 等击中,则可以使用,所以如果 usera 击中它,userb 也将被视为击中它.. 这个是 jsessions。

底部的 jsessions2 试图将单个 session key 转换为 ArrayList。因此,与其在每个用户 session 每次调用 Controller 时存储大量单个对象,即 session."${controllerName}"。您可以为每个用户添加 1 个 session key ,您可以将他们点击的每个 Controller 附加到......然后检查他们是否拥有该 Controller

关于session - 在 Grails 中首次加载页面时显式创建 session ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29801473/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com