Hi All,

I am quite new to Spring and facing a big problem with my configuration of session beans. I guess I miss something fundamental.

I try to create a LoginController which retrieves the current username via NTLM, afterwards all other user related data should be loaded from a database and stored in a session scoped bean.


sampleapp-servlet.xml
Code:
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xmlns:aop="http://www.springframework.org/schema/aop"
       xmlns:context="http://www.springframework.org/schema/context"
       xsi:schemaLocation="http://www.springframework.org/schema/beans 
           http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
           http://www.springframework.org/schema/aop 
           http://www.springframework.org/schema/aop/spring-aop-3.0.xsd
           http://www.springframework.org/schema/context
           http://www.springframework.org/schema/context/spring-context-3.0.xsd"
           default-autowire="byName">

     <context:component-scan base-package="com.ltech.org.sample"/>

    <bean id="currentUser" class="com.ltech.org.sample.bean.User" scope="session">
          <aop:scoped-proxy/>
    </bean>

    <bean id="dataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">
           <property name="driverClassName"><value>oracle.jdbc.driver.OracleDriver</value></property>
           <property name="url"><value>jdbc:oracle:thin:@host:port:database</value></property>
           <property name="username"><value>yyy</value></property>
           <property name="password"><value>xxx</value></property>
    </bean> 

    <bean id="sqlMapClient" class="org.springframework.orm.ibatis.SqlMapClientFactoryBean">
        <property name="configLocation">
            <value>/WEB-INF/classes/sqlMap-config.xml</value>
        </property>
    </bean>
    
	<bean id="userDAO" class="com.ltech.org.sample.dao.UserDAOImpl">
        <property name="dataSource"><ref local="dataSource"/></property>
        <property name="sqlMapClient"><ref local="sqlMapClient"/></property>
    </bean>
  
    <bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass">
           <value>org.springframework.web.servlet.view.JstlView</value>
        </property>
        <property name="prefix"><value>/WEB-INF/jsp/</value></property>
        <property name="suffix"><value>.jsp</value></property>
    </bean>
 
</beans>
web.xml
Code:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE web-app PUBLIC '-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN' 'http://java.sun.com/dtd/web-app_2_3.dtd'>

<web-app>
	<filter>
		<filter-name>NTLM_HTTP_Authentication_Filter</filter-name>
		<filter-class>com.xxx.ntlm.NtlmHttpFilter</filter-class>
		<init-param>
			<param-name>jcifs.http.domainController</param-name>
			<param-value>xx.xxx.xx.xx</param-value>
		</init-param>
		<init-param>
			<param-name>jcifs.http.insecureBasic</param-name>
			<param-value>false</param-value>
		</init-param>
		<init-param>
			<param-name>jcifs.http.enableBasic</param-name>
			<param-value>false</param-value>
		</init-param>
	</filter>
	
	<filter>
		<filter-name>springFilter</filter-name>
		<filter-class>
			org.springframework.web.filter.RequestContextFilter
		</filter-class>
	</filter>

	<filter-mapping>
		<filter-name>NTLM_HTTP_Authentication_Filter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<filter-mapping>
		<filter-name>springFilter</filter-name>
		<url-pattern>/*</url-pattern>
	</filter-mapping>

	<listener>
		<listener-class>
			org.springframework.web.context.request.RequestContextListener
		</listener-class>
	</listener>

	<servlet>
		<servlet-name>sampleapp</servlet-name>
		<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
		<load-on-startup>1</load-on-startup>
	</servlet>

	<servlet-mapping>
		<servlet-name>sampleapp</servlet-name>
		<url-pattern>*.htm</url-pattern>
	</servlet-mapping>

	<welcome-file-list>
		<welcome-file>
			index.jsp
    	</welcome-file>
	</welcome-file-list>

</web-app>
LoginController.java
Code:
package com.ltech.org.sample.web;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.springframework.web.bind.annotation.RequestMapping;
import java.io.IOException;
import java.util.Map;
import java.util.HashMap;
import com.ltech.org.sample.bean.User;
import com.ltech.org.sample.bi.UserManager;
import com.ltech.org.sample.dao.UserDAO;

@Controller
public class LoginController {
    protected final Logger logger = LoggerFactory.getLogger(getClass());

    private UserManager userManager;
     
    @RequestMapping(value = "/login.htm")    
    public ModelAndView doLogin(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        String isid = request.getRemoteUser();

        logger.info("login " + isid);
        
        userManager.populate(isid);  
        
        Map myModel = new HashMap();
        myModel.put("currentUser", userManager.getCurrentUser());
        
        return new ModelAndView("login", "model", myModel);
    }
    
    public void setUserManager(UserManager pm) {
    	userManager = pm;
    }

    public UserManager getUserManager() {
        return userManager;
    }
	
}
UserManagerImpl.java
Code:
package com.ltech.org.sample.bi;

import com.ltech.org.sample.bean.User;
import com.ltech.org.sample.dao.UserDAO;
import org.springframework.stereotype.Service;

@Service("userManager")
public class UserManagerImpl implements UserManager {
    private User currentUser;
    private UserDAO userDAO;
    
    public User getCurrentUser() {
        return currentUser;
    }
    
    public void setCurrentUser(User currentUser) {
        this.currentUser = currentUser;
    }
    
	public UserDAO getUserDAO() {
		return userDAO;
	}
	public void setUserDAO(UserDAO userDAO) {
		this.userDAO = userDAO;
	}
	
// NOT WORKING !!! every user shares the same session bean
	public void populateNotWorking(String isid)
	{
		currentUser  = userDAO.selectUserById(isid);
	}

// WORKING !!! every user has its own user session bean
	public void populate(String isid)
	{
		User tmp = userDAO.selectUserById(isid);
		currentUser.setLastName(tmp.getLastName());
		currentUser.setFirstName(tmp.getFirstName());
		currentUser.setIsid(tmp.getIsid());
		currentUser.setEmail(tmp.getEmail());		
	}
}
Is there another way to pass data from the DAO to the bean instead of explicitly calling the set methods?

If I use the populateNotWorking() method, the session bean is overwritten with another user data on login. So everybody shares the same bean.

I guess the "currentUser = userDAO.selectUserById(isid);" statement is not referencing the "proxied" bean. Maybe someone could help me with this.

Thanks a lot in advance.