zoukankan      html  css  js  c++  java
  • 【Java EE 学习 70 上】【数据采集系统第二天】【数据加密处理】【登陆验证】【登陆拦截器】【新建调查】【查询调查】

    一、数据加密处理

      这里使用MD5加密处理,使用java中自带加密工具类MessageDigest。

      该类有一个方法digest,该方法输入参数是一个字符串返回值是一个长度为16的字节数组。最关键的是需要将这个16位的字节数组转换成为32位的字符串,转换方法是使用位移+与运算。将高四位移到低四位&0X0F得到一个字符,直接使用该值&0X0F得到一个字符,这样一个8bit的字节就能够拆成2个字符。最终16Byte就能够转换成为32个字符。

     1 package com.kdyzm.utils;
     2 
     3 import java.security.MessageDigest;
     4 
     5 public class DataUtils {
     6     
     7     //TODO md5加密工具
     8     public static synchronized String md5(String input){
     9         try {
    10             StringBuffer sb=new StringBuffer();
    11             String arr[]={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"};
    12             MessageDigest messageDigest=MessageDigest.getInstance("MD5");
    13             byte []data=messageDigest.digest(input.getBytes());
    14             System.out.println(data.length);
    15             for(byte temp:data){
    16                 //高四位
    17                 sb.append(arr[(temp>>4)&0X0F]);
    18                 //低四位
    19                 sb.append(arr[temp&0X0F]);
    20             }
    21             return sb.toString();
    22         } catch (Exception e) {
    23             e.printStackTrace();
    24         }
    25         return "";
    26     }
    27 }

    二、登陆验证

      单独写一个Action对登陆进行验证

     1 package com.kdyzm.struts.action;
     2 
     3 import java.util.Map;
     4 
     5 import javax.annotation.Resource;
     6 
     7 import org.apache.struts2.interceptor.SessionAware;
     8 import org.springframework.context.annotation.Scope;
     9 import org.springframework.stereotype.Controller;
    10 
    11 import com.kdyzm.domain.User;
    12 import com.kdyzm.service.RightService;
    13 import com.kdyzm.service.RoleService;
    14 import com.kdyzm.service.UserService;
    15 import com.kdyzm.struts.action.base.BaseAction;
    16 @Controller("loginAction")
    17 @Scope("prototype")
    18 public class LoginAction extends BaseAction<User> implements SessionAware{
    19     private static final long serialVersionUID = 879952397314349337L;
    20     @Resource(name="userService")
    21     private UserService userService;
    22     private Map<String,Object>session;
    23     @Resource(name="rightService")
    24     private RightService rightService;
    25     @Resource(name="roleService")
    26     private RoleService roleService;
    27     //验证用户名和密码的方法
    28     public String chekEmailAndPassword() throws Exception{
    29         User user=userService.checkEmailAndPassword(this.model);
    30         if(user==null){
    31             addActionError("用户名或者密码错误!");
    32             System.out.println("用户名或者密码错误!");
    33             return "input";
    34         }else{
    35             //关于怎么将Session直接注入Action中的方法是一个比较难的题目
    36             System.out.println("用户登陆成功!");
    37             //在登陆成功的时候计算权限码
    38             int maxPos=rightService.getMaxPost();
    39             user.setRightSum(new long[maxPos+1]);
    40             if(user.isSuperAdmin()){
    41                 user.setSuperAdmin(true);
    42             }else{
    43                 user.setSuperAdmin(false);
    44             }
    45             //TODO 一定要把计算权限总和的语句放在最后,否则一旦将roles置为null,其它方法调用的时候就会出现空指针异常!
    46             user.calculateRightSum();
    47             
    48             session.put("user", user);
    49         }
    50         return "toIndexPage";
    51     }
    52     @Override
    53     public void setSession(Map<String, Object> session) {
    54         this.session=session;
    55     }
    56     
    57 }

        技术点有:

          1.获取Session的方法:实现SessionAware接口

          2.如果登陆成功就将User对象保存到Session中去,如果登录失败,则需要在返回前端的时候进行提示

     addActionError("用户名或者密码错误!");

          前端只需要使用struts2标签进行显示即可:

    <s:actionerror/>

          3.粗体部分先忽略,是权限控制部分的内容。

    三、登录拦截器

      使用登录拦截器的作用是拦截没有登陆的用户访问。

      1.首先新建一个类继承Interceptor,其中进行是否登陆的验证。

    package com.kdyzm.struts.interceptors;
    
    import java.util.Map;
    
    import javax.servlet.ServletContext;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpSession;
    
    import org.apache.struts2.ServletActionContext;
    
    import com.kdyzm.domain.User;
    import com.kdyzm.domain.security.Right;
    import com.kdyzm.struts.action.aware.UserAware;
    import com.kdyzm.utils.ValidateUtils;
    import com.opensymphony.xwork2.Action;
    import com.opensymphony.xwork2.ActionInvocation;
    import com.opensymphony.xwork2.ActionProxy;
    import com.opensymphony.xwork2.interceptor.Interceptor;
    
    /**
     * 只要请求了Action就会默认访问该拦截器
     * 登陆拦截器
     * @author kdyzm
     *
     */
    public class LoginInterceptor implements Interceptor{
        private static final long serialVersionUID = 7321012192261008127L;
    
        @Override
        public void destroy() {
            System.out.println("登录拦截器被销毁!");
        }
    
        @Override
        public void init() {
            System.out.println("登录拦截器初始化!");
        }
    
        @Override
        public String intercept(ActionInvocation invocation) throws Exception {
            System.out.println("被登录拦截器拦截!");
            Action action=(Action) invocation.getAction();
            if(action instanceof LoginAction ||action instanceof RegisterAction){
                System.out.println("即将进行登录或者注册,直接放行!");
                return invocation.invoke();
            }
            HttpServletRequest request=ServletActionContext.getRequest();
            HttpSession session=request.getSession();
            User user=(User) session.getAttribute("user");
            if(user==null){
                System.out.println("用户未登录,必须先登录再访问其他资源!即将跳转到登陆界面!");
                return "toLoginPage";
            }else{
                System.out.println("用户已经登陆,登录拦截器已经放行!");return invocation.invoke();
            }
        }
    }

      2.相应的需要改变strus2的默认栈

    1     <interceptors>
    2             <interceptor name="loginInterceptor" class="com.kdyzm.struts.interceptors.LoginInterceptor"></interceptor>
    3             <interceptor-stack name="surveyparkStack">
    4                 <interceptor-ref name="loginInterceptor"></interceptor-ref>
    5                 <interceptor-ref name="defaultStack"></interceptor-ref>
    6             </interceptor-stack>
    7         </interceptors>
    8         <!-- 定义默认栈 -->
    9         <default-interceptor-ref name="surveyparkStack"></default-interceptor-ref>

        除了需要声明登录拦截器之外,还需要将默认栈改变成自己的拦截器栈surveyparkStack。

      3.定义全局结果集,跳转到登陆页面

    <global-results>
                <result name="toLoginPage">/index.jsp</result>
    </global-results>

      4.这里需要注意的是,需要将登陆Action和注册Action单独给拿出来,否则会陷入死循环中,比如访问登陆页面被拦截转到登陆页面再被拦截。。。。。。这样的最终结果就是stackOverFlow,为了做到这一点,所以才单独做了一个Action给登陆,单独一个Action给Register。

    四、新建调查

      新建调查的流程就是:单击新建调查超链接->SurveyAction调用createNewSurvey方法->重定向到显示所有调查列表Action->查询所有调查->转发到显示所有调查的页面。

      这里新建的调查代码如下SurveyServiceImpl.createNewSurvey(User user):

     1 public void createNewSurvey(User user) {
     2         Survey survey=new Survey();
     3         survey.setUser(user);
     4         
     5         Page page=new Page();
     6         page.setSurvey(survey);
     7         survey.getPages().add(page);
     8         
     9         pageDao.saveEntity(page);
    10         surveyDao.saveEntity(survey);
    11     }

      可以看出来,新建调查之后该调查就有一个默认页了。而且由于在Bean类中大多数字段都有默认值,所以保存到数据库中的字段大多都有默认值。

    五、查询调查

      由于User没有关联到Survey,所以不能直接根据User对象获取Survey对象列表。需要直接使用hql查询Survey对象获取。

    String hql="from Survey where user.userId=?";
    List<Survey> surveys=this.surveyDao.findEntityByHQL(hql, user.getUserId());

      效果如下图所示:

  • 相关阅读:
    Algs4-1.3.44文本编辑器的缓冲区
    Algs4-1.3.42复制栈
    Algs4-1.3.41复制队列采用for方式实现
    Algs4-1.3.39环形缓冲区
    Algs4-1.3.40前移编码
    Algs4-1.3.38删除第k个元素-数组实现
    安全测试的一些漏洞和测试方法
    Java内存自动回收,为什么会有内存泄露?
    三款主流静态源代码安全检测工具比较
    Fortify源码安全检测工具
  • 原文地址:https://www.cnblogs.com/kuangdaoyizhimei/p/5052142.html
Copyright © 2011-2022 走看看