Session session = Session.getDefaultInstance(props, new Authenticator(){ 
protected PasswordAuthentication getPasswordAuthentication() { 
return new PasswordAuthentication(account, password); 
}}); 为什么有时候用Session.getDefaultInstance创建session会出现邮件发不出去的情况,错误信息:
java.lang.SecurityException: Access to default session denied
at javax.mail.Session.getDefaultInstance(Session.java:292)网上人说用javax.mail.Session.getInstance()方法来创建session对象就好了。
这是什么原因呢?
用javax.mail.Session.getInstance()会有什么潜在的问题吗?

解决方案 »

  1.   

    调javax.mail包,直接使用天的Transport.send(message)发送邮件功能.但是却出现了当第一次进入系统时,可以正常发送邮件,但是如果更改邮件用户名,密码等资料后再发送就报异常.初步判断是jsp页面传入资料时出错,进入debug状态进行调试,发现MailUtil.getSession(RptTaskMailConfig.SMTPServer,true,RptTaskMailConfig.Sender,RptTaskMailConfig.EmailPwd)里的值是保存后新改的值.就陷入迷茫中,既然是新的值为什么会报帐号和密码不匹配.继续调试,估计是Session的问题,应该是第一次的session没被清除,但是上网查了资料也没有说java邮件发送后需要特别清除session的,并且程序中每次都会调用MailUtil.getSession,即会产生不同的session,似乎也不存在这个问题.最后发现在session建立时Session.getDefaultInstance(props, authentic);相当可疑.查了一下:何谓getDefaultInstance? 
    从处理流程中可以看出,首先是从缓存中查找是否有properties存在 
    如果存在,则加载默认的properties 
    如果不存在才加载用户自己定义的properties, 
    所以当一个应用为每个用户独立创建properties的时候,还是应该调用getInstance, 
    除非你希望有一个默认的properties让用户使用 问题找到了,因为它会首先去内存和系统文件中去找properties,所以不管我在页面改几次数据,其实在后台中生成session时都和系统启动时的一样,所以在MailUtil.sendTextMessage(mailSession,RptTaskMailConfig.Sender,
    receiver,null,mail_subject,mail_content,"GB2312",null);时session里的sender和传入的sender不一致,因此出错,修改Session.getDefaultInstance(props, authentic);为Session.getInstance(props, authentic);后,可以正确发送修改帐号,密码等资料后的邮件.OK最后再补充一下,session.getdefaultinstance和getinstance的区别 : 如果想要同时使用两个帐号发送javamail,比如使用[email protected]发送1#邮件,使用[email protected]发送2#邮件,这时候,你就需要同时创建两个java.mail.Session对象。但是如果你仍然使用Session.getDefaultInstance创建session对象的话,你会发现,第二个username:[email protected]创建的session永远都和第一个一样,这是为什么呢?因为,getDefaultInstance是真正单例模式,而且,里面的username和password属性是final型的,无法更改。所以,你会发现两封email都是由[email protected]发出来的。所以这个时候你要使用javax.mail.Session.getInstance()方法来创建session对象。
      

  2.   

    session.getdefaultinstance和getinstance的区别 : 如果想要同时使用两个帐号发送javamail,比如使用[email protected]发送1#邮件,使用[email protected]发送2#邮件,这时候,你就需要同时创建两个java.mail.Session对象。但是如果你仍然使用Session.getDefaultInstance创建session对象的话,你会发现,第二个username:[email protected]创建的session永远都和第一个一样,这是为什么呢?因为,getDefaultInstance是真正单例模式,而且,里面的username和password属性是final型的,无法更改。所以,你会发现两封email都是由[email protected]发出来的。所以这个时候你要使用javax.mail.Session.getInstance()方法来创建session对象。 
      

  3.   

    session.getdefaultinstance和getinstance的区别 : 如果想要同时使用两个帐号发送javamail,比如使用[email protected]发送1#邮件,使用[email protected]发送2#邮件,这时候,你就需要同时创建两个java.mail.Session对象。但是如果你仍然使用Session.getDefaultInstance创建session对象的话,你会发现,第二个username:[email protected]创建的session永远都和第一个一样,这是为什么呢?因为,getDefaultInstance是真正单例模式,而且,里面的username和password属性是final型的,无法更改。所以,你会发现两封email都是由[email protected]发出来的。所以这个时候你要使用javax.mail.Session.getInstance()方法来创建session对象。 
      

  4.   

    楼上说的我都看过,关键是在账号和密码不变的情况下
    为什么用Session.getDefaultInstance创建session会出现邮件发不出去的情况,错误信息: 
    java.lang.SecurityException: Access to default session denied 
    at javax.mail.Session.getDefaultInstance(Session.java:292) 
    ,另外用getinstance会不会有什么潜在的问题。
      

  5.   

    在用Session.getDefaultInstance创建session 如果 Authenticator 参数传入为空时,这个session是同一个虚拟机可共享的,不会出现访问限制的问题,但楼主的代码里传入Authenticator参数 ,这时getDefaultInstance这个方法会比较后续该方法的调用与第一次调用时传入的值,如果是两者相同或者由同一classloader装载就可以得到这个session,否则不允许,  所以楼主调用时每一次都new Authenticator ,如果不是多个调用时不是同一classloader装载的话,就Access to default session denied ,要解决的话,楼主应让多次调用之间共享同一Authenticator getinstance创建的session不像getDefaultInstance那样可以被共享.它没有这个限制,用getinstance很多时候比
    getDefaultInstance 方便些