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>
主要代码就这些吧!有兴趣的朋友可以下载源码,全部贴出来,累死个人