spring Scurity终于测试OK了,复杂的功能还待深入研究!发布出来一起探讨吧!
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
- <?xml version="1.0" encoding="UTF-8"?>
- <beans:beans
- xmlns="http://www.springframework.org/schema/security"
- xmlns:beans="http://www.springframework.org/schema/beans"
- xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
- http://www.springframework.org/schema/security
- http://www.springframework.org/schema/security/spring-security.xsd">
- <!-- 使用security="none"忽略所有过滤器会提升性能,而是用匿名登录功能可以实现权限操作的一致性,
- 具体应用时还需要大家根据实际情况自行选择了。
- <http pattern="/" security="none"/> -->
- <http pattern="/image" security="none"/>
- <!--entry-point-ref="" 未登录的切入点
- servlet-api-provision="true" 默认启用 保存没有登录之前的请求
- access-denied-page="" 被拦截之后的页面-->
- <http auto-config="true" entry-point-ref="myAuthenticationEntryPoint"
- access-denied-page="/error/page403.jsp" >
- <!-- 在配置文件中使用auto-config="true"就会启用匿名登录功能。在启用匿名登录之后,
- 如果我们希望允许未登录就可以访问一些资源,可以在进行如下配置。 IS_AUTHENTICATED_ANONYMOUSLY=ROLE_ANONYMOUS-->
- <intercept-url pattern="/" access="ROLE_ANONYMOUS"/>
- <anonymous username="游客"/>
- <!-- 只要登 陆的用户都可以访问项目资源 除了受保护的次源 -->
- <intercept-url pattern="/**" access="IS_AUTHENTICATED_FULLY" />
- <!-- 自定义过滤器 在之前执行 -->
- <custom-filter ref="filterSecurityInterceptor" before="FILTER_SECURITY_INTERCEPTOR" />
- <!-- 切换用户 -->
- <custom-filter position="SWITCH_USER_FILTER" ref="switchUserProcessingFilter" />
- <!-- 获取 ip -->
- <custom-filter position="CONCURRENT_SESSION_FILTER" ref="concurrentSessionFilter"/>
- <!-- 用户退出 session无效 -->
- <logout invalidate-session="true"
- logout-url="/j_spring_security_logout" />
- <!-- 保存cookie 保存用户名密码多长时间-->
- <!--60*60*24*7=604800= 一个星期的秒数 -->
- <remember-me key="myApp" token-validity-seconds="604800" data-source-ref="authoritiesData" />
- <!-- 用户登陆 默认跳转页面 and 失败面页 -->
- <form-login default-target-url="/index.jsp" authentication-failure-url="/login.jsp?error=true"/>
- <!-- 防御会话伪造 none,migrateSession和newSession。默认使用的是migrationSession,
- <session-management session-fixation-protection="migrateSession"/>-->
- <!-- 会话管理 默认30分钟 ,空闲30分钟后,自动销毁
- session-authentication-strategy 会话认证策略 session-authentication-strategy-ref="currentControllerStrategy" -->
- <session-management invalid-session-url="/login.jsp"
- session-authentication-strategy-ref="currentControllerStrategy"/>
- <!-- <concurrency-control max-sessions="1" error-if-maximum-exceeded="true" />
- </session-management> -->
- <!-- 允许同时登陆几个,如果溢出这个数则报异常 -->
- <!-- error-if-maximum-exceeded="true"=不允许把在线用户踢出去-->
- </http>
- <!--注意必须放在用来验证权限的FilterSecurityInterceptor之后,这样可以控制当前用户是否拥有切换用户的权限 -->
- <beans:bean id="switchUserProcessingFilter"
- class="org.springframework.security.web.authentication.switchuser.SwitchUserFilter" autowire="byType">
- <beans:property name="targetUrl" value="/manager.jsp"/>
- </beans:bean>
- <!-- 未登录的切入点 -->
- <beans:bean id="myAuthenticationEntryPoint" class="org.springframework.security.web.authentication.LoginUrlAuthenticationEntryPoint">
- <beans:property name="loginFormUrl" value="/login.jsp"></beans:property>
- </beans:bean>
- <!-- 认证管理 -->
- <authentication-manager>
- <authentication-provider>
- <!-- md5加密 -->
- <password-encoder hash="md5">
- <!-- 盐值加密 -->
- <salt-source user-property="username"/>
- </password-encoder>
- <!-- 数据库是自定义的,所以要修改sql查询语句 用户信息 和 权限信息 -->
- <jdbc-user-service data-source-ref="authoritiesData"
- users-by-username-query="select username,password,status as enabled
- from user
- where username=?"
- authorities-by-username-query="select u.username,r.name as authority
- from user u
- join user_role ur
- on u.id=ur.user_id
- join role r
- on r.id=ur.role_id
- where u.username=?"/>
- </authentication-provider>
- </authentication-manager>
- <!-- 过虑拦截器 作用:就是把自定义的数据库查询字段 封装成security规范 的字段-->
- <beans:bean id="filterSecurityInterceptor"
- class="org.springframework.security.web.access.intercept.FilterSecurityInterceptor" autowire="byType">
- <beans:property name="securityMetadataSource" ref="filterInvocationSecurityMetadataSource" />
- <beans:property name="authenticationManager" ref="org.springframework.security.authenticationManager"/>
- </beans:bean>
- <!-- 替换原有功能的切入点 从数据库里查询出数据 资源==角色 注入数据库源 和查询结果的sql语句
- 把受保护的资源(jsp页面)写入到数据库中 需要这样的配置-->
- <beans:bean id="filterInvocationSecurityMetadataSource"
- class="accp.util.JdbcFilterInvocationDefinitionSourceFactoryBean">
- <beans:property name="dataSource" ref="authoritiesData"/>
- <beans:property name="resourceQuery" value="
- select re.res_string,r.name
- from role r
- join resc_role rr
- on r.id=rr.role_id
- join resc re
- on re.id=rr.resc_id
- order by re.priority
- "/>
- </beans:bean>
- <!-- 提示信息 国际化-->
- <beans:bean id="messageSource" class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
- <beans:property name="basename" value="classpath:messages_zh_CN"/>
- </beans:bean>
- <!-- 获取用户 ip 和用户绑定,(如是果设了最大会话为1,不用担心没注销用户,无法再登陆!)
- 这样在同一个电脑是可以重复登陆, -->
- <beans:bean id="concurrentSessionFilter"
- class="org.springframework.security.web.session.ConcurrentSessionFilter">
- <beans:property name="sessionRegistry" ref="sessionRegistry"/>
- </beans:bean>
- <beans:bean id="sessionRegistry"
- class="accp.myFilter.SmartSessionRegistry"/>
- <beans:bean id="currentControllerStrategy"
- class="accp.myFilter.SmartConcurrentSessionControlStrategy">
- <beans:constructor-arg ref="sessionRegistry"/>
- <!-- 允许同时登陆几个,如果溢出这个数则报异常 -->
- <!-- error-if-maximum-exceeded="true"=不允许把在线用户踢出去 -->
- <beans:property name="exceptionIfMaximumExceeded" value="true"/>
- <beans:property name="maximumSessions" value="1"/>
- </beans:bean>
- <!-- 记录日志 -->
- <beans:bean class="accp.myFilter.AuditListener"/>
- </beans:beans>
applicationContext-action.xml
- <?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:p="http://www.springframework.org/schema/p"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
- ">
- <!--*************************注入services层接口到action******************************-->
- <!-- 用户action 注入services接口 -->
- <bean id="userAction" class="accp.action.UserAction">
- <property name="services" ref="userServices"/>
- <property name="baseUserServices" ref="baseServices"/>
- <property name="baseRoleServices" ref="baseServices"/>
- </bean>
- <!-- registerAction 注入services接口 -->
- <bean id="userRegisterAction" class="accp.action.RegisterAction">
- <property name="services" ref="userServices"/>
- <property name="baseUserServices" ref="baseServices"/>
- <property name="baseRoleServices" ref="baseServices"/>
- </bean>
- <!-- resc action -->
- <bean id="rescAction" class="accp.action.RescAction">
- <property name="rescServices" ref="rescServices"/>
- <property name="baseRescServices" ref="baseServices"/>
- <property name="baseRoleServices" ref="baseServices"/>
- </bean>
- <!-- role action -->
- <bean id="roleAction" class="accp.action.RoleAction">
- <property name="roleServices" ref="roleServices"/>
- <property name="baseRoleServices" ref="baseServices"/>
- <property name="baseRescServices" ref="baseServices"/>
- </bean>
- </beans>
applicationContext-service.xml
- <?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:p="http://www.springframework.org/schema/p"
- xsi:schemaLocation="http://www.springframework.org/schema/beans
- http://www.springframework.org/schema/beans/spring-beans-3.2.xsd
- ">
- <!--*************************hibernateTemplate******************************-->
- <!-- BaseDaoImpl注入 hibernateTemplate-->
- <bean id="baseDao" class="accp.dao.imple.BaseDaoImpl">
- <property name="hibernateTemplate" ref="hibernateTemplate"/>
- </bean>
- <!-- RescDaoImpl注入 hibernateTemplate || parent父类是谁 同样实现的继承关系-->
- <bean id="rescDao" class="accp.dao.imple.RescDaoImpl" parent="baseDao">
- <!-- <property name="hibernateTemplate" ref="hibernateTemplate" /> -->
- </bean>
- <!-- RoleDaoImpl注入 hibernateTemplate-->
- <bean id="roleDao" class="accp.dao.imple.RoleDaoImpl" parent="baseDao">
- </bean>
- <!-- UserDaoImpl注入 hibernateTemplate -->
- <bean id="userDao" class="accp.dao.imple.UserDaoImpl" parent="baseDao">
- <!-- <property name="hibernateTemplate" ref="hibernateTemplate" /> -->
- </bean>
- <!--*************************注入dao层接口到services层******************************-->
- <!-- baseDao到业务层 parent="baseDao"-->
- <bean id="baseServices" class="accp.services.imple.BaseServicesImple" >
- <property name="basedao" ref="baseDao"/>
- </bean>
- <!-- user 方便真接调用基本操作类 hibernateTemplate-->
- <bean id="userServices" class="accp.services.imple.UserServicesImple">
- <property name="userDao" ref="userDao"/>
- </bean>
- <!-- 角色 -->
- <bean id="roleServices" class="accp.services.imple.RoleServicesImple">
- <property name="roleDao" ref="roleDao"/>
- </bean>
- <!-- 资源 -->
- <bean id="rescServices" class="accp.services.imple.RescServicesImple">
- <property name="rescDao" ref="rescDao"/>
- </bean>
- </beans>
UserAction.java
- package accp.action;
- import java.io.PrintWriter;
- import java.util.HashSet;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Set;
- import javax.servlet.http.HttpServletResponse;
- import org.apache.struts2.ServletActionContext;
- import org.springframework.security.authentication.encoding.Md5PasswordEncoder;
- import org.springframework.security.core.context.SecurityContextHolder;
- import org.springframework.security.core.userdetails.UserDetails;
- import accp.bean.Role;
- import accp.bean.User;
- import accp.services.BaseServices;
- import accp.services.RoleServices;
- import accp.services.UserServices;
- import com.opensymphony.xwork2.ActionSupport;
- /**
- * 用户管理Action
- * @author liangrui
- * @qq382453602
- *
- */
- public class UserAction extends ActionSupport {
- private User user;
- private List<User> listUser;//用户集合
- private List<Role> roleList;//角色集合
- private UserServices services;//用户接口
- private BaseServices<User,Long> baseUserServices;//基本user业务
- private BaseServices<Role,Long> baseRoleServices;//基本role业务
- private String enabled;//是否生效
- public List<Role> getRoleList() {
- return roleList;
- }
- public void setRoleList(List<Role> roleList) {
- this.roleList = roleList;
- }
- public void setBaseUserServices(BaseServices<User, Long> baseUserServices) {
- this.baseUserServices = baseUserServices;
- }
- public void setBaseRoleServices(BaseServices<Role, Long> baseRoleServices) {
- this.baseRoleServices = baseRoleServices;
- }
- public String getEnabled() {
- return enabled;
- }
- public void setEnabled(String enabled) {
- this.enabled = enabled;
- }
- public UserServices getServices() {
- return services;
- }
- public List<User> getListUser() {
- return listUser;
- }
- public void setListUser(List<User> listUser) {
- this.listUser = listUser;
- }
- public User getUser() {
- return user;
- }
- public void setUser(User user) {
- this.user = user;
- }
- public void setServices(UserServices services) {
- this.services = services;
- }
- /*************************login*********************************/
- public String logins() throws Exception {
- System.out.println("login:"+user.getUsername());
- User user2=services.getLogin(user);
- if(null==user2){
- return "notUser";
- }
- if("admin".equals(user2.getUsername())){
- return "adminPage";
- }
- System.out.println(user2.getUsername());
- return SUCCESS;
- }
- /************************连接到admin.jsp页面***********************************/
- public String fowaredAdmin() throws Exception {
- System.out.println("获取u p中-------....");
- printUserInfo();
- System.out.println("转到admin.jsp面面");
- return "adminPage";
- }
- /************************打印信息:用户名***********************************/
- public void printUserInfo(){
- System.out.println("获取principal 中");
- String userName="";
- //获取安全上下文内容
- /*SecurityContext sc=SecurityContextHolder.getContext();
- Authentication atc=sc.getAuthentication();//获取认证对象
- //获取主体对象
- Object obj=atc.getPrincipal();
- if(obj instanceof UserDetails){
- //获取用户详细内容对象
- UserDetails ud=(UserDetails)obj;
- userName=ud.getUsername();
- }else{
- userName=obj.toString();
- }*/
- //api 原代码
- Object principal = SecurityContextHolder.getContext().getAuthentication().getPrincipal();
- if (principal instanceof UserDetails) {
- userName = ((UserDetails)principal).getUsername();
- } else {
- userName = principal.toString();
- }
- System.out.println("u: "+userName);
- }
- /************************hello***********************************/
- public String hello() throws Exception {
- //printUserInfo();
- System.out.println("开始调用方法....");
- String moedth=services.sayHello("刘备");
- System.out.println(moedth);
- return "indexs";
- }
- /************************bye***********************************/
- public String bye() throws Exception {
- //printUserInfo();
- System.out.println("开始调用方法..");
- String moedth=services.sayBye("张飞");
- System.out.println(moedth);
- return "indexs";
- }
- /************************ajax判断是否有用户名**********************************/
- public String ajaxIsUser() throws Exception {
- // TODO Auto-generated method stub
- System.out.println("ajax来了!开始行动...........: "+user.getUsername());
- boolean b=services.getAjaxIsUserName(user.getUsername());
- //获取响应对象
- HttpServletResponse response=ServletActionContext.getResponse();
- PrintWriter out = response.getWriter();
- String bb="";
- if(b)bb="true";else bb="false";
- System.out.println("b: "+bb);
- out.print(bb);
- return null;
- }
- /************************显示所有用户信息**********************************/
- public String showUserInfo() throws Exception {
- listUser=baseUserServices.getAll(new User());
- return "showUser";
- }
- /**************************删除用户****************************************/
- public String deleteUser() throws Exception {
- try {
- System.out.println("du: id "+user.getId());
- baseUserServices.delete(user);
- } catch (Exception e) {
- e.printStackTrace();
- return "error";
- }
- return "deleteUserOK";
- }
- /**************************修改用户 查询信息 并显示************************************/
- public String updateUser() throws Exception {
- try {
- user=baseUserServices.getTInId(user,user.getId());
- //查询角色
- System.out.println("开始查询role----");
- roleList=baseRoleServices.getAll(new Role());
- } catch (Exception e) {
- return "error";
- }
- return "updateEidt";
- }
- /**************************保存修改后的用户************************************/
- public String updateSave() throws Exception {
- try {
- Md5PasswordEncoder md5 = new Md5PasswordEncoder();
- String passwordMD5=md5.encodePassword(user.getPassword(), user.getUsername());
- user.setPassword(passwordMD5);
- //封装角色集合
- Set<Role> rolesSet=new HashSet<Role>();
- //取到权限的对象
- Set set=user.getRoles();
- Iterator it=set.iterator();
- while(it.hasNext()){
- //根据id查询对象
- Long roleID=Long.valueOf(it.next().toString());
- //System.out.println(roleID);
- Role role=baseRoleServices.getTInId(new Role(),roleID);
- rolesSet.add(role);
- }
- user.setRoles(rolesSet);//将角色加入用户对象里
- //是否生效
- if(null==enabled){
- user.setStatus(0);
- }else{
- user.setStatus(1);
- }
- System.out.println(user.getId()+user.getUsername()+user.getPassword());
- //通过传过来的角色id获取角色对象
- baseUserServices.update(user);
- } catch (Exception e) {
- return "error";
- }
- return "updateOk";
- }
- /*********************通对对象条件查询****************************/
- public String searchUser() throws Exception {
- if(null!=user){
- listUser=baseUserServices.getTInName(user);
- }
- return "showUser";
- }
- /*************************显示所有角色*************************/
- public String displayRole() throws Exception {
- System.out.println("开始查询role----");
- roleList=baseRoleServices.getAll(new Role());
- return "addUsersAndShowRole";
- }
- }
BaseServices.java
- package accp.services;
- import java.io.Serializable;
- import java.util.List;
- import accp.dao.BaseDao;
- import accp.dao.imple.BaseDaoImpl;
- /**
- *
- * @author liangrui
- * @qq 382453602
- * @param <T> 泛型类
- * @param <PK> 主健
- * 基本数据操作 业务层
- * 都 可以来这时调用 增、删、改、查
- */
- public interface BaseServices<T,PK extends Serializable > /* extends BaseDao<T,PK>*/{
- public PK save(T t);
- public void delete(T t);
- public void update(T t);
- /***根据对象 获取对象集合**/
- public List<T> getAll(T t);
- /***通过id 获取对象集合**/
- public T getTInId(T t,PK pk);
- /***根据名称 获取对象集合**/
- public List<T> getTInName(T t) throws Exception;
- }
BaseDao.java
- package accp.dao;
- import java.io.Serializable;
- import java.util.List;
- /**
- *
- * @author liangrui
- * @qq 382453602
- * @param <T> 泛型类
- * @param <PK> 主健
- * 基本数据操作 代业务层 数据层 什么层层的
- * 都 可以来这时调用 增、删、改、查
- */
- public interface BaseDao<T,PK extends Serializable> {
- public PK save(T t);
- public void delete(T t);
- public void update(T t);
- /***根据对象 获取对象集合**/
- public List<T> getAll(T t);
- /***通过id 获取对象集合**/
- public T getTInId(T t,PK pk);
- /***根据对象条件 获取对象集合**/
- public List<T> getTInName(T t) throws Exception;
- }
BaseDaoImpl.java
- package accp.dao.imple;
- import java.io.Serializable;
- import java.lang.reflect.Field;
- import java.lang.reflect.ParameterizedType;
- import java.lang.reflect.Type;
- import java.util.ArrayList;
- import java.util.List;
- import java.util.Set;
- import accp.util.GenericsUtils;
- import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
- import accp.dao.BaseDao;
- public class BaseDaoImpl<T,PK extends Serializable> extends HibernateDaoSupport implements BaseDao<T, PK> {
- private Class clas ;
- //得到类
- public BaseDaoImpl(){
- /**
- * 得到泛型的类
- * 即 BaseDaoImpl<Users> 得到Users
- * 类的超类>>>现在类型的 论据
- */
- clas = GenericsUtils.getSuperClassGenricType(getClass());
- }
- public PK save(T t) {
- //System.out.println("T:" +t.getClass().getSimpleName());
- return (PK) this.getHibernateTemplate().save(t);
- }
- public void delete(T t) {
- this.getHibernateTemplate().delete(t);
- }
- public void update(T t) {
- this.getHibernateTemplate().update(t);
- }
- public List<T> getAll(T t) {
- // 根据对象 得到对像集合
- String objName=t.getClass().getSimpleName();//得到 对象名
- //System.out.println(objName);
- return this.getHibernateTemplate().find("from "+objName);
- }
- /********************通过id获取对象****************************/
- public T getTInId(T t,PK pk) {
- /*String objName=clas.getClass().getSimpleName();//得到 对象名
- System.out.println(clas +" : "+objName +" PK: "+pk);*/
- return (T) this.getHibernateTemplate().get(t.getClass(),pk);
- }
- /************************************************************
- *通过传送过来的对象值做为条件 查询
- *并得到反回的集合
- ************************************************************/
- @SuppressWarnings("unchecked")
- public List<T> getTInName(T t) throws Exception {
- //得到对象的字段 就是查询条件
- String objName=t.getClass().getSimpleName();
- //拼接条件
- StringBuffer hql=new StringBuffer("from "+objName);
- hql.append(" where 1=1");
- Field [] objFileds =t.getClass().getDeclaredFields();
- Object [] SqlParamter = null;
- List<Object> SqlParamters=new ArrayList<Object>();
- for(int i=0;i<objFileds.length;i++){
- Field fileld=objFileds[i];
- fileld.setAccessible(true);//可进入的
- Object objT=fileld.get(t);
- //得到值
- if(!"".equals(objT)&&null!=objT){
- if(fileld.getName().equals("id")){
- if(Integer.parseInt(objT.toString())>0){//不为0
- //如果是id则 则直接处理
- return this.getHibernateTemplate().
- find("from "+objName +" where id="+objT);
- }
- }else if(objT instanceof Set){//如果是集合
- //可以断续追加对象 条件
- }else{
- System.out.println(fileld.getName()+" value: "+objT);
- hql.append(" and "+fileld.getName()+"=?");
- SqlParamters.add(objT);
- //SqlParamter[i]=objT;
- }
- }
- }
- //如果没有任条件的对象 ,则返回所有数据
- if(null==SqlParamters||SqlParamters.size()<=0){
- return this.getHibernateTemplate().find("from "+objName);
- }
- //把集合中的数据 转入数组
- SqlParamter=new Object[SqlParamters.size()];
- for(int i=0;i<SqlParamters.size();i++){
- SqlParamter[i]=SqlParamters.get(i);
- }
- //excute
- return this.getHibernateTemplate().find(hql.toString(),SqlParamter);
- }
- }
UserServicesImple.java
- package accp.services.imple;
- import java.io.Serializable;
- import java.util.Iterator;
- import java.util.List;
- import java.util.Set;
- import org.springframework.orm.hibernate3.support.HibernateDaoSupport;
- import accp.bean.Resc;
- import accp.bean.Role;
- import accp.bean.User;
- import accp.dao.UserDao;
- import accp.dao.imple.BaseDaoImpl;
- import accp.services.UserServices;
- /**
- *
- * @author liangrui
- * 基本操做可以调用BaseDao时的方法
- * 用户业务处理层
- * extends BaseDaoImpl<User,Integer>
- *
- */
- public class UserServicesImple implements UserServices {
- private UserDao userDao;//用户数据层接口
- public UserDao getUserDao() {
- return userDao;
- }
- public void setUserDao(UserDao userDao) {
- this.userDao = userDao;
- }
- public String sayHello(String name) {
- System.out.println("进来了!!!");
- return "hello:"+name;
- }
- public String sayBye(String name) {
- // TODO Auto-generated method stub
- return "bay:"+name;
- }
- /**************ajax判断是否有重复名字*********************/
- public boolean getAjaxIsUserName(String name) {
- return userDao.getAjaxIsUserName(name);
- }
- /***************************用户登陆***************************/
- public User getLogin(User u) {
- // TODO Auto-generated method stub
- //List<User> list=super.getAll(u);
- List list=userDao.getAll(u);
- if(null==list||list.size()<=0){
- return null;
- }else {
- return (User) list.get(0);
- }
- }
- /***register***/
- public User saveUser(User u){
- try {
- userDao.save(u);
- } catch (Exception e) {
- e.printStackTrace();
- return null;
- }
- return u;
- }
- }
struts_user.xml
- <?xml version="1.0" encoding="UTF-8" ?>
- <!DOCTYPE struts PUBLIC
- "-//Apache Software Foundation//DTD Struts Configuration 2.3//EN"
- "http://struts.apache.org/dtds/struts-2.3.dtd">
- <struts>
- <package name="userPackage" namespace="/" extends="struts-default">
- <!-- 用户 action -->
- <action name="user_*" class="userAction" method="{1}" >
- <result name="success">/userPage.jsp</result>
- <result name="adminPage">/admin.jsp</result>
- <result name="indexs">/index.jsp</result>
- <result name="ok">/userReg/ok.jsp</result>
- <result name="showUser">/admin/userAuthorities.jsp</result>
- <result name="error">/userReg/error.jsp</result>
- <result name="updateEidt">/userReg/updateEdit.jsp</result>
- <!-- -->
- <result name="deleteUserOK" type="redirectAction">user_showUserInfo.action</result>
- <result name="updateOk" type="redirectAction">user_showUserInfo.action</result>
- <result name="addUsersAndShowRole">/userReg/regsiter.jsp</result>
- </action>
- <action name="users_*" class="userRegisterAction" method="{1}">
- <result name="ok">/userReg/ok.jsp</result>
- <result name="error">/userReg/error.jsp</result>
- <result name="input">/userReg/regsiter.jsp</result>
- <!--防止表单重提交 -->
- <result name="invalid.token">/userReg/alert.jsp</result>
- <interceptor-ref name="token"/>
- <interceptor-ref name="defaultStack"/>
- </action>
- </package>
- </struts>
login.jsp
- <%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
- <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
- <html>
- <head>
- <title>My JSP 'index.jsp' starting page</title>
- <style type="text/css">
- .errorhide{display: none;}
- .error{display: block;}
- </style>
- </head>
- <body>
- <div style="width:1200px; text-align: center; margin-top: 150px;">
- <div class="error${param.error==true ? '' : 'hide'}">
- 登陆失败<br>
- <font color="red">${sessionScope['SPRING_SECURITY_LAST_EXCEPTION'].message}</font><br/>
- </div>
- <form action="${pageContext.request.contextPath}/j_spring_security_check" method="post" style="width:260px;text-align:center;">
- <fieldset>
- <legend>登陆</legend>
- 用户: <input type="text" name="j_username" style="width:150px;" value="${sessionScope['SPRING_SECURITY_LAST_USERNAME']}"/><br />
- 密码: <input type="password" name="j_password" style="width:150px;" /> <br />
- <input type="checkbox" name="_spring_security_remember_me"/>一周之内不必登陆<br />
- <input type="submit" value="登陆"/>
- <input type="reset" value="重置"/>
- </fieldset>
- </form>
- <br/>
- <a HREF="${pageContext.request.contextPath}/admin.jsp">ADMIN.JSP</a> <br/>
- <a HREF="${pageContext.request.contextPath}/userPage.jsp">userPage.jsp</a> <br/>
- <a href="j_spring_security_logout">注销用户</a>
- </div>
- </body>
- </html>
主要代码就这些吧!有兴趣的朋友可以下载源码,全部贴出来,累死个人
spring Scurity终于测试OK了,复杂的功能还待深入研究!发布出来一起探讨吧!的更多相关文章
- Struts2+Spring+Mybatis+Junit 测试
Struts2+Spring+Mybatis+Junit 测试 博客分类: HtmlUnit Junit Spring 测试 Mybatis package com.action.kioskmoni ...
- Spring-Context之二:使用Spring提供的测试框架进行测试
Spring框架是无侵入性的,所以你的代码可以完全是POJO(plain old java object),直接使用Junit就可以完成大部分的单元测试.但是在集成测试方面就比较吃力了.单元测试层面你 ...
- Spring Boot(十二):spring boot如何测试打包部署
Spring Boot(十二):spring boot如何测试打包部署 一.开发阶段 1,单元测试 在开发阶段的时候最重要的是单元测试了,springboot对单元测试的支持已经很完善了. (1)在p ...
- Spring整合junit测试
本节内容: Spring整合junit测试的意义 Spring整合junit测试 一.Spring与整合junit测试的意义 在没整合junit之前,我们在写测试方法时,需要在每个方法中手动创建容器, ...
- spring boot应用测试框架介绍
一.spring boot应用测试存在的问题 官方提供的测试框架spring-boot-test-starter,虽然提供了很多功能(junit.spring test.assertj.hamcres ...
- Spring MVC的测试
测试是保证软件质量的关键. 与 Spring MVC 相关的测试,主要涉及控制器的测试. 为了测试Web项目通常不需要启动项目,需要一些Servlet相关的一些模拟对象,比如MockMVC.MockH ...
- [Java][Spring][scurity]同步session控制,防止一个用户多次登录
[Spring][scurity]同步session控制.防止一个用户多次登录 假设你希望限制单个用户仅仅能登录到你的程序一次,Spring Security通过加入以下简单的部分支持这个功能. 1. ...
- Spring Boot从入门到放弃-Spring Boot 整合测试
站长资讯摘要:使用Spring Boot 整合测试,对Controller 中某个方法进行测试或者对Service,Mapper等进行测试,不需要运行项目即可查看运行结果是否和期望值相同,Spring ...
- Spring MVC 框架的架包分析,功能作用,优点
由于刚搭建完一个MVC框架,决定分享一下我搭建过程中学习到的一些东西.我觉得不管你是个初级程序员还是高级程序员抑或是软件架构师,在学习和了解一个框架的时候,首先都应该知道的是这个框架的原理和与其有关j ...
随机推荐
- Loadrunner结果分析Graphs
Transactions(用户事务分析)----用户事务分析是站在用户角度进行的基础性能分析. Transation Sunmmary(事务综述)----对事务进行综合分析是性能分析的第一步,通过分析 ...
- hdu4893Wow! Such Sequence! (线段树)
Problem Description Recently, Doge got a funny birthday present from his new friend, Protein Tiger f ...
- C++11 : variadic templates(可变参数模板)
Introduction: Before the possibilities of the new C++ language standard, C++11, the use of templat ...
- ASP.NET获取用户端的真实IP
ASP.NET获取用户端的真实IP在各种场景都能用到,但是用户网端变幻莫测情况众多,获取真实IP还真是不容易啊.下面分享个比较好一点的方法: 获取IP初始版本 /// <summary> ...
- F# 既能解释执行,也能编译执行
F# 除了是函数式语言和面向对象语言之外,还有个突出的特点是:既能解释执行,也能编译执行. 一般说来,一种语言只能选择其一种.比如说C++.C#是编译执行,不能解释执行,象Matlab.R是解释执 ...
- MySql 1045错误
配置时以管理员身份运行MySQL Instance Configuration Wizard 当你登录MySQL数据库出现:Error 1045错误时(如下图),就表明你输入的用户名或密码错误被拒绝访 ...
- POI创建Excle
1.导包 2.Demo Workbook wb=new HSSFWorkbook();//创建工作空间 Sheet sh= wb.createSheet("工作表1");//创建工 ...
- php 之 数据访问
数据访问: 方式一:已过时,只做了解 1.造一个连接(建立通道) $db=mysql_connect("localhost","root","123& ...
- centos 安装,配置memcached
先查看是否已经安装了memcached输入memcached -h会输出memcached版本,或print phpinfo查看: memcached需要libevent支持,没有libevent,就 ...
- Python -- 大小写转换
#小写转大写 strs = 'abcd' strs = strs.upper() print u'abcd小写转大写:', strs #大写转小写 strs = 'ABCD' strs = strs. ...