系统开发中使用拦截器校验是否登录并使用MD5对用户登录密码进行加密
项目名称:客户管理系统
项目描述:
项目基于javaEE平台,B/S模式开发。使用Struts2、Hibernate/Spring进行项目框架搭建。使用Struts中的Action 控制器进行用户访问控制。持久层使用Hibernate框架完成ORM处理。使用Spring AOP切面技术进行业务层事务控制。使用Spring IOC容器实现持久层管理。使用Spring IOC容器管理所有的Action,控制Action的生命周期以各种服务的注入关系。前台页面使用JSP前台页面技术和jQuery EasyUI 开发。用户登录加入MD5加密,权限验证功能。系统中查询功能使用了多条件分页查询。
下面主要对登录拦截器校验和用户登录密码MD5加密进行展示。
编写一个工具类作为自定义的权限拦截器,用于校验是否登录:
public class PrivilegeInterceptor extends MethodFilterInterceptor { @Override //不校验登陆和注册方法 protected String doIntercept(ActionInvocation invocation) throws Exception { //1 获得Session Map<String, Object> session = ActionContext.getContext().getSession(); //2 获得登陆标识 User user = (User) session.get("user"); //3 判断标识是否存在 if(user != null){ //存在=> 放行 return invocation.invoke(); }else{ //不存在=> 重定向到登陆页面 return "toLogin"; } } }
在struts配置文件中配置拦截器:
<interceptors> <!-- 注册拦截器 --> <interceptor name="privilegeInterceptor" class="com.kevin.web.interceptor.PrivilegeInterceptor"/> <!-- 配置拦截器栈 --> <interceptor-stack name="myStack"> <interceptor-ref name="privilegeInterceptor"> <param name="excludeMethods">login,regist</param> </interceptor-ref> <interceptor-ref name="defaultStack"/> </interceptor-stack> </interceptors> <!-- 指定默认拦截器栈 --> <default-interceptor-ref name="myStack"/>
MD5加密工具类
public class MD5Utils { /** * 使用md5的算法进行加密 */ public static String md5(String plainText) { byte[] secretBytes = null; try { secretBytes = MessageDigest.getInstance("md5").digest( plainText.getBytes()); } catch (NoSuchAlgorithmException e) { throw new RuntimeException("没有md5这个算法!"); } String md5code = new BigInteger(1, secretBytes).toString(16);// 16进制数字 // 如果生成数字未满32位,需要前面补0 for (int i = 0; i < 32 - md5code.length(); i++) { md5code = "0" + md5code; } return md5code; } }
在UserService的实现类中写判断登录:
public User getUserByCodePassword(User u) { //1 根据登陆名称查询登陆用户 User existU = ud.getByUserCode(u.getUser_code()); //2 判断用户是否存在.不存在=>抛出异常,提示用户名不存在 if(existU==null){ throw new RuntimeException("用户名不存在!"); } //3 判断用户密码是否正确=>不正确=>抛出异常,提示密码错误 if(!existU.getUser_password().equals(MD5Utils.md5(u.getUser_password()))){ throw new RuntimeException("密码错误!"); } //4 返回查询到的用户对象 return existU; }
在UserService的实现类中写注册用户方法:
public void saveUser(User u) { //1 调用Dao根据注册的登陆名获得用户对象 User existU = ud.getByUserCode(u.getUser_code()); if(existU!=null){ //2 如果获得到user对象,用户名已经存在,抛出异常 throw new RuntimeException("用户名已经存在!"); } //使用MD5对密码进行加密 u.setUser_password(MD5Utils.md5(u.getUser_password())); //3 调用Dao执行保存 ud.save(u); } public void setUd(UserDao ud) { this.ud = ud; }