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

(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"};/* */@Overridepublic 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;}@Overridepublic void destroy() {// TODO Auto-generated method stub}@Overridepublic 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 {@Overridepublic 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.....------------");}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {}@Overridepublic 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 {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("调用过滤器01对请求进行过滤~~~~");//放行,如果还有过滤器,那么就执行下一个过滤器filterChain.doFilter(servletRequest,servletResponse);System.out.println("调用过滤器01对响应进行过滤~~~~");}@Overridepublic void destroy() {}
}

第二个Filter

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.IOException;@WebFilter("/*")
public class Filter02 implements Filter {@Overridepublic void init(FilterConfig filterConfig) throws ServletException {}@Overridepublic void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {System.out.println("调用过滤器02对请求进行过滤~~~~");//放行,如果还有过滤器,那么就执行下一个过滤器filterChain.doFilter(servletRequest,servletResponse);System.out.println("调用过滤器02对响应进行过滤~~~~");}@Overridepublic 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 blocke.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 blocke.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 blocke.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"><iid="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 blocke.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 blocke.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 blocke.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 blocke.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"><iid="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"><spanstyle="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.mzph.cn/news/113434.shtml

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

相关文章

Linux---(三)基本指令大全

前提引入&#xff1a;历史上先出现的键盘还是鼠标&#xff1f; 答案&#xff1a;键盘 ✨所以刚开始的时候绝对没有图形化界面&#xff0c;因此操作系统刚开始兴起的时候绝对没有图形化界面&#xff0c;因为当时没有鼠标。 ✨因为没有图形化界面&#xff0c;只有键盘&#xff0c…

实时消息传送:WebSocket实现系统后台消息实时通知

实时消息传送&#xff1a;WebSocket实现系统后台消息实时通知 WebSocket简介基本实现步骤后台服务器后端接口SimpMessagingTemplate MessageDto前端客户端 示例应用 在现代Web应用中&#xff0c;提供实时通知对于改善用户体验至关重要。WebSocket技术允许建立双向通信通道&…

nginx常见报错及解决acme.sh给Nginx配置SSL证书

问题排查&#xff1a; nginx -t //检查配置是否正确只要返回ok就说明配置没问题。 Nginx报错Failed to restart nginx.service: Unit not found 解决方法&#xff1a; 1、在根目录下执行 vim /etc/init.d/nginx2、插入以下代码 #!/bin/sh # nginx - this script starts …

打造自己的前端组件库(奶妈版,超详细)

打造自己的前端组件库 demo是开源的&#xff0c;自己上npm 或者 github 上都能搜到 新建vue项目(sass js vue2) vue create yt-ui 修改文件目录(如下) 修改&#xff1a; 1.src 更名 examples; 2. src/components移动到项目最外层&#xff1b;3.vue.config.js更改入口文件 /…

FPGA ZYNQ VIVADO创建IP核点亮LED灯 方式一

这里写自定义目录标题 PL端 纯Verilog语言创建IP核实现点亮LED灯工使用设备 ZYNQ 7010&#xff0c;选择设备型号XC7Z010CLG400-1根据以下流程完成本次创建时钟频率50MHZ&#xff0c;周期T20ns&#xff0c;因此计数50_000_000次&#xff0c;1sLED灯闪烁一次 PL端 纯Verilog语言创…

Hadoop3教程(二十五):Yarn的多队列调度器使用案例

文章目录 &#xff08;136&#xff09;生产环境多队列创建&好处&#xff08;137&#xff09;容量调度器多队列提交案例如何创建多个队列如何向指定队列提交任务 &#xff08;138&#xff09;容量调度器任务优先级&#xff08;139&#xff09;公平调度器案例参考文献 &#…

二维码智慧门牌管理系统升级解决方案:地图展示

文章目录 前言一、地图展示功能二、其他升级和改进 前言 随着城市的发展和信息化建设的推进&#xff0c;二维码智慧门牌管理系统在社区管理、物流配送、巡检巡查等多个领域发挥着越来越重要的作用。为了更好地满足用户需求&#xff0c;提升管理效率和服务质量&#xff0c;我们…

Deep Learning for Geophysics综述阅读(未完)

文章题目《Deep Learning for Geophysics: Current and Future Trends》 文章解读&#xff1a;地球物理学&#xff08;人工智能轨道&#xff09;——&#xff08;1&#xff09;文献翻译《面向地球物理学的深度学习&#xff1a;当前与未来趋势》 - 知乎 (zhihu.com) 这里主要列…

Hive安装配置 - 内嵌模式

文章目录 一、Hive运行模式二、安装配置内嵌模式Hive&#xff08;一&#xff09;下载hive安装包&#xff08;二&#xff09;上传hive安装包&#xff08;三&#xff09;解压缩hive安装包&#xff08;四&#xff09;配置hive环境变量&#xff08;五&#xff09;关联Hadoop&#x…

基于Java的人事管理系统设计与实现(源码+lw+部署文档+讲解等)

文章目录 前言具体实现截图论文参考详细视频演示为什么选择我自己的网站自己的小程序&#xff08;小蔡coding&#xff09; 代码参考数据库参考源码获取 前言 &#x1f497;博主介绍&#xff1a;✌全网粉丝10W,CSDN特邀作者、博客专家、CSDN新星计划导师、全栈领域优质创作者&am…

使用 类加载器 或者 类对象 读取文件

相对路径&#xff1a;项目 的 根目录 开始查找。&#xff08; 但是在我们真正开发的时候&#xff0c;我们读到的更多的文件并不是直接放在我们项目里面这个文件夹里面&#xff0c;而是放在我们模块里面 &#xff09;同理可得&#xff0c;我们直接创建 文件 b.txt 会在项目的根目…

ESP32C3 LuatOS TM1650①驱动测试

合宙TM1650驱动资料 TM1650.lua源码 引脚连接 TM1650ESP32C3SCLGPIO5SDAGPIO4 下载TM1650.lua源码&#xff0c;并以文件形式保存在项目文件夹中 驱动测试源码 --注意:因使用了sys.wait()所有api需要在协程中使用 -- 用法实例 PROJECT "ESP32C3_TM1650" VERSION …

动手实现H5仿原生app前进后退切换效果

动手实现H5仿原生app前进后退切换效果 前言 最近在优化H5页面&#xff0c;我注意到当开发完成的移动端H5页面嵌入到微信小程序或者原生app中时&#xff0c;当触发页面路由切换会与原生app看上去有点格格不入&#xff0c;因为H5页面<router-view>切换路由时是直接替换了…

【Qt控件之QToolBox】介绍及使用

概述 QToolBox类提供了一个列式的带有选项卡的小部件条目。工具箱是一个小部件&#xff0c;以一个列式的选项卡显示在上方&#xff0c;并在当前选项卡下方显示当前的小部件条目。每个选项卡在选项卡列中有一个索引位置。选项卡的小部件条目是一个QWidget。 每个小部件条目都有…

[ Windows-Nginx ]Windows服务器,Tomcat容器部署项目,整合Nginx

一、官网下载Nginx http://nginx.org/en/download.html 稳定版&#xff1a;windows的stable版本 注意&#xff1a;Nginx安装包不要放在中文目录下 二、conf目录下&#xff0c;修改nginx.conf文件 修改Nginx服务端口&#xff1a; 默认端口为80&#xff0c;即外界访问的入口…

阿里巴巴店铺所有商品数据接口及店铺商品数据分析

获取阿里巴巴店铺所有商品数据的接口是阿里巴巴开放平台提供的接口&#xff0c;通过该接口可以获取店铺所有商品数据。 通过阿里巴巴开放平台接口获取店铺所有商品数据的方法如下&#xff1a; 在开放平台注册成为开发者并创建一个应用&#xff0c;获取到所需的 App Key 和 Ap…

学习c#桌面应用编程 --- 我的第一个游戏

场景 我需要做一个c#桌面窗口软件&#xff0c;但是我曾经都是专职于java开发&#xff0c;但是java对windows并不是特别友好(awt除外)&#xff0c;于是必须需要掌握c#桌面编程&#xff0c;所以我需要手动做一个小游戏&#xff0c;来学习c#的一些基本桌面应用的知识。 开始 这…

C1N短网址 - 是如何做到行业领先的

今天从技术角度来聊下短网址的一些事情&#xff0c;市面上的短网址发展基本上经历了几个阶段。 短网址发展的几个阶段&#xff1a; 第一阶段&#xff1a;网址缩短&#xff0c;很纯粹的功能&#xff0c;各个大小公司都在做&#xff0c;门槛很低。典型代表&#xff1a;百度短网…

项目添加以vue为后缀名的vue文件,怎么解析打包

我们都知道&#xff0c;将css文件打包起来&#xff0c;需要加载css-loader和style-loader&#xff0c;那么vue文件打包也需要 下载插件&#xff1a; npm install vue-loader vue-template-compiler --save -dev 下载过程&#xff1a; 下载成功样子&#xff1a; 下载完之后&am…

Android屏幕刷新机制

基础知识 CPU运行在Android设备上的中央处理器&#xff08;Central Processing Unit&#xff09;是Android设备的核心组件之一&#xff0c;负责执行计算和控制设备的各种操作。 Android设备上的CPU通常采用ARM架构&#xff0c;如ARM Cortex-A系列处理器。这些处理器具有高性能…