spring Scurity终于测试OK了,复杂的功能还待深入研究!发布出来一起探讨吧!

就是因 为研究它,我的个天啦!头都大了一圈!还待修改完整版!我的目标不是每个项目拿到它就能使用!到时再说啦。。。

虽然只是一个登陆,但里面的知识真是太广了!什么md5 盐值   加密 生成,cookie 生成序列保存数据库,

sessionID防护的一大堆安全,资源权限分配和保护 等。。。值得一学的框架!

sql 脚本也在项目一起

项目源码下载:http://download.csdn.net/detail/liangrui1988/5916359

官方文档:http://static.springsource.org/spring-security/site/docs/3.0.x/reference/springsecurity.html

jar 下载  http://www.springsource.org/download/community

项目图片:

部分代码:

applicationContext-security2.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans:beans
  3. xmlns="http://www.springframework.org/schema/security"
  4. xmlns:beans="http://www.springframework.org/schema/beans"
  5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  8. http://www.springframework.org/schema/security
  9. http://www.springframework.org/schema/security/spring-security.xsd">
  10.  
  11. <!-- 使用security="none"忽略所有过滤器会提升性能,而是用匿名登录功能可以实现权限操作的一致性,
  12. 具体应用时还需要大家根据实际情况自行选择了。
  13. <http pattern="/" security="none"/> -->
  14. <http pattern="/image" security="none"/>
  15. <!--entry-point-ref="" 未登录的切入点
  16. servlet-api-provision="true" 默认启用 保存没有登录之前的请求
  17. access-denied-page="" 被拦截之后的页面-->
  18. <http auto-config="true" entry-point-ref="myAuthenticationEntryPoint"
  19. access-denied-page="/error/page403.jsp" >
  20.  
  21. <!-- 在配置文件中使用auto-config="true"就会启用匿名登录功能。在启用匿名登录之后,
  22. 如果我们希望允许未登录就可以访问一些资源,可以在进行如下配置。 IS_AUTHENTICATED_ANONYMOUSLY=ROLE_ANONYMOUS-->
  23. <intercept-url pattern="/" access="ROLE_ANONYMOUS"/>
  24. <anonymous username="游客"/>
  25.  
  26. <!-- 只要登 陆的用户都可以访问项目资源 除了受保护的次源 -->
  27. <intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY" />
  28.  
  29. <!-- 自定义过滤器 在之前执行 -->
  30. <custom-filter ref="filterSecurityInterceptor" before="FILTER_SECURITY_INTERCEPTOR" />
  31. <!-- 切换用户 -->
  32. <custom-filter position="SWITCH_USER_FILTER" ref="switchUserProcessingFilter" />
  33. <!-- 获取 ip -->
  34. <custom-filter position="CONCURRENT_SESSION_FILTER" ref="concurrentSessionFilter"/>
  35.  
  36. <!-- 用户退出 session无效 -->
  37. <logout invalidate-session="true"
  38. logout-url="/j_spring_security_logout" />
  39.  
  40. <!-- 保存cookie 保存用户名密码多长时间-->
  41. <!--60*60*24*7=604800= 一个星期的秒数 -->
  42. <remember-me key="myApp" token-validity-seconds="604800" data-source-ref="authoritiesData" />
  43.  
  44. <!-- 用户登陆 默认跳转页面 and 失败面页 -->
  45. <form-login default-target-url="/index.jsp" authentication-failure-url="/login.jsp?error=true"/>
  46.  
  47. <!-- 防御会话伪造 none,migrateSession和newSession。默认使用的是migrationSession,
  48. <session-management session-fixation-protection="migrateSession"/>-->
  49.  
  50. <!-- 会话管理 默认30分钟 ,空闲30分钟后,自动销毁
  51. session-authentication-strategy 会话认证策略 session-authentication-strategy-ref="currentControllerStrategy" -->
  52. <session-management invalid-session-url="/login.jsp"
  53. session-authentication-strategy-ref="currentControllerStrategy"/>
  54. <!-- <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
  55. </session-management> -->
  56.  
  57. <!-- 允许同时登陆几个,如果溢出这个数则报异常 -->
  58. <!-- error-if-maximum-exceeded="true"=不允许把在线用户踢出去-->
  59.  
  60. </http>
  61. <!--注意必须放在用来验证权限的FilterSecurityInterceptor之后,这样可以控制当前用户是否拥有切换用户的权限 -->
  62. <beans:bean id="switchUserProcessingFilter"
  63. class="org.springframework.security.web.authentication.switchuser.SwitchUserFilter" autowire="byType">
  64. <beans:property name="targetUrl" value="/manager.jsp"/>
  65. </beans:bean>
  66.  
  67. <!-- 未登录的切入点 -->
  68. <beans:bean id="myAuthenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
  69. <beans:property name="loginFormUrl" value="/login.jsp"></beans:property>
  70. </beans:bean>
  71.  
  72. <!-- 认证管理 -->
  73. <authentication-manager>
  74. <authentication-provider>
  75. <!-- md5加密 -->
  76. <password-encoder hash="md5">
  77. <!-- 盐值加密 -->
  78. <salt-source user-property="username"/>
  79. </password-encoder>
  80. <!-- 数据库是自定义的,所以要修改sql查询语句 用户信息 和 权限信息 -->
  81. <jdbc-user-service data-source-ref="authoritiesData"
  82. users-by-username-query="select username,password,status as enabled
  83. from user
  84. where username=?"
  85. authorities-by-username-query="select u.username,r.name as authority
  86. from user u
  87. join user_role ur
  88. on u.id=ur.user_id
  89. join role r
  90. on r.id=ur.role_id
  91. where u.username=?"/>
  92.  
  93. </authentication-provider>
  94.  
  95. </authentication-manager>
  96. <!-- 过虑拦截器 作用:就是把自定义的数据库查询字段 封装成security规范 的字段-->
  97. <beans:bean id="filterSecurityInterceptor"
  98. class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor" autowire="byType">
  99. <beans:property name="securityMetadataSource" ref="filterInvocationSecurityMetadataSource" />
  100. <beans:property name="authenticationManager" ref="org.springframework.security.authenticationManager"/>
  101. </beans:bean>
  102.  
  103. <!-- 替换原有功能的切入点 从数据库里查询出数据 资源==角色 注入数据库源 和查询结果的sql语句
  104. 把受保护的资源(jsp页面)写入到数据库中 需要这样的配置-->
  105.  
  106. <beans:bean id="filterInvocationSecurityMetadataSource"
  107.  
  108. class="accp.util.JdbcFilterInvocationDefinitionSourceFactoryBean">
  109. <beans:property name="dataSource" ref="authoritiesData"/>
  110. <beans:property name="resourceQuery" value="
  111. select re.res_string,r.name
  112. from role r
  113. join resc_role rr
  114. on r.id=rr.role_id
  115. join resc re
  116. on re.id=rr.resc_id
  117. order by re.priority
  118. "/>
  119. </beans:bean>
  120.  
  121. <!-- 提示信息 国际化-->
  122. <beans:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
  123. <beans:property name="basename" value="classpath:messages_zh_CN"/>
  124. </beans:bean>
  125.  
  126. <!-- 获取用户 ip 和用户绑定,(如是果设了最大会话为1,不用担心没注销用户,无法再登陆!)
  127. 这样在同一个电脑是可以重复登陆, -->
  128. <beans:bean id="concurrentSessionFilter"
  129. class="org.springframework.security.web.session.ConcurrentSessionFilter">
  130. <beans:property name="sessionRegistry" ref="sessionRegistry"/>
  131. </beans:bean>
  132.  
  133. <beans:bean id="sessionRegistry"
  134. class="accp.myFilter.SmartSessionRegistry"/>
  135.  
  136. <beans:bean id="currentControllerStrategy"
  137. class="accp.myFilter.SmartConcurrentSessionControlStrategy">
  138. <beans:constructor-arg ref="sessionRegistry"/>
  139. <!-- 允许同时登陆几个,如果溢出这个数则报异常 -->
  140. <!-- error-if-maximum-exceeded="true"=不允许把在线用户踢出去 -->
  141. <beans:property name="exceptionIfMaximumExceeded" value="true"/>
  142. <beans:property name="maximumSessions" value="1"/>
  143. </beans:bean>
  144.  
  145. <!-- 记录日志 -->
  146. <beans:bean class="accp.myFilter.AuditListener"/>
  147.  
  148. </beans:beans>

applicationContext-action.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans
  3. xmlns="http://www.springframework.org/schema/beans"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xmlns:p="http://www.springframework.org/schema/p"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  8. ">
  9. <!--*************************注入services层接口到action******************************-->
  10.  
  11. <!-- 用户action 注入services接口 -->
  12. <bean id="userAction" class="accp.action.UserAction">
  13. <property name="services" ref="userServices"/>
  14. <property name="baseUserServices" ref="baseServices"/>
  15. <property name="baseRoleServices" ref="baseServices"/>
  16. </bean>
  17.  
  18. <!-- registerAction 注入services接口 -->
  19. <bean id="userRegisterAction" class="accp.action.RegisterAction">
  20. <property name="services" ref="userServices"/>
  21. <property name="baseUserServices" ref="baseServices"/>
  22. <property name="baseRoleServices" ref="baseServices"/>
  23. </bean>
  24.  
  25. <!-- resc action -->
  26. <bean id="rescAction" class="accp.action.RescAction">
  27. <property name="rescServices" ref="rescServices"/>
  28. <property name="baseRescServices" ref="baseServices"/>
  29. <property name="baseRoleServices" ref="baseServices"/>
  30. </bean>
  31.  
  32. <!-- role action -->
  33. <bean id="roleAction" class="accp.action.RoleAction">
  34. <property name="roleServices" ref="roleServices"/>
  35. <property name="baseRoleServices" ref="baseServices"/>
  36. <property name="baseRescServices" ref="baseServices"/>
  37. </bean>
  38.  
  39. </beans>

applicationContext-service.xml

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <beans
  3. xmlns="http://www.springframework.org/schema/beans"
  4. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
  5. xmlns:p="http://www.springframework.org/schema/p"
  6. xsi:schemaLocation="http://www.springframework.org/schema/beans
  7. http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
  8. ">
  9.  
  10. <!--*************************hibernateTemplate******************************-->
  11. <!-- BaseDaoImpl注入 hibernateTemplate-->
  12. <bean id="baseDao" class="accp.dao.imple.BaseDaoImpl">
  13. <property name="hibernateTemplate" ref="hibernateTemplate"/>
  14. </bean>
  15.  
  16. <!-- RescDaoImpl注入 hibernateTemplate || parent父类是谁 同样实现的继承关系-->
  17. <bean id="rescDao" class="accp.dao.imple.RescDaoImpl" parent="baseDao">
  18. <!-- <property name="hibernateTemplate" ref="hibernateTemplate" /> -->
  19. </bean>
  20.  
  21. <!-- RoleDaoImpl注入 hibernateTemplate-->
  22. <bean id="roleDao" class="accp.dao.imple.RoleDaoImpl" parent="baseDao">
  23. </bean>
  24.  
  25. <!-- UserDaoImpl注入 hibernateTemplate -->
  26. <bean id="userDao" class="accp.dao.imple.UserDaoImpl" parent="baseDao">
  27. <!-- <property name="hibernateTemplate" ref="hibernateTemplate" /> -->
  28. </bean>
  29.  
  30. <!--*************************注入dao层接口到services层******************************-->
  31.  
  32. <!-- baseDao到业务层 parent="baseDao"-->
  33. <bean id="baseServices" class="accp.services.imple.BaseServicesImple" >
  34. <property name="basedao" ref="baseDao"/>
  35. </bean>
  36.  
  37. <!-- user 方便真接调用基本操作类 hibernateTemplate-->
  38. <bean id="userServices" class="accp.services.imple.UserServicesImple">
  39. <property name="userDao" ref="userDao"/>
  40. </bean>
  41.  
  42. <!-- 角色 -->
  43. <bean id="roleServices" class="accp.services.imple.RoleServicesImple">
  44. <property name="roleDao" ref="roleDao"/>
  45. </bean>
  46.  
  47. <!-- 资源 -->
  48. <bean id="rescServices" class="accp.services.imple.RescServicesImple">
  49. <property name="rescDao" ref="rescDao"/>
  50. </bean>
  51.  
  52. </beans>

UserAction.java

  1. package accp.action;
  2.  
  3. import java.io.PrintWriter;
  4. import java.util.HashSet;
  5. import java.util.Iterator;
  6. import java.util.List;
  7. import java.util.Set;
  8.  
  9. import javax.servlet.http.HttpServletResponse;
  10.  
  11. import org.apache.struts2.ServletActionContext;
  12. import org.springframework.security.authentication.encoding.Md5PasswordEncoder;
  13. import org.springframework.security.core.context.SecurityContextHolder;
  14. import org.springframework.security.core.userdetails.UserDetails;
  15.  
  16. import accp.bean.Role;
  17. import accp.bean.User;
  18. import accp.services.BaseServices;
  19. import accp.services.RoleServices;
  20. import accp.services.UserServices;
  21.  
  22. import com.opensymphony.xwork2.ActionSupport;
  23. /**
  24. * 用户管理Action
  25. * @author liangrui
  26. * @qq382453602
  27. *
  28. */
  29. public class UserAction extends ActionSupport {
  30. private User user;
  31. private List<User> listUser;//用户集合
  32. private List<Role> roleList;//角色集合
  33. private UserServices services;//用户接口
  34. private BaseServices<User,Long> baseUserServices;//基本user业务
  35. private BaseServices<Role,Long> baseRoleServices;//基本role业务
  36.  
  37. private String enabled;//是否生效
  38.  
  39. public List<Role> getRoleList() {
  40. return roleList;
  41. }
  42.  
  43. public void setRoleList(List<Role> roleList) {
  44. this.roleList = roleList;
  45. }
  46.  
  47. public void setBaseUserServices(BaseServices<User, Long> baseUserServices) {
  48. this.baseUserServices = baseUserServices;
  49. }
  50.  
  51. public void setBaseRoleServices(BaseServices<Role, Long> baseRoleServices) {
  52. this.baseRoleServices = baseRoleServices;
  53. }
  54.  
  55. public String getEnabled() {
  56. return enabled;
  57. }
  58.  
  59. public void setEnabled(String enabled) {
  60. this.enabled = enabled;
  61. }
  62.  
  63. public UserServices getServices() {
  64. return services;
  65. }
  66.  
  67. public List<User> getListUser() {
  68. return listUser;
  69. }
  70.  
  71. public void setListUser(List<User> listUser) {
  72. this.listUser = listUser;
  73. }
  74.  
  75. public User getUser() {
  76. return user;
  77. }
  78.  
  79. public void setUser(User user) {
  80.  
  81. this.user = user;
  82.  
  83. }
  84.  
  85. public void setServices(UserServices services) {
  86. this.services = services;
  87. }
  88. /*************************login*********************************/
  89. public String logins() throws Exception {
  90. System.out.println("login:"+user.getUsername());
  91. User user2=services.getLogin(user);
  92.  
  93. if(null==user2){
  94. return "notUser";
  95. }
  96.  
  97. if("admin".equals(user2.getUsername())){
  98. return "adminPage";
  99. }
  100. System.out.println(user2.getUsername());
  101. return SUCCESS;
  102. }
  103. /************************连接到admin.jsp页面***********************************/
  104. public String fowaredAdmin() throws Exception {
  105. System.out.println("获取u p中-------....");
  106. printUserInfo();
  107. System.out.println("转到admin.jsp面面");
  108. return "adminPage";
  109. }
  110. /************************打印信息:用户名***********************************/
  111. public void printUserInfo(){
  112. System.out.println("获取principal 中");
  113. String userName="";
  114. //获取安全上下文内容
  115. /*SecurityContext sc=SecurityContextHolder.getContext();
  116. Authentication atc=sc.getAuthentication();//获取认证对象
  117. //获取主体对象
  118. Object obj=atc.getPrincipal();
  119.  
  120. if(obj instanceof UserDetails){
  121. //获取用户详细内容对象
  122. UserDetails ud=(UserDetails)obj;
  123. userName=ud.getUsername();
  124. }else{
  125. userName=obj.toString();
  126. }*/
  127. //api 原代码
  128. Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
  129. if (principal instanceof UserDetails) {
  130. userName = ((UserDetails)principal).getUsername();
  131. } else {
  132. userName = principal.toString();
  133. }
  134. System.out.println("u: "+userName);
  135. }
  136. /************************hello***********************************/
  137. public String hello() throws Exception {
  138. //printUserInfo();
  139. System.out.println("开始调用方法....");
  140. String moedth=services.sayHello("刘备");
  141. System.out.println(moedth);
  142. return "indexs";
  143. }
  144. /************************bye***********************************/
  145. public String bye() throws Exception {
  146. //printUserInfo();
  147. System.out.println("开始调用方法..");
  148.  
  149. String moedth=services.sayBye("张飞");
  150. System.out.println(moedth);
  151. return "indexs";
  152. }
  153.  
  154. /************************ajax判断是否有用户名**********************************/
  155. public String ajaxIsUser() throws Exception {
  156. // TODO Auto-generated method stub
  157. System.out.println("ajax来了!开始行动...........: "+user.getUsername());
  158. boolean b=services.getAjaxIsUserName(user.getUsername());
  159. //获取响应对象
  160. HttpServletResponse response=ServletActionContext.getResponse();
  161. PrintWriter out = response.getWriter();
  162. String bb="";
  163. if(b)bb="true";else bb="false";
  164. System.out.println("b: "+bb);
  165. out.print(bb);
  166.  
  167. return null;
  168. }
  169. /************************显示所有用户信息**********************************/
  170. public String showUserInfo() throws Exception {
  171. listUser=baseUserServices.getAll(new User());
  172. return "showUser";
  173. }
  174.  
  175. /**************************删除用户****************************************/
  176. public String deleteUser() throws Exception {
  177. try {
  178. System.out.println("du: id "+user.getId());
  179. baseUserServices.delete(user);
  180. } catch (Exception e) {
  181. e.printStackTrace();
  182. return "error";
  183. }
  184. return "deleteUserOK";
  185. }
  186. /**************************修改用户 查询信息 并显示************************************/
  187. public String updateUser() throws Exception {
  188. try {
  189. user=baseUserServices.getTInId(user,user.getId());
  190. //查询角色
  191. System.out.println("开始查询role----");
  192. roleList=baseRoleServices.getAll(new Role());
  193.  
  194. } catch (Exception e) {
  195. return "error";
  196. }
  197. return "updateEidt";
  198. }
  199.  
  200. /**************************保存修改后的用户************************************/
  201. public String updateSave() throws Exception {
  202. try {
  203. Md5PasswordEncoder md5 = new Md5PasswordEncoder();
  204. String passwordMD5=md5.encodePassword(user.getPassword(), user.getUsername());
  205. user.setPassword(passwordMD5);
  206. //封装角色集合
  207. Set<Role> rolesSet=new HashSet<Role>();
  208. //取到权限的对象
  209. Set set=user.getRoles();
  210. Iterator it=set.iterator();
  211. while(it.hasNext()){
  212. //根据id查询对象
  213. Long roleID=Long.valueOf(it.next().toString());
  214. //System.out.println(roleID);
  215. Role role=baseRoleServices.getTInId(new Role(),roleID);
  216. rolesSet.add(role);
  217. }
  218. user.setRoles(rolesSet);//将角色加入用户对象里
  219. //是否生效
  220. if(null==enabled){
  221. user.setStatus(0);
  222. }else{
  223. user.setStatus(1);
  224. }
  225. System.out.println(user.getId()+user.getUsername()+user.getPassword());
  226. //通过传过来的角色id获取角色对象
  227. baseUserServices.update(user);
  228. } catch (Exception e) {
  229. return "error";
  230. }
  231. return "updateOk";
  232. }
  233. /*********************通对对象条件查询****************************/
  234. public String searchUser() throws Exception {
  235. if(null!=user){
  236. listUser=baseUserServices.getTInName(user);
  237. }
  238. return "showUser";
  239. }
  240.  
  241. /*************************显示所有角色*************************/
  242. public String displayRole() throws Exception {
  243. System.out.println("开始查询role----");
  244. roleList=baseRoleServices.getAll(new Role());
  245. return "addUsersAndShowRole";
  246. }
  247. }

BaseServices.java

  1. package accp.services;
  2.  
  3. import java.io.Serializable;
  4. import java.util.List;
  5.  
  6. import accp.dao.BaseDao;
  7. import accp.dao.imple.BaseDaoImpl;
  8.  
  9. /**
  10. *
  11. * @author liangrui
  12. * @qq 382453602
  13. * @param <T> 泛型类
  14. * @param <PK> 主健
  15. * 基本数据操作 业务层
  16. * 都 可以来这时调用 增、删、改、查
  17. */
  18.  
  19. public interface BaseServices<T,PK extends Serializable > /* extends BaseDao<T,PK>*/{
  20.  
  21. public PK save(T t);
  22. public void delete(T t);
  23. public void update(T t);
  24. /***根据对象 获取对象集合**/
  25. public List<T> getAll(T t);
  26. /***通过id 获取对象集合**/
  27. public T getTInId(T t,PK pk);
  28. /***根据名称 获取对象集合**/
  29. public List<T> getTInName(T t) throws Exception;
  30.  
  31. }

BaseDao.java

  1. package accp.dao;
  2.  
  3. import java.io.Serializable;
  4. import java.util.List;
  5.  
  6. /**
  7. *
  8. * @author liangrui
  9. * @qq 382453602
  10. * @param <T> 泛型类
  11. * @param <PK> 主健
  12. * 基本数据操作 代业务层 数据层 什么层层的
  13. * 都 可以来这时调用 增、删、改、查
  14. */
  15. public interface BaseDao<T,PK extends Serializable> {
  16.  
  17. public PK save(T t);
  18. public void delete(T t);
  19. public void update(T t);
  20. /***根据对象 获取对象集合**/
  21. public List<T> getAll(T t);
  22. /***通过id 获取对象集合**/
  23. public T getTInId(T t,PK pk);
  24. /***根据对象条件 获取对象集合**/
  25. public List<T> getTInName(T t) throws Exception;
  26.  
  27. }

BaseDaoImpl.java

  1. package accp.dao.imple;
  2.  
  3. import java.io.Serializable;
  4. import java.lang.reflect.Field;
  5. import java.lang.reflect.ParameterizedType;
  6. import java.lang.reflect.Type;
  7. import java.util.ArrayList;
  8. import java.util.List;
  9. import java.util.Set;
  10.  
  11. import accp.util.GenericsUtils;
  12. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
  13.  
  14. import accp.dao.BaseDao;
  15.  
  16. public class BaseDaoImpl<T,PK extends Serializable> extends HibernateDaoSupport implements BaseDao<T, PK> {
  17.  
  18. private Class clas ;
  19. //得到类
  20. public BaseDaoImpl(){
  21. /**
  22. * 得到泛型的类
  23. * 即 BaseDaoImpl<Users> 得到Users
  24. * 类的超类>>>现在类型的 论据
  25. */
  26. clas = GenericsUtils.getSuperClassGenricType(getClass());
  27.  
  28. }
  29.  
  30. public PK save(T t) {
  31. //System.out.println("T:" +t.getClass().getSimpleName());
  32. return (PK) this.getHibernateTemplate().save(t);
  33.  
  34. }
  35.  
  36. public void delete(T t) {
  37. this.getHibernateTemplate().delete(t);
  38. }
  39.  
  40. public void update(T t) {
  41. this.getHibernateTemplate().update(t);
  42.  
  43. }
  44.  
  45. public List<T> getAll(T t) {
  46. // 根据对象 得到对像集合
  47. String objName=t.getClass().getSimpleName();//得到 对象名
  48. //System.out.println(objName);
  49. return this.getHibernateTemplate().find("from "+objName);
  50. }
  51.  
  52. /********************通过id获取对象****************************/
  53. public T getTInId(T t,PK pk) {
  54. /*String objName=clas.getClass().getSimpleName();//得到 对象名
  55. System.out.println(clas +" : "+objName +" PK: "+pk);*/
  56. return (T) this.getHibernateTemplate().get(t.getClass(),pk);
  57.  
  58. }
  59.  
  60. /************************************************************
  61. *通过传送过来的对象值做为条件 查询
  62. *并得到反回的集合
  63. ************************************************************/
  64. @SuppressWarnings("unchecked")
  65. public List<T> getTInName(T t) throws Exception {
  66. //得到对象的字段 就是查询条件
  67. String objName=t.getClass().getSimpleName();
  68. //拼接条件
  69. StringBuffer hql=new StringBuffer("from "+objName);
  70.  
  71. hql.append(" where 1=1");
  72. Field [] objFileds =t.getClass().getDeclaredFields();
  73.  
  74. Object [] SqlParamter = null;
  75. List<Object> SqlParamters=new ArrayList<Object>();
  76. for(int i=0;i<objFileds.length;i++){
  77. Field fileld=objFileds[i];
  78. fileld.setAccessible(true);//可进入的
  79. Object objT=fileld.get(t);
  80.  
  81. //得到值
  82. if(!"".equals(objT)&&null!=objT){
  83.  
  84. if(fileld.getName().equals("id")){
  85. if(Integer.parseInt(objT.toString())>0){//不为0
  86. //如果是id则 则直接处理
  87. return this.getHibernateTemplate().
  88. find("from "+objName +" where id="+objT);
  89. }
  90. }else if(objT instanceof Set){//如果是集合
  91. //可以断续追加对象 条件
  92. }else{
  93. System.out.println(fileld.getName()+" value: "+objT);
  94. hql.append(" and "+fileld.getName()+"=?");
  95. SqlParamters.add(objT);
  96.  
  97. //SqlParamter[i]=objT;
  98. }
  99. }
  100. }
  101. //如果没有任条件的对象 ,则返回所有数据
  102. if(null==SqlParamters||SqlParamters.size()<=0){
  103. return this.getHibernateTemplate().find("from "+objName);
  104. }
  105. //把集合中的数据 转入数组
  106. SqlParamter=new Object[SqlParamters.size()];
  107. for(int i=0;i<SqlParamters.size();i++){
  108. SqlParamter[i]=SqlParamters.get(i);
  109. }
  110. //excute
  111. return this.getHibernateTemplate().find(hql.toString(),SqlParamter);
  112.  
  113. }
  114.  
  115. }

UserServicesImple.java

  1. package accp.services.imple;
  2.  
  3. import java.io.Serializable;
  4. import java.util.Iterator;
  5. import java.util.List;
  6. import java.util.Set;
  7.  
  8. import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
  9.  
  10. import accp.bean.Resc;
  11. import accp.bean.Role;
  12. import accp.bean.User;
  13. import accp.dao.UserDao;
  14. import accp.dao.imple.BaseDaoImpl;
  15. import accp.services.UserServices;
  16. /**
  17. *
  18. * @author liangrui
  19. * 基本操做可以调用BaseDao时的方法
  20. * 用户业务处理层
  21. * extends BaseDaoImpl<User,Integer>
  22. *
  23. */
  24.  
  25. public class UserServicesImple implements UserServices {
  26.  
  27. private UserDao userDao;//用户数据层接口
  28.  
  29. public UserDao getUserDao() {
  30. return userDao;
  31. }
  32.  
  33. public void setUserDao(UserDao userDao) {
  34. this.userDao = userDao;
  35. }
  36.  
  37. public String sayHello(String name) {
  38. System.out.println("进来了!!!");
  39. return "hello:"+name;
  40. }
  41.  
  42. public String sayBye(String name) {
  43. // TODO Auto-generated method stub
  44. return "bay:"+name;
  45. }
  46.  
  47. /**************ajax判断是否有重复名字*********************/
  48. public boolean getAjaxIsUserName(String name) {
  49. return userDao.getAjaxIsUserName(name);
  50. }
  51.  
  52. /***************************用户登陆***************************/
  53. public User getLogin(User u) {
  54. // TODO Auto-generated method stub
  55. //List<User> list=super.getAll(u);
  56. List list=userDao.getAll(u);
  57.  
  58. if(null==list||list.size()<=0){
  59. return null;
  60. }else {
  61. return (User) list.get(0);
  62. }
  63.  
  64. }
  65.  
  66. /***register***/
  67. public User saveUser(User u){
  68. try {
  69.  
  70. userDao.save(u);
  71. } catch (Exception e) {
  72. e.printStackTrace();
  73. return null;
  74. }
  75. return u;
  76. }
  77.  
  78. }

struts_user.xml

  1. <?xml version="1.0" encoding="UTF-8" ?>
  2. <!DOCTYPE struts PUBLIC
  3. "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
  4. "http://struts.apache.org/dtds/struts-2.3.dtd">
  5. <struts>
  6.  
  7. <package name="userPackage" namespace="/" extends="struts-default">
  8.  
  9. <!-- 用户 action -->
  10. <action name="user_*" class="userAction" method="{1}" >
  11. <result name="success">/userPage.jsp</result>
  12. <result name="adminPage">/admin.jsp</result>
  13. <result name="indexs">/index.jsp</result>
  14. <result name="ok">/userReg/ok.jsp</result>
  15. <result name="showUser">/admin/userAuthorities.jsp</result>
  16. <result name="error">/userReg/error.jsp</result>
  17. <result name="updateEidt">/userReg/updateEdit.jsp</result>
  18. <!-- -->
  19. <result name="deleteUserOK" type="redirectAction">user_showUserInfo.action</result>
  20. <result name="updateOk" type="redirectAction">user_showUserInfo.action</result>
  21. <result name="addUsersAndShowRole">/userReg/regsiter.jsp</result>
  22.  
  23. </action>
  24.  
  25. <action name="users_*" class="userRegisterAction" method="{1}">
  26. <result name="ok">/userReg/ok.jsp</result>
  27. <result name="error">/userReg/error.jsp</result>
  28. <result name="input">/userReg/regsiter.jsp</result>
  29.  
  30. <!--防止表单重提交 -->
  31. <result name="invalid.token">/userReg/alert.jsp</result>
  32. <interceptor-ref name="token"/>
  33. <interceptor-ref name="defaultStack"/>
  34.  
  35. </action>
  36.  
  37. </package>
  38.  
  39. </struts>

login.jsp

  1. <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
  2.  
  3. <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
  4. <html>
  5. <head>
  6. <title>My JSP 'index.jsp' starting page</title>
  7. <style type="text/css">
  8. .errorhide{display: none;}
  9. .error{display: block;}
  10. </style>
  11. </head>
  12.  
  13. <body>
  14. <div style="width:1200px; text-align: center; margin-top: 150px;">
  15. <div class="error${param.error==true ? '' : 'hide'}">
  16. 登陆失败<br>
  17. <font color="red">${sessionScope['SPRING_SECURITY_LAST_EXCEPTION'].message}</font><br/>
  18. </div>
  19.  
  20. <form action="${pageContext.request.contextPath}/j_spring_security_check" method="post" style="width:260px;text-align:center;">
  21. <fieldset>
  22. <legend>登陆</legend>
  23. 用户: <input type="text" name="j_username" style="width:150px;" value="${sessionScope['SPRING_SECURITY_LAST_USERNAME']}"/><br />
  24. 密码: <input type="password" name="j_password" style="width:150px;" /> <br />
  25. <input type="checkbox" name="_spring_security_remember_me"/>一周之内不必登陆<br />
  26. <input type="submit" value="登陆"/>
  27. <input type="reset" value="重置"/>
  28. </fieldset>
  29. </form>
  30.  
  31. <br/>
  32. <a HREF="${pageContext.request.contextPath}/admin.jsp">ADMIN.JSP</a> <br/>
  33. <a HREF="${pageContext.request.contextPath}/userPage.jsp">userPage.jsp</a> <br/>
  34. <a href="j_spring_security_logout">注销用户</a>
  35. </div>
  36.  
  37. </body>
  38. </html>

主要代码就这些吧!有兴趣的朋友可以下载源码,全部贴出来,累死个人

spring Scurity终于测试OK了,复杂的功能还待深入研究!发布出来一起探讨吧!的更多相关文章

  1. Struts2+Spring+Mybatis+Junit 测试

    Struts2+Spring+Mybatis+Junit 测试 博客分类: HtmlUnit Junit Spring 测试 Mybatis  package com.action.kioskmoni ...

  2. Spring-Context之二:使用Spring提供的测试框架进行测试

    Spring框架是无侵入性的,所以你的代码可以完全是POJO(plain old java object),直接使用Junit就可以完成大部分的单元测试.但是在集成测试方面就比较吃力了.单元测试层面你 ...

  3. Spring Boot(十二):spring boot如何测试打包部署

    Spring Boot(十二):spring boot如何测试打包部署 一.开发阶段 1,单元测试 在开发阶段的时候最重要的是单元测试了,springboot对单元测试的支持已经很完善了. (1)在p ...

  4. Spring整合junit测试

    本节内容: Spring整合junit测试的意义 Spring整合junit测试 一.Spring与整合junit测试的意义 在没整合junit之前,我们在写测试方法时,需要在每个方法中手动创建容器, ...

  5. spring boot应用测试框架介绍

    一.spring boot应用测试存在的问题 官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit.spring test.assertj.hamcres ...

  6. Spring MVC的测试

    测试是保证软件质量的关键. 与 Spring MVC 相关的测试,主要涉及控制器的测试. 为了测试Web项目通常不需要启动项目,需要一些Servlet相关的一些模拟对象,比如MockMVC.MockH ...

  7. [Java][Spring][scurity]同步session控制,防止一个用户多次登录

    [Spring][scurity]同步session控制.防止一个用户多次登录 假设你希望限制单个用户仅仅能登录到你的程序一次,Spring Security通过加入以下简单的部分支持这个功能. 1. ...

  8. Spring Boot从入门到放弃-Spring Boot 整合测试

    站长资讯摘要:使用Spring Boot 整合测试,对Controller 中某个方法进行测试或者对Service,Mapper等进行测试,不需要运行项目即可查看运行结果是否和期望值相同,Spring ...

  9. Spring MVC 框架的架包分析,功能作用,优点

    由于刚搭建完一个MVC框架,决定分享一下我搭建过程中学习到的一些东西.我觉得不管你是个初级程序员还是高级程序员抑或是软件架构师,在学习和了解一个框架的时候,首先都应该知道的是这个框架的原理和与其有关j ...

随机推荐

  1. Loadrunner结果分析Graphs

    Transactions(用户事务分析)----用户事务分析是站在用户角度进行的基础性能分析. Transation Sunmmary(事务综述)----对事务进行综合分析是性能分析的第一步,通过分析 ...

  2. hdu4893Wow! Such Sequence! (线段树)

    Problem Description Recently, Doge got a funny birthday present from his new friend, Protein Tiger f ...

  3. C++11 : variadic templates(可变参数模板)

      Introduction: Before the possibilities of the new C++ language standard, C++11, the use of templat ...

  4. ASP.NET获取用户端的真实IP

    ASP.NET获取用户端的真实IP在各种场景都能用到,但是用户网端变幻莫测情况众多,获取真实IP还真是不容易啊.下面分享个比较好一点的方法: 获取IP初始版本 /// <summary> ...

  5. F# 既能解释执行,也能编译执行

    F# 除了是函数式语言和面向对象语言之外,还有个突出的特点是:既能解释执行,也能编译执行.   一般说来,一种语言只能选择其一种.比如说C++.C#是编译执行,不能解释执行,象Matlab.R是解释执 ...

  6. MySql 1045错误

    配置时以管理员身份运行MySQL Instance Configuration Wizard 当你登录MySQL数据库出现:Error 1045错误时(如下图),就表明你输入的用户名或密码错误被拒绝访 ...

  7. POI创建Excle

    1.导包 2.Demo Workbook wb=new HSSFWorkbook();//创建工作空间 Sheet sh= wb.createSheet("工作表1");//创建工 ...

  8. php 之 数据访问

    数据访问: 方式一:已过时,只做了解 1.造一个连接(建立通道) $db=mysql_connect("localhost","root","123& ...

  9. centos 安装,配置memcached

    先查看是否已经安装了memcached输入memcached -h会输出memcached版本,或print phpinfo查看: memcached需要libevent支持,没有libevent,就 ...

  10. Python -- 大小写转换

    #小写转大写 strs = 'abcd' strs = strs.upper() print u'abcd小写转大写:', strs #大写转小写 strs = 'ABCD' strs = strs. ...