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

标签 session grails

一旦页面加载,它就会呈现大量数据并显示在 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/

相关文章:

grails - 保存具有不同ID的多个文件

java - 通过FacesContext获取SessionScoped Bean的字段

javascript - Grails 2 资源和 yui3 脚本加载器

servlets - 文本/事件流从头开始渲染(没有插件)

grails - Grails Spring Security Facebook登录错误

grails - Grails配置文件关闭定义

php - 如何在 PHP 中为 $_SESSION 设置唯一名称?

asp.net - 间歇性 ASP.Net 状态服务错误

c# - 我正在尝试在 MVC 5 中使用 Session 来传递最近注册用户的 Id

linux - 如何保持与 paramiko 的 session