小编r0d*_*aes的帖子

如何在grails Web应用程序中使用shiro本机会话?

目前,我在控制器和gsp页面中使用默认的HttpSession对象:

在控制器中:

...
session.mykey = anObject;  // adding an object to session
...
if (session.otherkey) {    // performing some checking
Run Code Online (Sandbox Code Playgroud)

在GSP中:

...
<g:if test="${session.mykey}">
...
Run Code Online (Sandbox Code Playgroud)

我想要一个"记住我"的功能.Shiro已经内置了.但是,据我所知,为了做到这一点,我必须使用shiro本地会话模式(在Config.groovy:security.shiro.session.mode ="native").默认情况下,它会持久保存会话状态,因此只要Cookie过期或用户注销,对象就会保留在会话中.

我的理解是对的吗?

然后我将不得不将我的控制器更改为:

def shiroSession = SecurityUtils.subject.session
shiroSession.setAttribute("mykey",anObject)
....
if (shiroSession.getAttribute("otherkey") ){
Run Code Online (Sandbox Code Playgroud)

我对此的看法:

<g:if test="${SecurityUtils.subject.session.getAttribute('mykey')}">
Run Code Online (Sandbox Code Playgroud)

所以,我的问题是:

  • 是对的吗?
  • 我不能只使用以前的方式来访问会话吗?
  • 我是否必须在某些配置中关闭默认的http会话?

grails session-management shiro

6
推荐指数
1
解决办法
1178
查看次数

来自不同客户端的 EJB3 有状态并发调用

我有一个富客户端 swing 应用程序调用远程有状态 ejb。我使用的是JBoss 6.0。

我已经将客户端部署在两台不同的机器上,即不同的ip地址、jvm等。

有状态的有以下代码:

@Stateful
public class MyStateful implements MyStatefulRemote{

public void test(){     
    System.out.println(this);
    System.out.println(Thread.currentThread());
    System.out.println(Thread.currentThread().getThreadGroup());

    // cpu intensive task                
    String value = "";
    for (int j = 0; j < Integer.MAX_VALUE; j++) {
        value = "" + j;
    }
}
Run Code Online (Sandbox Code Playgroud)

并且客户端有以下代码:

...
String JNDI_FACADE = "MyStateful/remote";
InitialContext context = new InitialContext();
MyStatefulRemote my = (MyStatefulRemote) context.lookup(JNDI_FACADE);
my.test();
Run Code Online (Sandbox Code Playgroud)

然后,当我运行第一个客户端时,ejb 执行 println 命令并开始执行循环(如预期)。但是,当我在另一台计算机上运行第二个客户端时,ejb 在第一个方法调用完成之前不会打印任何内容。换句话说,有状态 bean 似乎无法处理并发调用,即使是来自不同客户端的调用。

如果我们查看 println 命令,我们可以看到:

br.com.alta.MyStateful@61ef35
WorkerThread#6[192.168.7.58:54271]
java.lang.ThreadGroup[name=jboss,maxpri=10]
Run Code Online (Sandbox Code Playgroud)

当服务器完成第一次调用的执行时,第二次调用将打印输出:

br.com.alta.MyStateful@17539b3
WorkerThread#1[192.168.7.53:54303]
java.lang.ThreadGroup[name=jboss,maxpri=10]
Run Code Online (Sandbox Code Playgroud)

我可以注意到有两个不同的有状态实例(正如预期的那样,每个客户端一个实例),并且它们在不同的线程中运行。

当我使用无状态而不是有状态时,它可以工作。但是,在我的应用程序中,我需要保留来自客户端的一些数据,有状态似乎更合适。

concurrency jboss stateful ejb-3.0 jakarta-ee

3
推荐指数
1
解决办法
3111
查看次数