【Java EE 学习 70 上】【数据采集系统第二天】【数据加密处理】【登陆验证】【登陆拦截器】【新建调查】【查询调查】
2015-12-16 19:32
225 查看
一、数据加密处理
这里使用MD5加密处理,使用java中自带加密工具类MessageDigest。
该类有一个方法digest,该方法输入参数是一个字符串返回值是一个长度为16的字节数组。最关键的是需要将这个16位的字节数组转换成为32位的字符串,转换方法是使用位移+与运算。将高四位移到低四位&0X0F得到一个字符,直接使用该值&0X0F得到一个字符,这样一个8bit的字节就能够拆成2个字符。最终16Byte就能够转换成为32个字符。
二、登陆验证
单独写一个Action对登陆进行验证
技术点有:
1.获取Session的方法:实现SessionAware接口
2.如果登陆成功就将User对象保存到Session中去,如果登录失败,则需要在返回前端的时候进行提示
前端只需要使用struts2标签进行显示即可:
3.粗体部分先忽略,是权限控制部分的内容。
三、登录拦截器
使用登录拦截器的作用是拦截没有登陆的用户访问。
1.首先新建一个类继承Interceptor,其中进行是否登陆的验证。
2.相应的需要改变strus2的默认栈
除了需要声明登录拦截器之外,还需要将默认栈改变成自己的拦截器栈surveyparkStack。
3.定义全局结果集,跳转到登陆页面
4.这里需要注意的是,需要将登陆Action和注册Action单独给拿出来,否则会陷入死循环中,比如访问登陆页面被拦截转到登陆页面再被拦截。。。。。。这样的最终结果就是stackOverFlow,为了做到这一点,所以才单独做了一个Action给登陆,单独一个Action给Register。
四、新建调查
新建调查的流程就是:单击新建调查超链接->SurveyAction调用createNewSurvey方法->重定向到显示所有调查列表Action->查询所有调查->转发到显示所有调查的页面。
这里新建的调查代码如下SurveyServiceImpl.createNewSurvey(User user):
可以看出来,新建调查之后该调查就有一个默认页了。而且由于在Bean类中大多数字段都有默认值,所以保存到数据库中的字段大多都有默认值。
五、查询调查
由于User没有关联到Survey,所以不能直接根据User对象获取Survey对象列表。需要直接使用hql查询Survey对象获取。
效果如下图所示:
这里使用MD5加密处理,使用java中自带加密工具类MessageDigest。
该类有一个方法digest,该方法输入参数是一个字符串返回值是一个长度为16的字节数组。最关键的是需要将这个16位的字节数组转换成为32位的字符串,转换方法是使用位移+与运算。将高四位移到低四位&0X0F得到一个字符,直接使用该值&0X0F得到一个字符,这样一个8bit的字节就能够拆成2个字符。最终16Byte就能够转换成为32个字符。
package com.kdyzm.utils; import java.security.MessageDigest; public class DataUtils { //TODO md5加密工具 public static synchronized String md5(String input){ try { StringBuffer sb=new StringBuffer(); String arr[]={"0","1","2","3","4","5","6","7","8","9","A","B","C","D","E","F"}; MessageDigest messageDigest=MessageDigest.getInstance("MD5"); byte []data=messageDigest.digest(input.getBytes()); System.out.println(data.length); for(byte temp:data){ //高四位 sb.append(arr[(temp>>4)&0X0F]); //低四位 sb.append(arr[temp&0X0F]); } return sb.toString(); } catch (Exception e) { e.printStackTrace(); } return ""; } }
二、登陆验证
单独写一个Action对登陆进行验证
package com.kdyzm.struts.action; import java.util.Map; import javax.annotation.Resource; import org.apache.struts2.interceptor.SessionAware; import org.springframework.context.annotation.Scope; import org.springframework.stereotype.Controller; import com.kdyzm.domain.User; import com.kdyzm.service.RightService; import com.kdyzm.service.RoleService; import com.kdyzm.service.UserService; import com.kdyzm.struts.action.base.BaseAction; @Controller("loginAction") @Scope("prototype") public class LoginAction extends BaseAction<User> implements SessionAware{ private static final long serialVersionUID = 879952397314349337L; @Resource(name="userService") private UserService userService; private Map<String,Object>session; @Resource(name="rightService") private RightService rightService; @Resource(name="roleService") private RoleService roleService; //验证用户名和密码的方法 public String chekEmailAndPassword() throws Exception{ User user=userService.checkEmailAndPassword(this.model); if(user==null){ addActionError("用户名或者密码错误!"); System.out.println("用户名或者密码错误!"); return "input"; }else{ //关于怎么将Session直接注入Action中的方法是一个比较难的题目 System.out.println("用户登陆成功!"); //在登陆成功的时候计算权限码 int maxPos=rightService.getMaxPost(); user.setRightSum(new long[maxPos+1]); if(user.isSuperAdmin()){ user.setSuperAdmin(true); }else{ user.setSuperAdmin(false); } //TODO 一定要把计算权限总和的语句放在最后,否则一旦将roles置为null,其它方法调用的时候就会出现空指针异常! user.calculateRightSum(); session.put("user", user); } return "toIndexPage"; } @Override public void setSession(Map<String, Object> session) { this.session=session; } }
技术点有:
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的默认栈
<interceptors> <interceptor name="loginInterceptor" class="com.kdyzm.struts.interceptors.LoginInterceptor"></interceptor> <interceptor-stack name="surveyparkStack"> <interceptor-ref name="loginInterceptor"></interceptor-ref> <interceptor-ref name="defaultStack"></interceptor-ref> </interceptor-stack> </interceptors> <!-- 定义默认栈 --> <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):
public void createNewSurvey(User user) { Survey survey=new Survey(); survey.setUser(user); Page page=new Page(); page.setSurvey(survey); survey.getPages().add(page); pageDao.saveEntity(page); surveyDao.saveEntity(survey); }
可以看出来,新建调查之后该调查就有一个默认页了。而且由于在Bean类中大多数字段都有默认值,所以保存到数据库中的字段大多都有默认值。
五、查询调查
由于User没有关联到Survey,所以不能直接根据User对象获取Survey对象列表。需要直接使用hql查询Survey对象获取。
String hql="from Survey where user.userId=?"; List<Survey> surveys=this.surveyDao.findEntityByHQL(hql, user.getUserId());
效果如下图所示:
相关文章推荐
- 使用update-alternatives切换ubuntu下默认java命令
- Java 应用发布后,需要关注的7个性能指标
- 如何在form:input中添加spring message code
- java web 用户单点登录的方案的基本实现
- OutOfMemory Java heap space解决方法
- Eclipse 调试技巧
- 2016届阿里实习生java研发岗一面二面三面四面经验分享
- Java collection
- java web中使用log4j路径的事
- Spring整合LogBack
- JAVA开发环境变量配置
- 诊断Java中的内存泄露
- java--反射和注解
- 深度分析 Java 的 ClassLoader 机制(源码级别)
- JDK配置完成以后,“.jar”文件双击依旧不能运行的问题
- java日历程序版本
- Java中使用jdbc连接数据库
- Java 调用构造器会不会一定产生新对象
- 深度分析 Java 的 ClassLoader 机制(源码级别)
- 轻量级JavaEE企业应用实战(五)