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

  效果如下图所示:

时间: 2024-08-24 15:27:47

【Java EE 学习第70天】【数据采集系统第二天】【数据加密处理】【登陆验证】【登陆拦截器】【新建调查】【查询调查】的相关文章

【Java EE 学习第70天】【数据采集系统第二天】【Action中User注入】【设计调查页面】【Action中模型赋值问题】【编辑调查】

一.Action中User注入问题 Action中可能会经常用到已经登陆的User对象,如果每次都从Session中拿会显得非常繁琐.可以想一种方法,当Action想要获取User对象的时候直接使用,这种方法还是得需要借助拦截器的力量,直接在登录拦截器中实现即可,但是登陆拦截器怎么知道该Action想要获取User对象呢?这就需要给Action加上一个接口,如果该Action是该接口的实现类,则表示该Action想要获取User对象.接口仿照HttpRequestAware接口的形式,名字为用户

Java EE学习--Quartz基本用法

新浪博客完全不适合写技术类文章.本来是想找一个技术性的博客发发自己最近学的东西,发现博客园起源于咱江苏,一个非常质朴的网站,行,咱要养成好习惯,以后没事多总结总结经验吧.很多时候都在网上搜索别人的总结,我自己也总结些东西,或许多多少少能帮得上别人. 首先提到的是Quartz,一个开源的定期执行计划任务的框架.其实我内心好奇这个框架很久了,像那些能定时修改数据库数据,定时分配任务的功能一直觉得很神奇.心动不如行动,今天我就小小的学习了一下用法,力求言简意赅,大家都懂的我就不说了. 第一步:下载Qu

Java EE 学习(7):IDEA + maven + spring 搭建 web(3)- 配置数据库

参考: https://my.oschina.net/gaussik/blog/513444 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) Java EE 学习(6):IDEA + maven + spring 搭建 web(2) 5 数据库配置 下面,就要通过一个简单的例子,来介绍 SpringMVC 如何集成 Spring Data JPA(由 Hibernate JPA 提供),来进行强大的数据库访问,并通过本章节

JAVA EE 学习笔记[V1 jsp编程]

在三月初学校开设了javaee的课程,也就此展开了对javaee基础的学习.然后老师也对这次的课程有一定要求.前面的基础就为最终的作业做准备啦~ 在上学期我们学习了java相关知识,也对java se 的安装使用有了一定的认知,而java ee则是构建于java se 平台之上的一套多层的,可扩展的的网络应用. 学习java ee我们首先进行环境的搭建.无非就是使用 tomcat进行服务器的搭建和jdk环境变量配置.而IDE这方面我们选择myeclipse 2016 CI(这个编译器自带tomc

Java EE 学习(8):IDEA + maven + spring 搭建 web(4)- 用户管理

转载:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) ava EE 学习(6):IDEA + maven + spring 搭建 web(2)- 配置 Spring Java EE 学习(7):IDEA + maven + spring 搭建 web(3)- 配置数据库 记录: 通过对用户表的管理,更加深入地讲解SpringMVC的操作. 6 用户管理 既然我们

Java EE 学习(9):IDEA + maven + spring 搭建 web(5)- 博客文章管理

转载:Gaussic(一个致力于AI研究却不得不兼顾项目的研究生) . 注:在阅读本文前,请先阅读: Java EE 学习(5):IDEA + maven + spring 搭建 web(1) Java EE 学习(6):IDEA + maven + spring 搭建 web(2)- 配置 Spring Java EE 学习(7):IDEA + maven + spring 搭建 web(3)- 配置数据库 Java EE 学习(8):IDEA + maven + spring 搭建 web(

【Java EE 学习第16天】【dbcp数据库连接池】【c3p0数据库连接池】

零.回顾之前使用的动态代理的方式实现的数据库连接池: 代码: 1 package day16.utils; 2 3 import java.io.IOException; 4 import java.lang.reflect.InvocationHandler; 5 import java.lang.reflect.Method; 6 import java.lang.reflect.Proxy; 7 import java.sql.Connection; 8 import java.sql.D

Java EE学习之旅1——HeadFirstJavaEE

因为找到的实习是用Java开发的公司,所以来学习一下Java EE的知识. 首先找来了书<轻量级Java EE企业应用实战>. 啊不得不说学了Java之后直接看这个还是完全不行呢,好多名词看都没有看过啊哈哈. 首先来看看都些啥看不懂的词... 1.JSP.Servlet和JavaBean JSP和Servlet都是用在表现层的东西,而实质上JSP编译成Servlet才运行. 但Servlet开发成本太大,所以用JSP. JavaBean用来通信交换表现层和底层数据. 2.MVC和Struts

Java EE学习——Quartz的Cron表达式

经历过低谷后,还是要好好学习,越失落会越来越落后. 今天写一下Cron表达式的用法,虽然是之前自己写的,也过了挺长一段时间,这次就拿出来作为回顾吧. Cron表达式是Quartz的精髓(个人觉得),比如我们想设定淘宝“秒杀”的那一秒时间,完全可以用下面的方法设置执行时间. Calendar cal = Calendar.getInstance(); //设置将要发生的时间... cal.set(Calendar.DATE, xxx); //.......常规的生成scheduler和job //