【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());

  效果如下图所示:

posted @ 2015-12-16 19:32  狂盗一枝梅  阅读(459)  评论(0编辑  收藏  举报