我有一个使用Spring Security的Web项目,我试图在处理身份验证成功的方法中保存cookie.但是,当我查看浏览器的cookie时,只显示JSESSIONID,当我在Spring重定向到的servlet上查看request.getCookies()时,会发生相同的情况.
我试图将cookie保存在应用程序的一个servlet中,并且cookie保存正确,因此Spring Security可能会清除响应.你有什么主意吗?
一种解决方法是将其保存在Session中,然后获取它并将cookie保存在登录重定向到的servlet上.另外一个可以节约与像JavaScript的饼干此.但我不喜欢这些解决方案.提前致谢
这是相关代码:
public class RoleBasedAuthenticationSuccessHandler extends SavedRequestAwareAuthenticationSuccessHandler implements
AuthenticationSuccessHandler {
...
// save a cookie with the selected language
Map<String, String[]> parameterMap = request.getParameterMap();
if (parameterMap.containsKey("language")) {
saveCookie("language", parameterMap.get("language")[0], response);
}
}
public static void saveCookie(String cookieName, String value, HttpServletResponse response) {
Cookie cookie = new Cookie(cookieName, value);
//maxAge is one month: 30*24*60*60
cookie.setMaxAge(2592000);
cookie.setDomain("projectName");
cookie.setPath("/");
response.addCookie(cookie);
}
}
<security:http auto-config="false" ...>
<security:form-login login-page="/login.do" authentication-success-handler-ref="redirectRoleStrategy" .../>
...
</security:http>
<bean id="redirectRoleStrategy" class="com.companyName.security.RoleBasedAuthenticationSuccessHandler">
<beans:property name="roleUrlMap">
<beans:map> …Run Code Online (Sandbox Code Playgroud) 我有一些项目使用Maven和Jenkins编译和部署,他们一直工作到现在我已经将java版本从6更改为7.
为了做到这一点,我执行了命令sudo update-alternatives --config javac并更改了/ etc/profile文件中的JAVA_HOME和PATH的值.我还修改了pom文件,因此它使用jdk 1.7:
<properties>
...
<jdk.version>1.7</jdk.version>
</properties>
<plugin>
<artifactId>maven-compiler-plugin</artifactId>
...
<configuration>
<source>${jdk.version}</source>
<target>${jdk.version}</target>
</configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)
当我在控制台上执行它们时,它们编译正常并且显示的版本是正确的:
javac -version
javac 1.7.0_55
mvn install -debug
Apache Maven 2.2.1 (rdebian-8)
Java version: 1.7.0_55
Java home: /usr/lib/jvm/java-7-openjdk-amd64/jre
Run Code Online (Sandbox Code Playgroud)
但是,当我在jenkins工作中做同样的事情时,Maven使用的是1.6版本而不是1.7版本:
javac -version
javac 1.7.0_55
mvn install -debug
Apache Maven 2.2.1 (rdebian-8)
Java version: 1.6.0_31
Java home: /usr/lib/jvm/java-6-openjdk-amd64/jre
Run Code Online (Sandbox Code Playgroud)
我还修改了用于指示新版本的maven配置文件,在Jenkins管理面板中我更改了JDK版本.但是,Maven仍在使用1.6 jdk.
你知道我怎么改变它?
我有一个使用Spring3和Hibernate4的Web项目,现在我想在不使用xml文件的情况下测试DAO.为此,我创建了一个类,该类创建了一个LocalSessionFactoryBean,其中包含应用程序的xml文件中包含的数据和一个简单的测试类.
但是,localSessionFactoryBean.getObject()返回的sessionFactory为null.我一直在寻找像一些例子这和他们有同样的问题,当我修改他们没有Spring运行.你有什么主意吗?
这是准备sessionFactory的代码:
@Configuration
@Transactional
@EnableTransactionManagement
@ComponentScan({ "com.company" })
public class HibernateInitializator {
public SessionFactory getSessionFactory() {
Properties hibernateProperties = getHibernateProperties();
DataSource dataSource = getDatasourceConfiguration();
LocalSessionFactoryBean localSessionFactoryBean = generateSessionFactoryBean(new String[] { "com.company" },
dataSource, hibernateProperties);
SessionFactory sessionFactory = localSessionFactoryBean.getObject();
HibernateTransactionManager txManager = new HibernateTransactionManager();
txManager.setSessionFactory(sessionFactory);
return sessionFactory;
}
private DataSource getDatasourceConfiguration() {
DriverManagerDataSource dataSource = new DriverManagerDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost:3306/dbName");
dataSource.setUsername("username");
dataSource.setPassword("password");
return dataSource;
}
private static LocalSessionFactoryBean generateSessionFactoryBean(String[] basePackage, DataSource dataSource,
Properties hibernateProperties) { …Run Code Online (Sandbox Code Playgroud) 我正在编写一个接收任意数量参数并返回修改的方法.我尝试过使用varargs但是它不起作用,在这里你可以看到代码的简化版本:
public static void main(String[] args) {
String hello = "hello";
String world = "world";
addPrefix(hello, world);
System.out.println("hello: " + hello + " world: " + world);
}
public static void addPrefix(String... elements) {
for (int i = 0; i < elements.length; i++) {
elements[i] = "prefix_" + elements[i];
}
for (int i = 0; i < elements.length; i++) {
System.out.println(elements[i]);
}
}
Run Code Online (Sandbox Code Playgroud)
印刷结果:
prefix_hello
prefix_world
hello: hello world: world
Run Code Online (Sandbox Code Playgroud)
如您所见,在方法内部正确修改了值,但原始变量未更改.
我已经查看了很多页面,比如这里和这里,但似乎Java将vars的值复制到a Object[],因此引用丢失了.
知道我怎么能这样做?