【Java EE 学习 70 上】【数据采集系统第二天】【数据加密处理】【登陆验证】【登陆拦截器】【新建调查】【查询调查】
一、数据加密处理
这里使用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());
效果如下图所示:

【Java EE 学习 70 上】【数据采集系统第二天】【数据加密处理】【登陆验证】【登陆拦截器】【新建调查】【查询调查】的更多相关文章
- 【Java EE 学习 70 下】【数据采集系统第二天】【Action中User注入】【设计调查页面】【Action中模型赋值问题】【编辑调查】
一.Action中User注入问题 Action中可能会经常用到已经登陆的User对象,如果每次都从Session中拿会显得非常繁琐.可以想一种方法,当Action想要获取User对象的时候直接使用, ...
- 【Java EE 学习 74 上】【数据采集系统第六天】【使用Jfreechart的统计图实现】【Jfreechart的基本使用方法】
之前已经实现了数据的采集,现在已经有了基本的数据,下一步就需要使用这些数据实现统计图的绘制了.这里使用Jfreechart实现这些统计图的绘制.首先看一下Jfreechart的基本用法,只有知道了它的 ...
- 【Java EE 学习 78 上】【数据采集系统第十天】【Service使用Spring缓存模块】
一.需求分析 调查问卷中或许每一个单击动作都会引发大量的数据库访问,特别是在参与调查的过程中,只是单击“上一页”或者“下一页”的按钮就会引发大量的查询,必须对这种问题进行优化才行.使用缓存策略进行查询 ...
- 【Java EE 学习 76 上】【数据采集系统第八天】【角色授权】【用户授权】【权限的粗粒度控制】【权限的细粒度控制】
一.角色管理 单击导航栏上的"角色管理"超链接,跳转到角色管理界面,在该界面上显示所有角色,并提供角色的增加和删除.修改超链接. 1.增加新角色(角色授权) 流程:单击增加新角色超 ...
- 【Java EE 学习 72 上】【数据采集系统第四天】【增加调查logo】【文件上传】【动态错误页指定】【上传限制】【国际化】
增加logo的技术点:文件上传,国际化 文件上传的功能在struts2中是使用文件上传拦截器完成的. 1.首先需要在页面上添加一个文件上传的超链接. 点击该超链接能够跳转到文件上传页面.我给该表单页面 ...
- 【Java EE 学习 80 上】【WebService】
一.WebService概述 什么是WebService,顾名思义,就是基于Web的服务,它使用Http方式接收和响应外部系统的某种请求,从而实现远程调用.WebService实际上就是依据某些标准, ...
- 【Java EE 学习 35 上】【strus2】【类型转换器】【struts2和Servlet API解耦】【国际化问题】【资源文件乱码问题已经解决】
一.类型转换器 1.在动作类action中,声明和表单中name属性的值同名的属性,提供get和set方法,struts2就可以通过反射机制,从页面中获取对应的内容 package com.kdyzm ...
- 【Java EE 学习 79 上】【mybatis 基本使用方法】
一.简介 mybatis类似于hibernate,都是简化对数据库操作的框架,但是和hibernate不同的是,mybatis更加灵活,整体来说框架更小,这体现在它需要我们手写SQL语句,而hiber ...
- 【Java EE 学习 25 上】【网上图书商城项目实战】
一.概述 1.使用的jdk版本:1.6 2.java EE版本:1.6 3.指导老师:传智播客 王建 二.小项目已经实现的功能 普通用户: 1.登陆 2.注册 3.购物 4.浏览 管理员用户(全部管理 ...
随机推荐
- NSString属性什么时候用copy,什么时候用strong?
我们在声明一个NSString属性时,对于其内存相关特性,通常有两种选择(基于ARC环境):strong与copy.那这两者有什么区别呢?什么时候该用strong,什么时候该用copy呢 ...
- ASP.NET Forms 身份验证
ASP.NET Forms 身份验证 在开发过程中,我们需要做的事情包括: 1. 在 web.config 中设置 Forms 身份验证相关参数.2. 创建登录页. 登录页中的操作包括: 1. 验证用 ...
- Spring MVC学习笔记——文件上传
1.实现文件上传首先需要导入Apache的包,commons-fileupload-1.2.2.jar和commons-io-2.1.jar 实现上传就在add.jsp文件中修改表单 enctype= ...
- php function集合
/*更新商品的某个字段*/ function update_goods($goods_id, $field, $value) { if ($goods_id) { /* 清除缓存 */ clear_c ...
- iOS组件化思路 <转>
随着应用需求逐步迭代,应用的代码体积将会越来越大,为了更好的管理应用工程,我们开始借助CocoaPods版本管理工具对原有应用工程进行拆分.但是仅仅完成代码拆分还不足以解决业务之间的代码耦合,为了更好 ...
- CSS布局奇淫技巧之--各种居中
居中是我们使用css来布局时常遇到的情况.使用css来进行居中时,有时一个属性就能搞定,有时则需要一定的技巧才能兼容到所有浏览器,本文就居中的一些常用方法做个简单的介绍. 注:本文所讲方法除了特别说明 ...
- 网络第三节——NSURLSession
有的程序员老了,还没听过NSURLSession有的程序员还嫩,没用过NSURLConnection有的程序员很单纯,他只知道AFN. NSURLConnection在iOS9被宣布弃用,NSURLS ...
- CentOS 6.5 安装 Redis-3.2.6
到官网下载最新版的 Redis-3.2.6, 我把它放到文件夹:/usr/local/src/centos-sdk/source2/redis 安装脚本 redis-3.2.6.sh #!/bin/b ...
- Javascript设计模式学习二(单例)
定义:保证一个类仅有一个实例,并提供一个访问它的全局访问点 普通的单例模式: 使用一个变量来标记当前是否已经为某个类创建过对象,如果是的话,在下一次获取该类的实例时,直接返回之前创建的对象.比如:使用 ...
- virut详细分析
Virut分析 0x00.综合描述 virut样本的执行过程大体可以分为六步:第一步,解密数据代码,并调用解密后的代码:第二步,通过互斥体判断系统环境,解密病毒代码并执行:第三步,创建内存映射文件,执 ...