菜園子

          BlogJava 首頁 新隨筆 聯系 聚合 管理
            7 Posts :: 1 Stories :: 31 Comments :: 0 Trackbacks

          2011年9月16日 #

               摘要: 關于Hibernate的查詢從數據庫映射到JavaBean     Hibernate除了HQL外,還支持SQL的查詢,API為createSQLQuery(sql),如果數據庫使用的是Oracle,由于數據庫表中的列都是大寫,所以在從resultset到javabean的時候,需要完全匹配。 一般我們會用DTO或者作為DTO的Entity,無論是采用add...  閱讀全文
          posted @ 2014-08-27 15:08 GhostZhang 閱讀(10129) | 評論 (2)編輯 收藏

          升級Spring3.1RC2 和Hibernate4.0.0CR7遇到的一些問題及解決

          Spring3.1RC2支持

          1. Quartz2

          2. Hibernate4,

          3. New HandlerMethod-based Support Classes For Annotated Controller Processing

          4. Consumes and Produces @RequestMapping Conditions

          5. Working With URI Template Variables In Controller Methods

          6. Validation For @RequestBody Method Arguments  //and so on....

          7. Spring MVC 3.1 的annotation可以參看下http://starscream.iteye.com/blog/1098880 

          Hibernate 4可以查看http://community.jboss.org/wiki/HibernateCoreMigrationGuide40 

          下面主要說一下我在升級過程中遇到的一些問題及解決辦法。

          Maven的repository始終無法升級到SpringRC2,可能服務器有問題吧,目前暫時是從官方下載的整個SpringRC2的zip包。版本號是:3.1.0.RC2

          Hibernate可以從repository中升級到4.0.0.CR7,新增的依賴包有jandex-1.0.3.Final.jar,jboss-logging-3.1.0.CR2.jar,jboss-transaction-api_1.1_spec-1.0.0.Final.jar。

          Quartz升級到2.1.1,Ehcache-core升級到2.5.0

          Spring3.1取消了HibernateTemplate,因為Hibernate4的事務管理已經很好了,不用Spring再擴展了。所以以前的Dao需要改寫,直接調用Hibernate 的Session進行持久化。

          Spring的配置:

          sessionFactoryorg.springframework.orm.hibernate3.annotation.AnnotationSessionFactoryBean換成org.springframework.orm.hibernate4.LocalSessionFactoryBean

          Spring的配置:

          <prop key="hibernate.cache.provider_class">org.hibernate.cache.EhCacheProvider</prop>改為

          <prop key="hibernate.cache.provider_class">net.sf.ehcache.hibernate.EhCacheProvider</prop>

          EhCacheRegionFactory使用配置:

          <prop key="hibernate.cache.region.factory_class">org.hibernate.cache.ehcache.EhCacheRegionFactory</prop>

          使用Hibernate所有的openSession()改為getCurrentSession()

          Spring 的配置:Hibernate transactionManager從3改為4,如下:

          <bean id="txManager" class="org.springframework.orm.hibernate4.HibernateTransactionManager">

                  <property name="sessionFactory" ref="sessionFactory"/>

              </bean>

          Spring @ResponseBody輸出是亂碼的問題:原來使用的是:

          <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter">  

          改為:

          <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">  

          <property name = "messageConverters">

          <list>  

          <bean class = "org.springframework.http.converter.StringHttpMessageConverter">  

          <property name = "supportedMediaTypes">  

          <list>

          <value>text/plain;charset=UTF-8</value>

          </list>

          </property> 

          </bean>

          <bean class = "org.springframework.http.converter.json.MappingJacksonHttpMessageConverter">  

          <property name = "supportedMediaTypes">  

          <list>

          <value>text/plain;charset=UTF-8</value>

          <value>application/json;charset=UTF-8</value>

          </list>  

          </property> 

          </bean>

          </list>  

          </property>  

          這樣比每個Controller都加上@RequestMapping(value = "/showLeft", method = RequestMethod.GET)
           produces = "text/plain; charset=utf-8"方便的多。

          Blob,以前配置:

          @TypeDefs({@TypeDef(name="clob",typeClass=ClobStringType.class),@TypeDef(name="blob",typeClass=BlobByteArrayType.class)})

          @Lob

          @Type(type="blob")

          public byte[] getPic() {

          return pic;

          }

          現在改為:

              @Lob

          public byte[] getPic() {

          return pic;

          }

          簡單很多。

           

          l 待續。。。

          posted @ 2011-12-13 15:36 GhostZhang 閱讀(3368) | 評論 (2)編輯 收藏

          Shiro權限框架

          開發系統中,少不了權限,目前java里的權限框架有SpringSecurity和Shiro(以前叫做jsecurity),對于SpringSecurity:功能太過強大以至于功能比較分散,使用起來也比較復雜,跟Spring結合的比較好。對于初學Spring Security者來說,曲線還是較大,需要深入學習其源碼和框架,配置起來也需要費比較大的力氣,擴展性也不是特別強。

          對于新秀Shiro來說,好評還是比較多的,使用起來比較簡單,功能也足夠強大,擴展性也較好。聽說連Spring的官方都不用Spring Security,用的是Shiro,足見Shiro的優秀。網上找到兩篇介紹:http://www.infoq.com/cn/articles/apache-shiro http://www.ibm.com/developerworks/cn/opensource/os-cn-shiro/,官網http://shiro.apache.org/ ,使用和配置起來還是比較簡單。下面只是簡單介紹下我們是如何配置和使用Shiro的(暫時只用到了Shiro的一部分,沒有配置shiro.ini文件)。

          首先是添加過濾器,在web.xml中:

          <filter>

          <filter-name>shiroFilter</filter-name>

          <filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>

          <init-param>

                      <param-name>targetFilterLifecycle</param-name>

                      <param-value>true</param-value>

               </init-param>

          </filter>    

          <filter-mapping>

          <filter-name>shiroFilter</filter-name>

          <url-pattern>/*</url-pattern>

          </filter-mapping>

          權限的認證類:

          public class ShiroDbRealm extends AuthorizingRealm {

              @Inject

              private UserService userService ;

              

              /**

           * 認證回調函數,登錄時調用.

           */

          protected AuthenticationInfo doGetAuthenticationInfo(AuthenticationToken authcToken) 
          throws AuthenticationException {

          UsernamePasswordToken token = (UsernamePasswordToken) authcToken;

          User useruserService.getUserByUserId(token.getUsername());

          if (user!= null) {  

              return new SimpleAuthenticationInfo(user.getUserId(), user.getUserId(), getName());

          else {

          return null;

          }

          }

          /**

           * 授權查詢回調函數, 進行鑒權但緩存中無用戶的授權信息時調用.

           */

          protected AuthorizationInfo doGetAuthorizationInfo(PrincipalCollection principals) {

          String loginName = (String) principals.fromRealm(getName()).iterator().next();

          User useruserService.getUserByUserId(loginName);

          if (user != null) {

          SimpleAuthorizationInfo info = new SimpleAuthorizationInfo();

          info.addStringPermission("common-user");

          return info;

          else {

          return null;

          }

          }

          }

          Spring的配置文件:

          <?xml version="1.0" encoding="UTF-8"?>

          <beans >

          <description>Shiro Configuration</description>

          <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor"/>

          <bean id="securityManager" class="org.apache.shiro.web.mgt.DefaultWebSecurityManager">

          <property name="realm" ref="shiroDbRealm" />

          </bean>

          <bean id="shiroDbRealm" class="com.company.service.common.shiro.ShiroDbRealm" />

              <bean id="shiroFilter" class="org.apache.shiro.spring.web.ShiroFilterFactoryBean">

                  <property name="securityManager" ref="securityManager"/>

                  <property name="loginUrl" value="/common/security/login" />

                  <property name="successUrl" value="/common/security/welcome" />

                  <property name="unauthorizedUrl" value="/common/security/unauthorized"/>

                  <property name="filterChainDefinitions">

                      <value>

                          /resources/** = anon

                          /manageUsers = perms[user:manage]

                          /** = authc

                      </value>

                  </property>

              </bean>

          <bean id="lifecycleBeanPostProcessor" class="org.apache.shiro.spring.LifecycleBeanPostProcessor" />

              <bean class="org.springframework.aop.framework.autoproxy.DefaultAdvisorAutoProxyCreator" depends-on="lifecycleBeanPostProcessor"/>

              <bean class="org.apache.shiro.spring.security.interceptor.AuthorizationAttributeSourceAdvisor">

                  <property name="securityManager" ref="securityManager"/>

              </bean>

          </beans>

          登錄的Controller:

          @Controller

          @RequestMapping(value = "/common/security/*")

          public class SecurityController {

              @Inject

              private UserService userService;

              @RequestMapping(value = "/login")

              public String login(String loginName, String password,
          HttpServletResponse response, HttpServletRequest request) throws Exception {

                  User user = userService.getUserByLogin(loginName);

                      if (null != user) {

                          setLogin(loginInfoVO.getUserId(), loginInfoVO.getUserId());

                          return "redirect:/common/security/welcome";

                      } else {

                          return "redirect:/common/path?path=showLogin";

                      }

              };

              public static final void setLogin(String userId, String password) {

                  Subject currentUser = SecurityUtils.getSubject();

                  if (!currentUser.isAuthenticated()) {

                      //collect user principals and credentials in a gui specific manner 

                      //such as username/password html form, X509 certificate, OpenID, etc.

                      //We'll use the username/password example here since it is the most common.

                      //(do you know what movie this is from? ;)

                      UsernamePasswordToken token = new UsernamePasswordToken(userId, password);

                      //this is all you have to do to support 'remember me' (no config - built in!):

                      token.setRememberMe(true);

                      currentUser.login(token);

                  }

              };

              

              @RequestMapping(value="/logout")

              @ResponseBody

              public void logout(HttpServletRequest request){

                  Subject subject = SecurityUtils.getSubject();

                  if (subject != null) {           

                      subject.logout();

                  }

                  request.getSession().invalidate();

              };

          }

          注冊和獲取當前登錄用戶:

              public static final void setCurrentUser(User user) {

                  Subject currentUser = SecurityUtils.getSubject();

                  if (null != currentUser) {

                      Session session = currentUser.getSession();

                      if (null != session) {

                          session.setAttribute(Constants.CURRENT_USER, user);

                      }

                  }

              };

              public static final User getCurrentUser() {

                  Subject currentUser = SecurityUtils.getSubject();

                  if (null != currentUser) {

                      Session session = currentUser.getSession();

                      if (null != session) {

                          User user = (User) session.getAttribute(Constants.CURRENT_USER);

                          if(null != user){

                              return user;

                          }

          }

          }

              };

          需要的jar包有3個:shiro-core.jar,shiro-spring.jar,shiro-web.jar。感覺shiro用起來比SpringSecurity簡單很多。

          posted @ 2011-09-16 21:36 GhostZhang 閱讀(32459) | 評論 (14)編輯 收藏

          主站蜘蛛池模板: 华池县| 贵德县| 曲水县| 惠州市| 遂溪县| 苗栗县| 岳西县| 金塔县| 措勤县| 商南县| 西丰县| 铜鼓县| 含山县| 贵州省| 会东县| 永城市| 南阳市| 虹口区| 黑山县| 玛纳斯县| 敦煌市| 江门市| 义乌市| 于田县| 什邡市| 钦州市| 灌云县| 甘孜县| 罗山县| 台南县| 五莲县| 万州区| 通榆县| 泸定县| 邢台市| 元氏县| 黔江区| 文山县| 湟源县| 佛教| 张北县|