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
web.xmlCode:<?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>
LoginController.javaCode:<?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>
UserManagerImpl.javaCode: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; } }
Is there another way to pass data from the DAO to the bean instead of explicitly calling the set methods?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()); } }
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.


Reply With Quote
