发表于: 2017-06-23 18:01:36

1 1049


今日完成

Des的加密和解密

@Component
public class DESUtil {

/**
    *  DES加密介绍 DES是一种对称加密算法,所谓对称加密算法即:加密和解密使用相同密钥的算法。DES加密算法出自IBM的研究,
    * 后来被美国政府正式采用,之后开始广泛流传,但是近些年使用越来越少,因为DES使用56位密钥,以现代计算能力,
    * 24小时内即可被破解。虽然如此,在某些简单应用中,我们还是可以使用DES加密算法,本文简单讲解DES的JAVA实现 。
    * 注意:DES加密和解密过程中,密钥长度都必须是8的倍数
    *
    * */

   /**
    * 加密
    * */

   public byte[] encrypt(byte[] datasource, String password){

try {
SecureRandom random = new SecureRandom();
DESKeySpec desKey = new DESKeySpec(password.getBytes());
//创建一个秘钥工厂,然后用它把DESKeySpec转换成
           SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
SecretKey secretKey = keyFactory.generateSecret(desKey);

//Cipher对象实际完成加密操作
           Cipher cipher = Cipher.getInstance("DES");
//用秘钥初始化Cipher对象
           cipher.init(Cipher.ENCRYPT_MODE,secretKey,random);

//现在获取数据并加密
           //正式执行加密操作
           return cipher.doFinal(datasource);

}catch (Throwable e){
e.printStackTrace();
}
return null;
}

/**
    * 解密
    * */
   public byte[] decrypt(byte[] src, String password) throws Exception{

//DES算法要求有一个可信任的随机数源
       SecureRandom random = new SecureRandom();
//创建一个DESKeySpec对象
       DESKeySpec desKey = new DESKeySpec(password.getBytes());
//创建一个秘钥工厂
       SecretKeyFactory keyFactory = SecretKeyFactory.getInstance("DES");
//将DESkeySpec对象转换成SecretKey对象
       SecretKey secretKey = keyFactory.generateSecret(desKey);
//Cipher对象实际完成解密操作
       Cipher cipher = Cipher.getInstance("DES");
//用秘钥初始化Cipher对象
       cipher.init(Cipher.DECRYPT_MODE,secretKey,random);
//真正开始解密操作
       return cipher.doFinal(src);
}

}

写一个main函数测试Des加密和解密

public class Main {

public static void main(String[] args){
DESUtil util = new DESUtil();
String str = "12345678";

//密码,长度要是8的倍数
       String password = "12345678";
byte[] result = util.encrypt(str.getBytes(), password);
System.out.println("加密后内容为:"+new String(result));

try{
byte[] decryResult = util.decrypt(result,password);
System.out.println("解密后内容为:" + new String(decryResult));
}catch (Exception e){

}
}
}

运行main函数输出结果

加密后内容为:���xՌ���Y��d/�

解密后内容为:12345678

这里输出为乱码

注册和登陆

@RequestMapping(value = "/regist",method = RequestMethod.GET)
public String goRegisterJSP(){
return "register";
}


@RequestMapping(value = "/registAccount",method = RequestMethod.POST)
public void register(HttpServletRequest request,HttpServletResponse response,@RequestParam("phone") String phone,@RequestParam("password") String password){

if (phone == null || phone.length() == 0){
try {
response.sendRedirect("/task5/regist");

}catch (Exception e){

}
return;
}
Student student = new Student();
student.setPhone(Long.parseLong(phone));
student.setPassword(MD5Util.stringToMD5(password));
student.setStu_name("学员");
dao.addStudent(student);
try {
response.sendRedirect("/task5/login");

}catch (Exception e){

}
}
@RequestMapping(value = "/login", method = RequestMethod.GET)
public String login(){

return "login";
}

@RequestMapping(value = "/loginIn", method = RequestMethod.POST)
public String login(HttpServletRequest request,HttpServletResponse response,@RequestParam("phone") String p,@RequestParam("password") String password){



if (p.length() == 0){
try{
response.sendRedirect("/task5/login");
}catch (Exception e){

}

return null;
}
long phone = Long.parseLong(p);

Student stu = dao.findStudentByPhone(phone);

if (!stu.getPassword().equals(MD5Util.stringToMD5(password))){
return "login";
}

拦截器

public class LoginInterceptor implements HandlerInterceptor {

/**
    * preHandle 方法是进行处理器拦截用的,该方法将在Controller处理前调用,SpringMVC中的Interceptor拦截是链式的,可以同时存在
    * 多个Interceptor,然后SpringMVC会根据声明的前后顺序一个接一个的执行,而且所有的Interceptor中的preHandle方法都会在Controller
    * 方法调用之前调用.SpringMVC的这种Interceptor链式结构也是可以进行中断的,这种中断方式是令preHandle的返回值为false
    * 当preHandle的返回值为false的时候整个请求就结束了
    * */
   public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handle) throws Exception{


//如果已经登录,就直接 chain.doFilter(request, response)放行
//        if (request.getSession().getAttribute("student") != null){
//
//            return true;
//        }

       //得到用户带过来的token的cookie
       String value = null;
Cookie[] cookies = request.getCookies();
for (int i = 0; cookies!=null && i < cookies.length; i ++){
if (cookies[i].getName().equals("token")){
value = cookies[i].getValue();
}
}

if (value == null){
response.sendRedirect("/task5/login");
return false;
}else {
return true;
}
}

/**
    * 这个方法只会在当前这个Interceptor的preHandle方法返回值为true的时候才会执行。postHandle是进行处理器拦截用的,它的执行时间是在处理器进行处理之
    * 后,也就是在Controller的方法调用之后执行,但是它会在DispatcherServlet进行视图的渲染之前执行,也就是说在这个方法中你可以对ModelAndView进行操
    * 作。这个方法的链式结构跟正常访问的方向是相反的,也就是说先声明的Interceptor拦截器该方法反而会后调用,这跟Struts2里面的拦截器的执行过程有点像,
    * 只是Struts2里面的intercept方法中要手动的调用ActionInvocation的invoke方法,Struts2中调用ActionInvocation的invoke方法就是调用下一个Interceptor
    * 或者是调用action,然后要在Interceptor之前调用的内容都写在调用invoke之前,要在Interceptor之后调用的内容都写在调用invoke方法之后。
    */
   public void postHandle(HttpServletRequest request, HttpServletResponse response, Object obj, ModelAndView mv) throws Exception{

//        Cookie[] cookies = request.getCookies();
//        int res = 0;
//        if (cookies != null){
//            for (int i = 0; i<cookies.length; i++){
//                Cookie cookie = cookies[i];
//                if (cookie.getName().equals("status") & cookie.getValue().equals("login")){
//                    res = 1;
//
//
//                }
//            }
//        }
//
//        if (res == 0){
//            Cookie cookie = new Cookie("status","loginout");
//            response.addCookie(cookie);
//            response.sendRedirect("/task5/login");
//        }






   }

/**
    * 该方法也是需要当前对应的Interceptor的preHandle方法的返回值为true时才会执行。该方法将在整个请求完成之后,也就是DispatcherServlet渲染了视图执行,
    * 这个方法的主要作用是用于清理资源的,当然这个方法也只能在当前这个Interceptor的preHandle方法的返回值为true时才会执行。
    */
   public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object var3, Exception var4) throws Exception{

}

}

login和register两个jsp

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->

   <!-- 新 Bootstrap 核心 CSS 文件 -->
   <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">

<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
   <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
   <!--[if lt IE 9]>
   <script src="//cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script>
   <script src="//cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
   <![endif]-->
   <title>登录</title>
</head>
<body>
<div class="container">
<h1>登录</h1>
<hr/>
<form:form action="/task5/loginIn" method="post" role="form">
<div class="form-group">
<label for="phone">手机号:</label>
<input type="text" class="form-control" id="phone" name="phone" placeholder="请输入手机号:"/>
</div>
<div class="form-group">
<label for="password">密码:</label>
<input type="text" class="form-control" id="password" name="password" placeholder="请输入密码:"/>
</div>
<div class="form-group">
<button type="submit" class="btn btn-sm btn-success">登录</button>
<button type="submit" class="btn btn-sm btn-success"><a href="/task5/regist">注册</a></button>
</div>
</form:form>
</div>
<!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
   <script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>

<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
   <script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>

</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<html>
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width, initial-scale=1">
<!-- 上述3个meta标签*必须*放在最前面,任何其他内容都*必须*跟随其后! -->

   <!-- 新 Bootstrap 核心 CSS 文件 -->
   <link rel="stylesheet" href="//cdn.bootcss.com/bootstrap/3.3.5/css/bootstrap.min.css">

<!-- HTML5 shim and Respond.js for IE8 support of HTML5 elements and media queries -->
   <!-- WARNING: Respond.js doesn't work if you view the page via file:// -->
   <!--[if lt IE 9]>
   <script src="//cdn.bootcss.com/html5shiv/3.7.2/html5shiv.min.js"></script>
   <script src="//cdn.bootcss.com/respond.js/1.4.2/respond.min.js"></script>
   <![endif]-->
   <title>注册</title>
</head>
<body>
<div class="container">
<h1>注册</h1>
<hr/>
<form:form action="/task5/registAccount" method="post" role="form">
<div class="form-group">
<label for="phone">手机号:</label>
<input type="text" class="form-control" id="phone" name="phone" placeholder="请输入手机号:"/>
</div>
<div class="form-group">
<label for="password">密码:</label>
<input type="text" class="form-control" id="password" name="password" placeholder="请输入密码:"/>
</div>
<div class="form-group">
<button type="submit" class="btn btn-sm btn-success">注册</button>
</div>
</form:form>
</div>
<!-- jQuery文件。务必在bootstrap.min.js 之前引入 -->
<script src="//cdn.bootcss.com/jquery/1.11.3/jquery.min.js"></script>

<!-- 最新的 Bootstrap 核心 JavaScript 文件 -->
<script src="//cdn.bootcss.com/bootstrap/3.3.5/js/bootstrap.min.js"></script>

</body>
</html>

收获

通过拦截器实现密码校验,进入t11页面,通过cookie实现已登陆用户可以访问t11页面

困难

明日计划

上传代码,结束任务


返回列表 返回列表
评论

    分享到