如何确保从hibernate.cfg.xml加载所有属性,然后以编程方式添加其他属性?我看到了以下代码片段,但它看起来像一个全新的配置,而不是现有配置的补充.
Configuration c = new Configuration();
c.configure();
c.setProperty("hibernate.connection.username", "abc" );
c.setProperty("hibernate.connection.password", "defgh629154" );
Run Code Online (Sandbox Code Playgroud) 我的目标是以安全的方式使用JDBC/Hibernate对数据库进行身份验证,而无需以纯文本形式存储密码.代码示例赞赏.我已经在使用华夫饼干对用户进行身份验证,因此如果有某种方法可以使用从用户那里获得的凭证,并将其转发给数据库,那就太好了.
两个问题:
我找到了一些有关在此线程中连接到SQL Server的有用信息.但是,我期待Tomcat将在默认帐户下运行,例如本地系统或其他东西.据我所知,该帐户不能用于对数据库进行Windows身份验证.
我的解决方案:
我最终使用上述线程中提到的方法.它不是将Tomcat服务作为本地系统运行,而是以用户身份运行.该用户有权访问数据库.我的hibernate配置文件配置如下:
<property name="hibernate.connection.url">
jdbc:sqlserver://system:port;databaseName=myDb;integratedSecurity=true;
</property>
Run Code Online (Sandbox Code Playgroud)
对那些提供回复的人
我感谢大家的帮助,我将尝试一些线程中提到的技术.我对某些响应的问题是它们需要对称加密,这需要一个密钥.保持密钥的秘密几乎与将密码以纯文本格式存储完全相同.
@Provider
public class JerseyExceptionMapper implements ExceptionMapper<JerseyException> {
@Override
public Response toResponse(JerseyException jerseyException) {
return Response.status(jerseyException.getErrorCode()).
entity(jerseyException.getJsonResponseObj()).
type(MediaType.APPLICATION_JSON).
build();
}
}
Run Code Online (Sandbox Code Playgroud)
当您在中使用<error-page>组件时,上面的代码会产生不需要的结果web.xml.例如,如果my Response.status设置为400而我的error-page组件定义<error-code>为400,则Web服务器会将请求重定向到中定义的位置web.xml.
这显然不是我想要的REST请求.我在StackOverflow上读了另一篇帖子,说明了请求被转移到的原因error-page是因为HttpServletResponse.sendError(400)设置了.该帖子说如果你设置了HttpServletResponse.setStatus(400),那error-page将被忽略.
如果这是真的,我不知道它是如何有用的,因为我没有实现Jersey代码.我看到的选项是调查Response类源代码,并可能重新实现status方法或其他Jersey代码.这里有一个简单的选择还是我缺少的东西?
从本质上讲,我的问题是:鉴于我正在使用Jersey for REST而我正在使用错误页面,我web.xml如何使用上面的代码而忽略了error-page仅用于Jersey代码?导致HTTP错误的任何其他代码都应该转到error-page.或者是否有其他解决方案不涉及error-page但将与我想要的工作相同?
这是场景.我是在AD域中的Web服务器上运行的代码.有些客户与我有联系.如何在不让客户在浏览器中填写表单的情况下获取该客户端的用户名?必须在Web服务器端使用Java技术.
编辑:
我最终使用了Spring Security Negotiate Filter,如下面的链接所述.有一个教程可用.在servlet中使用request.getPrincipal().getName()会给出用户名.
java spring spring-security windows-authentication single-sign-on
我是Java Enterprise和Spring的新手,但我对标准Java有很强的把握.我正在查看现有的Web应用程序项目.该项目使用Tomcat/Spring/Hibernate,我理解这是相当普遍的.它还使用DWR进行远程方法调用.我发现分离职责有点困难:Tomcat负责什么,Spring负责什么,请求如何从一个到另一个,以及Spring的主要部分如何组合在一起.我已经阅读了大量有关Spring的文档,特别是有关bean和bean工厂的文档,我还在阅读更多内容.我们欢迎您提出任何建议,但我会提供一些具体问题.
问题1:web.xml在哪里适合(什么时候使用/调用,从哪里调用)?
代码示例1:
<servlet>
<servlet-name>qrst</servlet-name>
<display-name>qrst Servlet</display-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
Run Code Online (Sandbox Code Playgroud)
上面的代码片段做了什么(或者它会导致什么原因发生)?在我的网络应用程序的某些时候,qrst.jsp被使用; 是DispatcherServlet使用servlet名称调用qrst.jsp吗?那么servlet名称的意义是什么?什么是启动时的负载?
代码示例2:
<context-param>
<param-name>contextConfigLocation</param-name>
<param-value>
/someLocation/some-servlet.xml
</param-value>
</context-param>
Run Code Online (Sandbox Code Playgroud)
链接或解释上述内容的作用?我可以从查看XML文件看到它包含bean定义,我确实了解bean是什么以及它们是如何使用的,但是我不知道有关于此的任何其他细节并希望如此.
代码示例3:
<servlet>
<servlet-name>dwr-invoker</servlet-name>
<display-name>DWR</display-name>
<servlet-class>
org.directwebremoting.servlet.DwrServlet
</servlet-class>
<init-param>
<param-name>classes</param-name>
<param-value>
somepackage.someclass
</param-value>
</init-param>
<load-on-startup>2</load-on-startup>
</servlet>
Run Code Online (Sandbox Code Playgroud)
从我读到的关于bean的内容来看,我相信那些init-param元素只是在servlet的java类中设置的参数.servlet名称的重要性是什么,以及启动时的负载如何?Web应用程序以某种方式"知道"何时发生AJAX(dwr)调用,而不是第一次加载Web应用程序时(第一次加载时应该使用qrst.jsp).怎么知道这个?它如何决定将请求路由到DWR而不是qrst.jsp?这是做什么的?
谢谢.
在gradle中,我有以下build.gradle,导致很多JAR被复制到'sources'文件夹,但只有jersey-media-moxy-2.22.2-sources.jar实际上包含源代码:
defaultTasks 'run'
repositories {
mavenCentral()
}
configurations {
sources {
description = 'sources download'
transitive = true
}
copysource {
extendsFrom sources
}
}
dependencies {
sources group: 'org.glassfish.jersey.media', name: 'jersey-media-moxy', version: '2.22.2', classifier: 'sources'
}
task copySources(type: Copy) {
println 'Copying dependencies to sources directory'
into "sources/"
from configurations.copysource
}
task run (dependsOn: ['copySources']){
println 'Downloading JARs'
}
run << {
println 'Downloads complete. Finished.'
}
Run Code Online (Sandbox Code Playgroud)
如何修改构建以获取所有源代码(包括传递/依赖源)?我不想要非源罐子.我不明白为什么分类器没有传递,所以请澄清我的误解.
另外,我知道这不是使用gradle的最佳方式.这是(部分)临时步骤,直到我们迁移构建系统.
场景:我在连接到服务器的客户端上运行代码,并使用Web服务检索有关SharePoint列表的数据.我正在使用Visual Studio 2010"服务引用"来获取我的SP站点的Web服务并从列表中获取我的数据.有用.现在我该如何编写代码,以便当我想从Test转到Production时,我的Web服务调用仍然有效?请注意,Web服务是SharePoint Web服务,我没有写它.我只是用它.我建议可能吗?我确实能够确保两个环境中的站点完全相同(URLS除外)(例如备份SP站点并将其投入生产).谢谢你的任何建议.
摘要:
基本上我正在寻找从测试到生产的最佳方式,而无需重新编译消耗SP Web服务的代码.此外,作为附注,如果有人知道测试/生产sharepoint站点必须有多相似,[为了使Web服务能够在没有任何东西的情况下工作,除了URL被更改] ..这将是有用的信息.
解
项目配置文件可用于指定Web服务位置.VS项目中的.svcdatamap和其他文件仅供设计时使用,实际用于连接SharePoint Web服务的URL作为参数传递给System.Data.Services.Client.DataServiceContext对象.这只是切线相关,但要创建自己的WCF Web服务,请参阅此链接.顺便说一句,Web服务无需重新编译即可在SharePoint列表具有相同列表名称的任何位置工作,并且您要查询的列具有相同的名称.
我们的项目使用Hibernate的程序Configuration设置来设置SessionFactory等.我只是将我们从版本3迁移到了Hibernate的第4版.现在我收到错误"元素类型"hibernate-mapping"必须声明".它说的是SaxParseException.这很好,但我检查了我的WEB-INF/lib目录和Hibernate的4版核心.jar文件,所以它在类路径上.
起初我认为这是因为Hibernate团队从中迁移了
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://hibernate.sourceforge.net/hibernate-mapping-3.0.dtd">
Run Code Online (Sandbox Code Playgroud)
至
<!DOCTYPE hibernate-mapping PUBLIC
"-//Hibernate/Hibernate Mapping DTD 3.0//EN"
"http://www.hibernate.org/dtd/hibernate-mapping-3.0.dtd">
Run Code Online (Sandbox Code Playgroud)
但这并不能解决错误.到底是怎么回事?在我使用Hibernate的XML配置文件的单独项目中,我做了相同的迁移,并且它很好.请注意,在我的环境中必须使用类路径,无法从Internet或类似的地方下载DTD.反正不应该这样.
编辑:这是所要求的例外情况:
Caused by: org.xml.sax.SAXParseException; systemId: ; lineNumber: 6; columnNumber: 20; Element type "hibernate-mapping" must be declared.
at org.apache.xerces.framework.XMLParser.reportError(XMLParser.java:1213)
at org.apache.xerces.validators.common.XMLValidator.reportRecoverableXMLError(XMLValidator.java:1807)
at org.apache.xerces.validators.common.XMLValidator.validateElementAndAttributes(XMLValidator.java:3633)
at org.apache.xerces.validators.common.XMLValidator.callStartElement(XMLValidator.java:1229)
at org.apache.xerces.framework.XMLDocumentScanner$ContentDispatcher.dispatch(XMLDocumentScanner.java:938)
at org.apache.xerces.framework.XMLDocumentScanner.parseSome(XMLDocumentScanner.java:381)
at org.apache.xerces.framework.XMLParser.parse(XMLParser.java:1098)
Run Code Online (Sandbox Code Playgroud) 示例数据库表:
示例所需输出(由hibernate查询生成):
在上面的示例中,第三条记录将从结果中排除,因为msgFrom列是相同的.假设Java/Hibernate类叫做Message.我希望结果作为Message对象列表(或者可以转换为Message的对象)返回.我想尽可能使用Criteria API.我在SO上看到了这个例子,看起来很相似,但我还没有正确实现它.
select e from Message e
where e.msgFrom IN (select distinct m.msgFrom
from Message m
WHERE m.msgTo = ?
AND m.msgCheck = 0");
Run Code Online (Sandbox Code Playgroud)
我这样做的原因是要对数据库上的不同记录进行过滤,所以我对我必须在应用程序服务器上过滤任何内容的答案不感兴趣.
编辑:文章基本上显示了我想要做的事情.http://oscarvalles.wordpress.com/2008/01/28/sql-distinct-on-one-column-only/
Spring-servlet.xml:
<aop:config>
<aop:advisor advice-ref="interceptor" pointcut="@annotation(Validator)"/>
</aop:config>
<bean id="interceptor" class="org.aopalliance.intercept.MethodInterceptor" />
Run Code Online (Sandbox Code Playgroud)
MethodInterceptor invoke():
if (!valid){
RequestDispatcher rd = request.getRequestDispatcher(errorView);
rd.forward(request, response);
}
Run Code Online (Sandbox Code Playgroud)
工作流程控制:
在使用注释注释的任何Spring控制器方法之前调用我的拦截器Validator.目的是验证请求,如果验证失败,则将请求转发到其他视图.这通常有效.如果有错误(!valid),RequestDispatcher.forward则调用.这会导致调用另一个Spring控制器方法,最终显示错误视图.这通常有效.
问题:
对于某些Spring控制器,我的RequestDispatcher errorView导致请求被转发回相同的方法,导致无限循环(invoke()被反复调用).我认为这是因为Spring控制器的请求映射(见下文)是如何设置的.
错误视图: @RequestMapping(value = URL, params="error")
普通视图: @RequestMapping(value = URL, params="proceed")
因此,当第一个请求被路由时,它会在请求参数中"继续".然后当出现错误并且RequestDispatcher转发到查询字符串中带有"错误"参数的视图时,它应转发到上面的"错误视图"方法,但事实并非如此.它始终转发到'proceed'方法,导致无限循环MethodInterceptor invoke().这似乎是因为'proceed'参数仍然在HttpServletRequest中.然而,这并不容易解决,因为拦截器的全部意义在于它不了解Spring控制器本身 - 它只知道是否发生了错误,并且如果发生错误它应该转发到错误视图.
解决方法:
使用下面的请求映射,它解决了问题.这可能是因为HttpServletRequest使用key = value表示法时会覆盖参数.
错误视图: @RequestMapping(value = URL, params="view=error")
普通视图: @RequestMapping(value = URL, params="view=proceed")
题
如何在不诉诸上述解决方法的情况下"正确"解决问题?是否有更标准的方法转发到正确的弹簧控制器?
java ×5
hibernate ×4
spring ×3
criteria-api ×1
dwr ×1
gradle ×1
jax-rs ×1
jersey ×1
spring-mvc ×1
sql ×1