项目知识点总结-过滤器-MD5注册-邮箱登录

news2024/11/19 3:24:03

(1)过滤器

使用过滤器验证用户是否登录 

/**  
* @Title: NoLoginFilter.java  
* @Package com.qfedu.web.filter  
* @Description: TODO(用一句话描述该文件做什么)  
* @author Feri 
* @date 2018年5月28日  
* @version V1.0  
*/  
package com.gdsdxy.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

/**  
* @Title: NoLoginFilter.java  
* @Package com.qfedu.web.filter  
* @Description: TODO(用一句话描述该文件做什么)  
* @author Feri  
* @date 2018年5月28日  
* @version V1.0  
*/
@WebFilter("/*")
public class NoLoginFilter implements Filter {

	private String[] urls= {"getCart","addCart","order.jsp","orderDetail.jsp","getDirectOrder","addOrder","addfavorites","getGoodsById"};
	
	/* */
	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
			throws IOException, ServletException {
		
		HttpServletRequest request=(HttpServletRequest) req;
		HttpServletResponse response=(HttpServletResponse) resp;
		String path=request.getServletPath();
		if(isHave(path)) {
			//需要进行登录拦截校验
			if(request.getSession().getAttribute("user")==null) {
				response.sendRedirect("login.jsp");
			}else {
				chain.doFilter(request, response);
			}
		}else {
			chain.doFilter(request, response);
		}
	}
	private boolean isHave(String path) {
		for(String u:urls) {
			if(path.contains(u)) {
				return true;
			}
		}
		return false;
	}
	@Override
	public void destroy() {
		// TODO Auto-generated method stub
		
	}
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
		// TODO Auto-generated method stub
		
	}

}

过滤器的配置:一是通过注解,二是通过web.xml中配置

如@WebFilter("/*")就是拦截所有请求。 

xml方式可以说是和Servlet使用xml配置方式一样

    <filter>
        <filter-name>myFilter</filter-name>
        <filter-class>com.clucky.filter.MyFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>myFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

 Filter有3个阶段,分别是初始化,拦截和过滤,销毁。

        初始化阶段:当服务器启动时,我们的服务器(Tomcat)就会读取配置文件,扫描注解,然后来创建我们的Filter。
        拦截和过滤阶段:只要请求资源的路径和拦截的路径相同,那么过滤器就会对请求进行过滤,这个阶段在服务器运行过程中会一直循环。
        销毁阶段:当服务器(Tomcat)关闭时,服务器创建的Filter也会随之销毁

   FilterConfig和FilterChain这2个对象是由服务器(Tomcat)在创建和调用Filter对象时所传入的

FilterConfig对象可以读取我们配置的初始参数,FilterChain可以实现多个Filter之间的连接。

 FilterConfig

import javax.servlet.*;
import java.io.IOException;
import java.util.Enumeration;
 
public class MyFilterConfig implements Filter {
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("-----------获取全部key:value------------");
        //得到所有配置参数的名字
        Enumeration<String> names = filterConfig.getInitParameterNames();
        while (names.hasMoreElements()) {
            //得到每一个名字
            String name = names.nextElement();
            System.out.println(name+" = "+filterConfig.getInitParameter(name));
        }
        System.out.println("-----------end.....------------");
    }
 
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
    }
 
    @Override
    public void destroy() {
    }
}

xml: 

<filter>
        <filter-name>myFilterConfig</filter-name>
        <filter-class>com.clucky.filter.MyFilterConfig</filter-class>
        <init-param>
            <param-name>driver</param-name>
            <param-value>com.mysql.jdbc.Driver</param-value>
        </init-param>
        <init-param>
            <param-name>url</param-name>
            <param-value>jdbc:mysql://localhost:3306/equip_employ_manage?serverTimezone=GMT</param-value>
        </init-param>
        <init-param>
            <param-name>username</param-name>
            <param-value>root</param-value>
        </init-param>
        <init-param>
            <param-name>password</param-name>
            <param-value>root</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>myFilterConfig</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>

 FilterChain

第一个filter

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
 
@WebFilter("/*")
public class Filter01 implements Filter {
 
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
 
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("调用过滤器01对请求进行过滤~~~~");
        //放行,如果还有过滤器,那么就执行下一个过滤器
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("调用过滤器01对响应进行过滤~~~~");
    }
 
    @Override
    public void destroy() {
    }
}

第二个Filter

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;
 
@WebFilter("/*")
public class Filter02 implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
    }
 
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("调用过滤器02对请求进行过滤~~~~");
        //放行,如果还有过滤器,那么就执行下一个过滤器
        filterChain.doFilter(servletRequest,servletResponse);
        System.out.println("调用过滤器02对响应进行过滤~~~~");
    }
 
    @Override
    public void destroy() {
    }
}

    我们可以看见Filter01先进行过滤,然后交给Filter02,然后访问资源,然后Filter02对响应进行过滤,然后Filter01对响应进行过滤

多个Filter的执行顺序
        上面我们配置了2个过滤器,那么我们怎么知道那个过滤器先执行呢?其实大家可以直接使用代码进行验证,培养独立思考的习惯,这里我就直接给出答案了。

       如果我们是在web.xml中配置的过滤器,那么过滤器的执行顺序就是<filter-mapping>在web配置的顺序,配置在上面那么就会先执行。
       如果我们是使用@WebFilter进行配置的,那么执行顺序就是字符比较顺序来执行,例如有2个过滤器,一个是AFilter,一个是BFilter,那么AFilter就会先执行。
      如果注解和xml混用,那么在web.xml中配置的会先执行。
 

(2)用户注册-密码使用MD5加密

工具类:生成自定义数字 

package com.gdsdxy.common.utils;
import java.text.SimpleDateFormat;
import java.util.Calendar;
import java.util.Random;
import java.util.UUID;
//随机数
public class RandomUtils {
	//生成激活码
	public static String createActive(){
		return getTime()+Integer.toHexString(new Random().nextInt(900)+100);
	}
	//设置时间戳
	public static String getTime(){
		return new SimpleDateFormat("yyyyMMddHHmmssSSS").format(Calendar.getInstance().getTime());
	}
	//生成订单编号
	public static String createOrderId(){
		return getTime()+UUID.randomUUID().toString();
	}
}

工具类:密码加密

package com.gdsdxy.common.utils;
import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;
//MD5 摘要算法 签名或者简易加解密
public class MD5Utils {
	public static String md5(String password){
		try {
			//获取摘要对象
			MessageDigest md = MessageDigest.getInstance("MD5");
			//设置要签名的内容
			md.update(password.getBytes());
			//获取摘要结果
			return new BigInteger(1, md.digest()).toString(16);
		} catch (NoSuchAlgorithmException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return null;
	}
}

 工具类:邮箱编码、解码

package com.gdsdxy.common.utils;
import java.util.Base64;
/**
 * 基于JDK1.8实现的BASE64编码
 * 编码
 * 解码*/
public class Base64Utils {
	//编码
	public static String encode(String msg){
		return Base64.getEncoder().encodeToString(msg.getBytes());
	}
	//解码
	public static String decode(String msg){
		return new String(Base64.getDecoder().decode(msg));
	}
}

Controller: :

创建激活码,创建它给对象的属性赋值,下面利用它作为条件查询,激活对象

上传的图片:用MultipartFile  file接收,然后创建file desfile对象:再通过接口的file对象file.transferTo(创建的desfile对象)进行图片的存储

 // 注册
    @RequestMapping("userregister")
    public String register(User user, Model model, HttpSession session, HttpServletRequest request, MultipartFile file) throws IOException {
        // 创建激活码
        String acode = RandomUtils.createActive();
        user.setActivatecode(acode);

        String fn = FileUtils.createFileName(file.getOriginalFilename());

        File desfile = new File("C:\\hitech\\src\\main\\webapp\\image", fn);
        file.transferTo(desfile);
        user.setPicture(fn);

        if (userService.save(user)) {
            // 新增成功
            session.setAttribute("acode", acode);
            // 发送激活码
            EmailUtils.sendEmail(user);
            request.setAttribute("email",user.getEmail());
            request.setAttribute("zt", "会员注册");
            request.setAttribute("ts", "注册成功 别忘记激活!");
            return "registerSuccess";
        } else {
            model.addAttribute("registerMsg", "服务器开小差,请稍后再来");
            return "register";
        }
    }

UserService: 

实现类:

Dao:

//新增
	@Insert("insert into t_user(role ,username,password,email,gender,createtime ,flag ,activatecode,picture) values(1,#{username},#{password},#{email},#{gender},now(),1,#{activatecode},#{picture})")
	int insert(User user);
EmailUtils.sendEmail(user);

EmailUtils :发送邮件,进行激活用户 

package com.gdsdxy.common.utils;
import com.gdsdxy.domain.User;

import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.UnsupportedEncodingException;
import java.net.Inet4Address;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.Properties;
/*
 * 基于JDK实现邮件发送
 * 主要是实现激活码的发送
 * */
public class EmailUtils {
	public static void sendEmail(User user){
		//邮箱
		String myAccount = "lx_teach@163.com";
		//授权码
		String myPass = "java168";
		//邮箱服务器
		String SMTPHost = "smtp.163.com";
		//设置属性信息
		Properties prop = new Properties();
		//设置协议
		prop.setProperty("mail.transport.protocol", "smtp");
		//邮件服务器
		prop.setProperty("mail.smtp.host", SMTPHost);
		//认证
		prop.setProperty("mail.smtp.auth", "true");
		//1、创建会话
		Session session = Session.getDefaultInstance(prop);
		//设置是否需要调试
		session.setDebug(false);
		//2、创建发送信息
		MimeMessage message = createMsg(session,myAccount,user);
		//4发送信息操作
		try {
			Transport tran = session.getTransport();
			//连接
			tran.connect(myAccount, myPass);
			//发送消息 
			tran.sendMessage(message, message.getAllRecipients());
			//关闭
			tran.close();
		} catch (MessagingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
	//生成邮件消息
	private static MimeMessage createMsg(Session session, String myAccount, User user) {
		//创建消息对象
		MimeMessage message = new MimeMessage(session);
		//设置
		try {
			//3.1发送方
			message.setFrom(new InternetAddress(myAccount, "HITECH官方邮件", "utf-8"));
			//3.2设置接收方
			/*
			 * MimeMessage.RecipientType.TO 
			 * MimeMessage.RecipientType.CC 
			 * MimeMessage.RecipientType.BCC 
			 * */
			message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(user.getEmail(), user.getUsername(), "utf-8"));
			//3.3 设置主题
			message.setSubject("HITECH激活码","utf-8");
			//获取本机的ip地址
			String ip = Inet4Address.getLocalHost().getHostAddress();
			String url = "http://localhost:8080/hitech_war/activate?e="+ Base64Utils.encode(user.getEmail())+"&c="+Base64Utils.encode(user.getActivatecode());
			//String url = "http://"+ip+":8080/fengmi_war/activate?e="+ Base64Utils.encode(user.getEmail())+"&c="+Base64Utils.encode(user.getActivatecode());
			//设置正文信息
			message.setContent(user.getUsername()+",欢迎你加入我们<br>为了更好体验我们的产品,请点击激活<a href='"+url+"'>"+url+"</a>","text/html;charset=utf-8");
			//设置日期
			message.setSentDate(new Date());
			//保存
			message.saveChanges();
		} catch (UnsupportedEncodingException | MessagingException | UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
		return message;
	}
}


UserService 

实现类:

Dao:

//激活
	@Update("update t_user set flag=2 where email=#{email} and activatecode=#{code}")
	int updateAcode(@Param("email") String email, @Param("code") String code);

(3)用户登录-普通登录-邮箱登录

普通登录: 

Controller: 

// 登陆
    @RequestMapping("userlogin")
    public String login(String username, String password, Model model, HttpSession session) {
        if (!StrUtils.empty(username, password)) {
            User user = userService.getUserByName(username);
            if (user != null) {
                // 校验密码
                if (user.getPassword().equals(MD5Utils.md5(password))) {
                    // 正确
                    // 记录登录信息到会话中
                    session.setAttribute("user", user);
                    Cart cart = cartService.queryByUid(user.getId());
                    if (cart == null) {
                        cart = new Cart();
                        cart.setUid(user.getId());
                        cart.setMoney(0);
                        cartService.createCart(cart);
                    }
                    session.setAttribute("cart", cartService.queryByUid(user.getId()));
                    // 页面跳转
                    return "index";
                }
            }
        }
        model.addAttribute("loginMsg", "&nbsp;账号或密码错误!");
        return "login";
    }

UserService:

实现类: 

UserDao:

//登录 用户名或密码都可以使用
	@Select("select * from t_user where flag=2 and (username=#{name} or email=#{email})")
	@ResultType(User.class)
	User select(String name);

user.getPassword().equals(MD5Utils.md5(password))   :通过从数据库加密的密码进行解码,对比

登录成功后更具用户id进行查询是否含有购物车,创建一个购物车:

 Cart cart = cartService.queryByUid(user.getId());

CartService: 

实现类:

CartDao:

//获取用户的购物车
	@Select("select * from t_cart where uid=#{uid}")
	@ResultType(Cart.class)
	public Cart queryByUid(int uid);

 cartService.createCart(cart);

CaartService: 

实现类:

CartDao:

 registerSuccess页面

<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html style="height: 100%">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge">
		<meta name="viewport" content="width=device-width, initial-scale=1">
		<link href="css/bootstrap.min.css" rel="stylesheet">
		<script type="text/javascript" src="js/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="css/login.css">
<title>HITECH</title>
	<style>
		@import "https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css";
		#fhzy:hover #tb{
			color: white;
		}
		#fhzy:hover{
			background: #ff4545 !important;
		}
	</style>
</head>
<body style="height: 100%;background: url('image/商品列表背景.png');z-index: 3">
<div style="height: 100%;width: 100%;background: rgba(0,0,0,0.29);z-index: 2;display: flex;align-items: center;justify-content: center;">
	<div style="width: 700px;height: 140px;padding:25px;border-radius:3px;background-image: -webkit-linear-gradient(45deg, #ffffff 0%, #f3f3f3 100%);position: relative">
		<img src="image/图标.png" style="width: 80px;height: auto;margin-bottom: 35px"><span style="float: right;font-family: '华文新魏';font-size: 16px">${zt}</span></br>
			<div style="float: left;color: grey;font-weight:bold;background:url('image/提示背景.jpg');border-top-left-radius: 5px;border-bottom-left-radius: 5px;padding: 10px;width: 500px;text-align: center">${ts}</div>
		<a id="clj" style="background: #ff4545;color: white;border-radius:unset;height: 40px;width:150px;line-height: 27px;" class="btn" href="http://www.hao123.com/mail" target="_blank">马上前往</a>
		<a id="fhzy" href="${pageContext.request.contextPath }/index.jsp"
		   style="position: absolute;top: -25px;right: -25px;border-radius: 50%;background: white;padding: 7px"><i
				id="tb" style="height: 25px;width: 25px;text-align: center;font-size: 25px" class="fa fa-reply"
				aria-hidden="true"></i></a>
	</div>
</div>



<script>
	var email="${email}";
	var a = email.indexOf("@");
	var email = email.substring(a+1,email.length);
	console.log(email);
	$("#clj").attr("href","http://mail."+email);
</script>
</body>
</html>

点击连接进行验证登录

邮箱登录:

UserService:

实现类:更具email获取用户信息,进行发送邮件,进行验证用户登录

User Dao:

//根据email获取user实例
	@Select("select * from t_user where email=#{email} and flag=2")
	@ResultType(User.class)
	User selectEmail(String email);

EmailUtils2 :工具类发送短信:进行本地验证登录 用户信息

package com.gdsdxy.common.utils;
import com.gdsdxy.domain.User;

import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.UnsupportedEncodingException;
import java.net.Inet4Address;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.Properties;
/*
 * 基于JDK实现邮件发送
 * 主要是实现激活码的发送
 * */
public class EmailUtils2 {
    public static void sendEmail(User user){
        //邮箱
        String myAccount = "lx_teach@163.com";
        //授权码
        String myPass = "java168";
        //邮箱服务器
        String SMTPHost = "smtp.163.com";
        //设置属性信息
        Properties prop = new Properties();
        //设置协议
        prop.setProperty("mail.transport.protocol", "smtp");
        //邮件服务器
        prop.setProperty("mail.smtp.host", SMTPHost);
        //认证
        prop.setProperty("mail.smtp.auth", "true");
        //1、创建会话
        Session session = Session.getDefaultInstance(prop);
        //设置是否需要调试
        session.setDebug(false);
        //2、创建发送信息
        MimeMessage message = createMsg(session,myAccount,user);
        //4发送信息操作
        try {
            Transport tran = session.getTransport();
            //连接
            tran.connect(myAccount, myPass);
            //发送消息
            tran.sendMessage(message, message.getAllRecipients());
            //关闭
            tran.close();
        } catch (MessagingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    //生成邮件消息
    private static MimeMessage createMsg(Session session, String myAccount, User user) {
        //创建消息对象
        MimeMessage message = new MimeMessage(session);
        //设置
        try {
            //3.1发送方
            message.setFrom(new InternetAddress(myAccount, "HITECH官方邮件", "utf-8"));
            //3.2设置接收方
            /*
             * MimeMessage.RecipientType.TO
             * MimeMessage.RecipientType.CC
             * MimeMessage.RecipientType.BCC
             * */
            message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(user.getEmail(), user.getUsername(), "utf-8"));
            //3.3 设置主题
            message.setSubject("HITECH邮箱登录","utf-8");
            //获取本机的ip地址
            String ip = Inet4Address.getLocalHost().getHostAddress();
            String url = "http://localhost:8080/hitech_war/emailLogin?username="+ user.getUsername()+"&password="+user.getPassword();
            //String url = "http://"+ip+":8080/fengmi_war/activate?e="+ Base64Utils.encode(user.getEmail())+"&c="+Base64Utils.encode(user.getActivatecode());
            //设置正文信息
            message.setContent(user.getUsername()+",欢迎你,<br>点击登录(不行就复制粘贴地址到浏览器上)<a href='"+url+"'>"+url+"</a>","text/html;charset=utf-8");
            //设置日期
            message.setSentDate(new Date());
            //保存
            message.saveChanges();
        } catch (UnsupportedEncodingException | MessagingException | UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return message;
    }
}


Controller:验证用户登录 

UserService:

实现类:

UserDao:

//登录 用户名或密码都可以使用
	@Select("select * from t_user where flag=2 and username=#{username} and password=#{password}")
	@ResultType(User.class)
	User Emailyanz(@Param("username") String username,@Param("password") String password);

(4)忘记密码-发送邮件修改密码

 

 

userService.Xiugaijihuoma(acode, e); 

UserService

实现类

UserDao:

//修改激活码
	@Update("update t_user set activatecode=#{c} where email=#{e}")
	boolean Xiugaijihuoma(@Param("c") String c ,@Param("e") String e);

 userService.selectEmailAndC(acode,e);发送邮件进行修改

UserService:

实现类:

package com.gdsdxy.common.utils;
import com.gdsdxy.domain.User;

import javax.mail.MessagingException;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeMessage;
import java.io.UnsupportedEncodingException;
import java.net.Inet4Address;
import java.net.UnknownHostException;
import java.util.Date;
import java.util.Properties;
/*
 * 基于JDK实现邮件发送
 * 主要是实现激活码的发送
 * */
public class EmailUtils3 {
    public static void sendEmail(User user){
        //邮箱
        String myAccount = "lx_teach@163.com";
        //授权码
        String myPass = "java168";
        //邮箱服务器
        String SMTPHost = "smtp.163.com";
        //设置属性信息
        Properties prop = new Properties();
        //设置协议
        prop.setProperty("mail.transport.protocol", "smtp");
        //邮件服务器
        prop.setProperty("mail.smtp.host", SMTPHost);
        //认证
        prop.setProperty("mail.smtp.auth", "true");
        //1、创建会话
        Session session = Session.getDefaultInstance(prop);
        //设置是否需要调试
        session.setDebug(false);
        //2、创建发送信息
        MimeMessage message = createMsg(session,myAccount,user);
        //4发送信息操作
        try {
            Transport tran = session.getTransport();
            //连接
            tran.connect(myAccount, myPass);
            //发送消息
            tran.sendMessage(message, message.getAllRecipients());
            //关闭
            tran.close();
        } catch (MessagingException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
    //生成邮件消息
    private static MimeMessage createMsg(Session session, String myAccount, User user) {
        //创建消息对象
        MimeMessage message = new MimeMessage(session);
        //设置
        try {
            //3.1发送方
            message.setFrom(new InternetAddress(myAccount, "HITECH官方邮件", "utf-8"));
            //3.2设置接收方
            /*
             * MimeMessage.RecipientType.TO
             * MimeMessage.RecipientType.CC
             * MimeMessage.RecipientType.BCC
             * */
            message.setRecipient(MimeMessage.RecipientType.TO, new InternetAddress(user.getEmail(), user.getUsername(), "utf-8"));
            //3.3 设置主题
            message.setSubject("HITECH忘记密码","utf-8");
            //获取本机的ip地址
            String ip = Inet4Address.getLocalHost().getHostAddress();
            String url = "http://localhost:8080/hitech_war/wjmm.jsp?e="+Base64Utils.encode(user.getEmail())+"&c="+Base64Utils.encode(user.getActivatecode());
            //String url = "http://"+ip+":8080/fengmi_war/activate?e="+ Base64Utils.encode(user.getEmail())+"&c="+Base64Utils.encode(user.getActivatecode());
            //设置正文信息
            message.setContent(user.getUsername()+",你好,<br>点击更新密码(不行就复制粘贴地址到浏览器上)<a href='"+url+"'>"+url+"</a>","text/html;charset=utf-8");
            //设置日期
            message.setSentDate(new Date());
            //保存
            message.saveChanges();
        } catch (UnsupportedEncodingException | MessagingException | UnknownHostException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return message;
    }
}


registerSuccess:跳转页面
<%@ page language="java" contentType="text/html; charset=utf-8"
	pageEncoding="utf-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html style="height: 100%">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
		<meta http-equiv="X-UA-Compatible" content="IE=edge">
		<meta name="viewport" content="width=device-width, initial-scale=1">
		<link href="css/bootstrap.min.css" rel="stylesheet">
		<script type="text/javascript" src="js/jquery.min.js"></script>
<link rel="stylesheet" type="text/css" href="css/login.css">
<title>HITECH</title>
	<style>
		@import "https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css";
		#fhzy:hover #tb{
			color: white;
		}
		#fhzy:hover{
			background: #ff4545 !important;
		}
	</style>
</head>
<body style="height: 100%;background: url('image/商品列表背景.png');z-index: 3">
<div style="height: 100%;width: 100%;background: rgba(0,0,0,0.29);z-index: 2;display: flex;align-items: center;justify-content: center;">
	<div style="width: 700px;height: 140px;padding:25px;border-radius:3px;background-image: -webkit-linear-gradient(45deg, #ffffff 0%, #f3f3f3 100%);position: relative">
		<img src="image/图标.png" style="width: 80px;height: auto;margin-bottom: 35px"><span style="float: right;font-family: '华文新魏';font-size: 16px">${zt}</span></br>
			<div style="float: left;color: grey;font-weight:bold;background:url('image/提示背景.jpg');border-top-left-radius: 5px;border-bottom-left-radius: 5px;padding: 10px;width: 500px;text-align: center">${ts}</div>
		<a id="clj" style="background: #ff4545;color: white;border-radius:unset;height: 40px;width:150px;line-height: 27px;" class="btn" href="http://www.hao123.com/mail" target="_blank">马上前往</a>
		<a id="fhzy" href="${pageContext.request.contextPath }/index.jsp"
		   style="position: absolute;top: -25px;right: -25px;border-radius: 50%;background: white;padding: 7px"><i
				id="tb" style="height: 25px;width: 25px;text-align: center;font-size: 25px" class="fa fa-reply"
				aria-hidden="true"></i></a>
	</div>
</div>



<script>
	var email="${email}";
	var a = email.indexOf("@");
	var email = email.substring(a+1,email.length);
	console.log(email);
	$("#clj").attr("href","http://mail."+email);
</script>
</body>
</html>

修改密码页面:${param.e}获取连接后加密的邮箱跟激活码


<%@ page language="java" contentType="text/html; charset=utf-8"
         pageEncoding="utf-8" %>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html style="height: 100%">
<head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1">
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <script type="text/javascript" src="js/jquery.min.js"></script>
    <link rel="stylesheet" type="text/css" href="css/login.css">
    <title>HITECH</title>
    <style>
        @import "https://maxcdn.bootstrapcdn.com/font-awesome/4.4.0/css/font-awesome.min.css";

        #fhzy:hover #tb {
            color: white;
        }

        #fhzy:hover {
            background: #ff4545 !important;
        }
    </style>
</head>
<body style="height: 100%;background: url('image/商品列表背景.png');z-index: 3">
<div style="height: 100%;width: 100%;background: rgba(0,0,0,0.29);z-index: 2;display: flex;align-items: center;justify-content: center;">
    <div style="width: 303px;height: 205px;padding:25px;border-radius:3px;background-image: -webkit-linear-gradient(45deg, #ffffff 0%, #f3f3f3 100%);position: relative">
        <img src="image/图标.png" style="width: 80px;height: auto;margin-bottom: 35px"><span
            style="float: right;font-family: '华文新魏';font-size: 16px">修改密码</span></br>
        <form action="wjmm" method="post" style="font-family: '华文新魏'">
            请输入新密码:<input id="psd1" type="password" name="password"
                          style="border-radius: 3px;border: 1px solid #3cadeb;margin: 0 0 10px 0;" required="required"
                          pattern="[a-zA-Z0-9_!@#$%^&*]{5,16}"></br>
            再次输入密码:<input id="psd2" type="password" name="password2"
                          style="border-radius: 3px;border: 1px solid #3cadeb;margin: 0;" required="required"
                          onchange="validate()"></br>
            <input type="hidden" name="e" value="${param.e}">
            <input type="hidden" name="c" value="${param.c}">
            <button id="btn1"
                    style="background: #ff4545;color: white;border-radius:unset;width:100%;line-height: 27px;border: unset;margin-top: 25px;"
                    type="submit" value="确认">确认
            </button>
        </form>
    </div>
</div>


<script>


    function validate() {
        var psd1Val = document.getElementById('psd1').value;
        var psd2 = document.getElementById('psd2');  //分开写是为了下面的focus()方法;
        var psd2Val = psd2.value;
        if (psd2Val != psd1Val) {
            $("#btn1").attr("disabled", true);
            psd2.focus();//焦点放在psd2上,无需用户再次点击
            alert("两次密码必须一样,密码必须大于五位数")
        } else {
            $("#btn1").removeAttr("disabled");
        }
    }


</script>

</body>
</html>

Controller: 

UserService:

 实现类:

UserDao:

//根据email和激活码修改密码
	@Update("update t_user set password=#{password},activatecode=#{cc} where email=#{e} and activatecode=#{c}")
	boolean wjmm(@Param("cc") String cc,@Param("password") String password,@Param("e") String e,@Param("c") String c);

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1118104.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

12 Masked Self-Attention(掩码自注意力机制)

博客配套视频链接: https://space.bilibili.com/383551518?spm_id_from=333.1007.0.0 b 站直接看 配套 github 链接:https://github.com/nickchen121/Pre-training-language-model 配套博客链接:https://www.cnblogs.com/nickchen121/p/15105048.html 上节课回顾 《Attenti…

Pandas数据处理分析系列2-数据如何导入

Pandas Excel 数据导入 Pandas库提供了一组强大的输入/输出(I/O)函数(简称为:I/O API),用于读取和写入各种数据格式,目前已支持常见的多种外数据格式。 Pandas 常见读取方法如下表: 可以看出,在使用Pandas 读取数据格式文件时,只需一个方法则可,不同的方法参数, 可…

P3 查询

文章目录 Task1 访问方法执行程序seq_scan_executorinsert_executorupdate_executordelete_executorindex_scan_executor Task2 聚合和连接执行器AggregationNestedLoopJoinHashJoin优化NestedLoopJoin到HashJoin Task3 排序限制执行器和Top-N优化SortLimitTop-N优化规则 BusTu…

反射、注解、元注解、动态代理

反射 反射就是&#xff1a;加载类&#xff0c;并允许以编程的方式解剖类中的各种成分&#xff08;成员变量、方法、构造器等 学习反射就是学习如何获取类的信息并操作它们 加载类&#xff0c;获取类的字节码&#xff1a;Class对象获取类的构造器&#xff1a;Constructor对象获…

滚珠螺杆应如何存放避免受损

滚珠螺杆是一种高精度的机械零件&#xff0c;保存或使用不当&#xff0c;会直接损坏&#xff0c;影响生产效率&#xff0c;因此我们在使用时需要注意以下事项&#xff1a; 1、避免垂直放置&#xff1a;没有施加预压的螺杆垂直放置时&#xff0c;螺母会因自重而从螺杆轴上脱荐下…

【斗破年番】谣言不攻自破,萧潇造型曝光,制作进度已达中州,风尊者帅翻

Hello,小伙伴们&#xff0c;我是小郑继续为大家深度解析重要国漫资讯。 斗破苍穹动画中&#xff0c;萧炎与小医仙重聚&#xff0c;也即将与美杜莎女王回蛇人族见家长&#xff0c;剧情一度变得愈加的炸裂&#xff0c;颇有逐鹿鹅厂国漫第一把交椅的架势。正因此&#xff0c;斗破动…

强化学习 | Python强化学习

强化学习在近年来取得了巨大的突破,使机器能够在不断的试错中自动学习并做出决策。 本文将介绍强化学习的基本概念、原理和应用,同时提供详细的公式解释和Python代码示例。 强化学习是什么? 强化学习是一种机器学习方法,用于让智能体(例如机器人、自动驾驶汽车或游戏玩家…

Keil 5 安装教程(最新最全最详细)附网盘资源

一.简介 文章转自其他平台 链接: keil5下载连接. 官方下载地址&#xff1a;https://www.keil.com/download/product/ Keil5&#xff08;32/64&#xff09;位下载地址&#xff1a; 链接&#xff1a; https://pan.baidu.com/s/1Jn15jeb0Aa1cSietvXfcwg 密码&#xff1a;8ji…

基于springboot实现财务管理系统项目【项目源码+论文说明】计算机毕业设计

基于springboot实现财务管理系统演示 摘要 随着信息技术和网络技术的飞速发展&#xff0c;人类已进入全新信息化时代&#xff0c;传统管理技术已无法高效&#xff0c;便捷地管理信息。为了迎合时代需求&#xff0c;优化管理效率&#xff0c;各种各样的管理系统应运而生&#x…

记录阿里云服务器(Centos7.9)部署Thingsboard(3.4.2)遇到的一些问题

记录编译Thingsboard遇到的一些问题 部署了一个thingsboard项目到阿里云服务器上&#xff0c;历时十一天&#xff0c;遇到了很多困难&#xff0c;国内关于Thingsboard的资料确实很少&#xff0c;所以想着写一篇博客记录一下&#xff0c;或许能够给以后编译遇到类似问题的人一些…

Pandas数据处理分析系列3-数据如何预览

Pandas-数据预览 Pandas 导入数据后,我们通常需要对数据进行预览,以便更好的进行数据分析。常见数据预览的方法如下: ①head() 方法 功能:读取数据的前几行,默认显示前5行 语法结构:df.head(行数) df1=pd.read_excel("销售表.xlsx",sheet_name="手机销…

AUTOSAR EcuM休眠阶段的具体实现详解

在AUTOSAR EcuM SWS里对于Sleep阶段做出了一个宏观的流程设计,如下: 从BswM过渡到EcuM的规则仲裁这里暂时不讲,有兴趣可以看之前我遇到的工程问题分析,特别是BswM状态迁移图: BswM状态分析 今天主要聊AUTOSAR规定的sleep两种模式:Halt和Poll,以及这两种模式下,…

【趣味随笔】农业机器人的种类与发展前景

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

在Mac上使用安卓桌面模式

在安装Homeblew的基础上 替换国内源 export HOMEBREW_API_DOMAIN"https://mirrors.tuna.tsinghua.edu.cn/homebrew-bottles/api" export HOMEBREW_BREW_GIT_REMOTE"https://mirrors.tuna.tsinghua.edu.cn/git/homebrew/brew.git" brew update 安装Scrcpy …

【2023_10_21_计算机热点知识分享】:机器学习中的神经网络

今天的分享主题是机器学习中的神经网络。神经网络是一种模拟人类神经系统的计算模型&#xff0c;它由一系列的神经元组成&#xff0c;每个神经元接收一组输入&#xff0c;经过计算后产生一个输出。神经网络的学习过程是通过调整神经元之间的连接权重来实现的&#xff0c;这个过…

Unity--用户界面

目录 “使用工具栏”&#xff1a; “层次结构”窗口&#xff1a; 层次结构窗口 制作子GameObject “游戏”视图&#xff1a; “场景视图“&#xff1a; ”项目窗口“&#xff1a; 项目窗口工具栏&#xff1a; "Inspector" 窗口&#xff1a; Inspector 游戏…

UG\NX二次开发 实时查看 NX 日志文件

文章作者:里海 来源网站:王牌飞行员_里海_里海NX二次开发3000例,里海BlockUI专栏,C\C++-CSDN博客 感谢粉丝订阅 感谢 a18037198459 订阅本专栏,非常感谢。 简介 实时查看 NX 日志文件,有助于分析保存时间等。打开WindowsPowerShell并实时获取日志文件内容的小功能。 效果 代…

力扣每日一题52:N皇后问题||

题目描述&#xff1a; n 皇后问题 研究的是如何将 n 个皇后放置在 n n 的棋盘上&#xff0c;并且使皇后彼此之间不能相互攻击。 给你一个整数 n &#xff0c;返回 n 皇后问题 不同的解决方案的数量。 示例 1&#xff1a; 输入&#xff1a;n 4 输出&#xff1a;2 解释&#…

Pyside6 QFileDialog

Pyside6 QFileDialog Pyside6 QFileDialog常用函数getOpenFileNamegetOpenFileNamesgetExistingDirectorygetSaveFileName 程序界面程序主程序 Pyside6 QFileDialog提供了一个允许用户选择文件或目录的对话框。关于QFileDialog的使用可以参考下面的文档 https://doc.qt.io/qtfo…

Easyx趣味编程7,鼠标消息读取及音频播放

hello大家好&#xff0c;这里是dark flame master&#xff0c;今天给大家带来Easyx图形库最后一节功能实现的介绍&#xff0c;前边介绍了绘制各种图形及键盘交互&#xff0c;文字&#xff0c;图片等操作&#xff0c;今天就可以使写出的程序更加生动且容易操控。一起学习吧&…