我目前正在使用Oracle ADF(这是一个端到端的Java EE框架)来构建我的Web应用程序和GlassFish 3.1作为应用程序服务器.
后者支持JAAS(在其管理控制台中声明).因此,我创建了一个安全领域,并使用配置文件中声明的角色映射它们,并使用JAAS实现授权和身份验证安全功能.一切都很好,直到现在!在过去的几周里,我一直在研究Java EE安全性.
我发现如果你坚持使用"基本"安全性,那么JAAS就足够了.此外,似乎JAAS(作为Java安全框架的一部分)仅适用于Java SE(但由于Java EE是基于Java SE构建的,因此其中一些模块正在被重用,例如LoginMethod和Callbacks).
然后,我发现很多关于JASPIC的帖子,发现它只能通过编程方式实现(不是问题),并且它还没有被app服务器供应商完全支持,并试图在两者之间进行比较.即使JASPIC1.1版本已经解决了一些问题,例如:
但是,容器不会完全记住身份验证.在每个请求仍然调用SAM,并且SAM仍然必须重新进行身份验证
(这对我来说听起来不太好).
然后,我继续寻找集成一些安全框架.最着名的似乎是"春天"和"四郎".当然,他们每个人都有自己的特点(可能第一个更适合特定情况,而第二个更适合另一个).对我来说更重要的是:
但是,到处都发现了相互矛盾的结论.结果:在搜索之前我现在更加困惑.
我只是安全等主题的新手,而且我是一名开发人员(我有实施的东西),因此很难及时了解每一个新版本,安全方面的进展似乎每天都在继续.
如果可能的话,我想根据个人经验得出一些事实.每个提示或建议都表示赞赏.我想确保在采取实施步骤之前我有信心.
我打算将GlassFish v3开源版本部署到生产环境中.它带有JavaDB(Apache Derby),这正是我需要的.唯一的问题是GlassFish启动时默认情况下不启动JavaDB.我必须转到命令行并输入:
asadmin start-database
Run Code Online (Sandbox Code Playgroud)
有没有办法让数据库在服务器(GlassFish)启动时自动启动?我讨厌每次在开发应用程序时手动执行此操作,我当然不希望在生产中执行此操作.
提前致谢
我试图强制JPA/Hibernate生成并只使用小写的表名.我已经实现了这样的NamingStrategy:
public class MyNamingStrategy extends DefaultNamingStrategy {
@Override
public String classToTableName(String className) {
return super.classToTableName(className).toLowerCase();
}
}
Run Code Online (Sandbox Code Playgroud)
我通过在persistence.xml中设置此属性来应用它:
<property name="hibernate.ejb.naming_strategy" value="entities.strategy.MyNamingStrategy"/>
Run Code Online (Sandbox Code Playgroud)
当我这样做时,我得到这个堆栈跟踪:
SEVERE: Exception while invoking class org.glassfish.persistence.jpa.JPADeployer prepare method
org.hibernate.DuplicateMappingException: Same physical table name [planning] references several logical table names: [Planning], [OrderProductMan_Planning]
at org.hibernate.cfg.Configuration$MappingsImpl.addTableBinding(Configuration.java:2629)
at org.hibernate.cfg.annotations.TableBinder.buildAndFillTable(TableBinder.java:254)
at org.hibernate.cfg.annotations.TableBinder.bind(TableBinder.java:177)
Run Code Online (Sandbox Code Playgroud)
什么是
相同的物理表名称[planning]引用了多个逻辑表名称:[Planning],[OrderProductMan_Planning]
意思?
来自错误的实体,尽可能简化.如果你需要休息,请告诉我.
@Entity
public class Planning implements Serializable {
@Id
@GeneratedValue(strategy = GenerationType.AUTO)
private Integer id;
private Integer qty;
@ManyToOne
private OrderProductMan orderProduct;
....
}
@Entity
@Table
public class …
Run Code Online (Sandbox Code Playgroud) 问题源于此:http://www.java.net/forum/topic/glassfish/glassfish/configuring-glassfish-logging-format - 没有答案.
默认的GlassFish 3日志记录格式非常烦人,太长了.
[#|2012-03-02T09:22:03.165+0100|SEVERE|glassfish3.1.2|javax.enterprise.system.std.com.sun.enterprise.server.logging|_ThreadID=113;_ThreadName=AWT-EventQueue-0;| MESSAGE... ]
Run Code Online (Sandbox Code Playgroud)
这只是一个可怕的默认IMO.文档只解释了所有字段,但没有解释如何更改格式:http://docs.oracle.com/cd/E18930_01/html/821-2416/abluk.html
请注意,我将SLF4J与我的webapp一起部署,它也应该选择格式.
你如何改变日志记录格式?
供参考:
这里的链接已过时:在glassfish中安装日志格式化程序 ...
这里的问题尚未得到解答:如何配置GlassFish日志记录以显示时间戳中的毫秒数?...
这里的帖子没有任何结果:http://www.java.net/forum/topic/glassfish/glassfish/cant-seem-configure- ...
看起来GlassFish日志记录配置本身就是一个问题.有人可以帮忙吗?
我正在远程机器上运行Glassfish.是否有命令从命令提示符启动GF在调试模式下?远程机器运行Ubuntu 10.04,我的机器运行Windows 7(不确定这是否重要).
我连接没有问题,知道远程启动和停止服务器的命令.我甚至找到了这个文档.不幸的是,我认为我的问题的答案是"不",但我想在放弃希望之前把它放到SO社区.
我在Windows XP上使用Glassfish3.1.使用Netbeans部署Web服务项目后,它可以正常工作.但是当我去的时候
install-path\glassfish-3.1\glassfish\domains\domain1\applications
Run Code Online (Sandbox Code Playgroud)
我没有看到我的申请.
在install\glassfish-3.1\glassfish\domains\domain1\applications\__internal
,有一个与我的项目同名的文件夹.但那个文件夹是空的.
但是如果我在linux上部署一个项目,我可以在application
文件夹下找到我的应用程序和类.
那么它们在windows上的哪个位置?
我正在编写一个JSF 2.0应用程序,我想使用CDI注释而不是"等效"JSF注释.换句话说,@ Model或@Named代替@ManagedBean,而@Inject代替@ManagedProperty.
我唯一无法工作的是@ViewScoped,它是AJAX组件所必需的.唯一可靠的解决方法是使用@SessionScoped,这不是一个好习惯.
什么是正确的做法?就像我搜索一样,我变得更加困惑.
这是在GlassFish 3.1.1上,我理解其中有Weld 1.1.0.
更新:这个问题的原始形式说我无法让@ConversationScoped工作.从那以后我发现了我的错误,我确实让它像这样工作:
@Model
@ConversationScoped
public class Abean implements Serializable {
@Inject Conversation conversation;
// stuff omitted for brevity
public String getSomething() {
if (conversation.isTransient()) conversation.begin();
return "something";
}
Run Code Online (Sandbox Code Playgroud)
这似乎可以解决问题.但是现在我的问题已经改变了.你应该在哪里调用conversation.end()?我是否必须编写过滤器来检测用户何时离开页面?或者,如果它被单独留下,那么Abean实例何时被取消引用?
第二次更新:我在这里找到了关于CDI的@ConversationScoped的非常好的讨论.
我仍然留下如何调用conversation.end()的问题.我的bean为通过AJAX更新的数据表浏览器提供有状态的支持,并且调用end()的最佳位置是用户导航离开页面.但是,如果没有编写过滤器来监控页面,我实际上并没有看到任何方法.任何关于"最佳实践"的建议都是受欢迎的.
我在Windows 7上安装了glassfish v3,但它不会在8080上启动.当我转到8080时我会得到典型的死页,就像你没想到的那样.
我试着手动启动它.C:\ glassfish3\bin asadmin start-domain我得到的是"系统找不到指定的路径"
我搜索了你的答案,但大多数问题都涉及到玻璃鱼没有启动,因为端口不是免费的.然而,这不是我的问题.
我已经尝试重新安装大约六次,甚至重新启动.没有什么变化
在IntelliJ IDEA中设置Glassfish时,我收到以下错误消息"未找到管理端口配置".
现在我搜索了一个低,但我找不到我可以设置管理端口的地方.
搜索Google我发现的所有内容都是JavaRanch上的死链接.所以我不是第一个,但解决方案丢失了.
有人知道要做什么吗?
我有一个由两个EJB实现的业务接口.
UserManagementService
@Remote
public interface UserManagementService {
// ...
}
Run Code Online (Sandbox Code Playgroud)
UserManagementServiceJpaImpl
@Stateless(name="userManagementServiceJpaImpl")
public class UserManagementServiceJpaImpl implements UserManagementService {
@EJB(beanName="userManagementDaoJpaImpl")
private UserManagementDao userManagementDao;
// ...
}
Run Code Online (Sandbox Code Playgroud)
UserManagementServiceMockImpl
@Stateless(name="userManagementServiceMockImpl")
public class UserManagementServiceMockImpl implements UserManagementService {
@EJB(beanName="userManagementDaoMockImpl")
private UserManagementDao userManagementDao;
// ...
}
Run Code Online (Sandbox Code Playgroud)
当我将应用程序部署到Glassfish 3.1时,我收到以下错误:
java.lang.RuntimeException: Error while binding JNDI name com.transbinary.imdb.service.UserManagementService for EJB : userManagementServiceMockImpl
at com.sun.ejb.containers.BaseContainer.initializeHome(BaseContainer.java:1550)
at com.sun.ejb.containers.StatelessSessionContainer.initializeHome(StatelessSessionContainer.java:202)
at com.sun.ejb.containers.ContainerFactoryImpl.createContainer(ContainerFactoryImpl.java:167)
at org.glassfish.ejb.startup.EjbApplication.loadContainers(EjbApplication.java:234)
at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:290)
at org.glassfish.ejb.startup.EjbDeployer.load(EjbDeployer.java:101)
at org.glassfish.internal.data.ModuleInfo.load(ModuleInfo.java:186)
at org.glassfish.internal.data.ApplicationInfo.load(ApplicationInfo.java:249)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:460)
at com.sun.enterprise.v3.server.ApplicationLifecycle.deploy(ApplicationLifecycle.java:240)
at org.glassfish.deployment.admin.DeployCommand.execute(DeployCommand.java:370)
at com.sun.enterprise.v3.admin.CommandRunnerImpl$1.execute(CommandRunnerImpl.java:360)
at com.sun.enterprise.v3.admin.CommandRunnerImpl.doCommand(CommandRunnerImpl.java:370)
at …
Run Code Online (Sandbox Code Playgroud)