Spring AOP代理会话bean在会话超时后保留,并且仅在容器重启后才会消失

时间:2014-04-17 14:41:56

标签: java spring spring-mvc spring-aop

我在Spring Controller中有一个AOP代理会话范围的bean,它在关闭浏览器后甚至在web.xml中配置的会话超时30分钟后都不会消亡。浏览器关闭或会话超时后是否可以销毁bean?我在Tomcat 7服务器上使用Spring 3.2.2模块

更新:使用会话监听器后,这就是我发现的。

  1. 使用应用程序网址打开浏览器,创建会话。然后我用一些测试值绑定一些输入。
  2. 然后我关闭浏览器,容器仍然在步骤1中有会话,因为关闭浏览器只会擦除JSESSIONID
  3. 现在我使用相同的应用程序URL打开浏览器,创建另一个会话,但它使用与我在步骤1中绑定的值相同的bean。
  4. 我再一次重复第2步和第3步,并创建“n”个会话。
  5. 我等了30分钟,所有n个会话都被销毁了。
  6. 现在我再次打开浏览器,并使用我在步骤1中绑定的相同旧值创建会话。
  7. 因此,只有在重新启动服务器后,绑定值才会丢失。当'n'会话被销毁时,为什么没有销毁豆类?

    SSCCE:

    @Controller
    @RequestMapping("/app")
    public class MyAppController {
    
    // AOP session scoped proxy type CGLIB
    @Autowired  private InputForm inputForm;
    
    @RequestMapping(value = "/home", method = RequestMethod.GET)
    public ModelAndView returnHome() {
        Map<String, Object> modelMap = new HashMap<String, Object>();
        modelMap.put("inputForm", inputForm);
        return new ModelAndView("homePage", modelMap); 
    }
    }
    
    
    public class InputForm {
    
    private String id;
    private String name;
    private String phoneNo;
    private List<Person> personKeys = new AutoPopulatingList<Person>(Person.class);
    
    public void init() {
        this.getPersonKeys().add(new Person(this.id, this.name, this.phoneNo));
    }
    
    // getters and setters  
    

    }

    <bean id="inputForm" class="<package>.InputForm" 
                            scope="session" init-method="init">
        <property name="id" value="${property_id}"/>
        <property name="name" value="${property_name}"/>
        <property name="phoneNo" value="${property_phone}"/>
        <aop:scoped-proxy proxy-target-class="true"/>
    </bean>
    

1 个答案:

答案 0 :(得分:4)

绝对没有办法 1 来检测浏览器关闭。当会话超时并且无效时,bean将会死亡。

1 <子>(故障安全)