项目知识点总结-过滤器-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.rhkb.cn/news/165693.html

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

相关文章

Mingw快捷安装教程 并完美解决出现的下载错误:The file has been downloaded incorrectly

安装c语言编译器的时候&#xff0c;老是出现The file has been downloaded incorrectly&#xff0c;真的让人 直接去官网拿压缩包&#xff1a;https://sourceforge.net/projects/mingw-w64/files/ &#xff08;往下拉找到那个x86_64-win32-seh的链接&#xff0c;点击后会自动…

【Java题】实现继承和多态的例子

一&#xff1a;题目 1.员工类Employee&#xff1a; &#xff08;1&#xff09;私有成员变量&#xff1a;姓名&#xff0c;年龄&#xff0c;工资 &#xff08;2&#xff09;提供无参&#xff0c;有参构造 &#xff08;3&#xff09;成员方法&#xff1a;work()方法——员工工作 …

AUTOSAR AP 硬核知识点梳理(2)— 架构详解

一 AUTOSAR 平台逻辑体系结构 图示逻辑体系结构描述了平台是如何组成的,有哪些模块,模块之间的接口是如何工作的。 经典平台具有分层的软件体系结构。定义明确的抽象层,每个抽象层都有精确定义的角色和接口。 对于应用程序,我们需要考虑使用的软件组件,希望它们是可重用的…

洗地机哪个好用?2023年洗地机推荐指南

说到提高家庭幸福生活的家电&#xff0c;洗地机肯定是少不了的&#xff0c;特别对于现在快节奏的生活来说&#xff0c;高效率的解决家务活&#xff0c;而且能够大幅度的提高生活质量。在市场上&#xff0c;消费者面临着选择合适洗地机的难题&#xff0c;因为有各种型号、功能和…

vue3 + fastapi 实现选择目录所有文件自定义上传到服务器

文章目录 ⭐前言&#x1f496; 技术栈选择 ⭐前端页面搭建&#x1f496; 调整请求content-type传递formData ⭐后端接口实现&#x1f496; swagger文档测试接口 ⭐前后端实现效果&#x1f496; 上传单个文件&#x1f496; 上传目录文件 ⭐总结⭐结束 ⭐前言 大家好&#xff0c…

嵌入式养成计划-45----QT--事件机制--定时器事件--键盘事件和鼠标事件--绘制事件

一百一十五、事件机制 当这件事情发生时&#xff0c;会自动走对应的函数处理&#xff08;重写的事件函数&#xff09; 115.1 事件处理简介 什么是事件&#xff1f; (重点) 件是由窗口系统或者自身产生的&#xff0c;用以响应所发生的各类事情&#xff0c;比如用户按下并释放…

进程与线程

进程 进程锁 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的&#xff0c;而共享带来的是竞争&#xff0c;竞争带来的结果就是错乱&#xff0c;如何控制&#xff0c;就是加锁处理 part1&#xff1a;多个进程共享同一打印终端 …

【框架源码篇 03】Spring源码手写篇-手写AOP

Spring源码手写篇-手写AOP 手写IoC和DI后已经实现的类图结构。 一、AOP分析 1.AOP是什么? AOP[Aspect Oriented Programming] 面向切面编程&#xff0c;在不改变类的代码的情况下&#xff0c;对类方法进行功能的增强。 2.我们要做什么&#xff1f; 我们需要在前面手写IoC&…

排序算法,冒泡排序算法及优化,选择排序SelectionSort,快速排序(递归-分区)

一、冒泡排序算法&#xff1a; 介绍&#xff1a; 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单直观的排序算法。它重复地走访过要排序的数列&#xff0c;一次比较两个元素&#xff0c;如果他们的顺序错误就把他们交换过来。走访数列的工作是重复地进行直到没有再需…

关于SparkRdd和SparkSql的几个指标统计,scala语言,打包上传到spark集群,yarn模式运行

需求&#xff1a; ❖ 要求:分别用SparkRDD, SparkSQL两种编程方式完成下列数据分析,结合webUI监控比较性能优劣并给出结果的合理化解释. 1、分别统计用户&#xff0c;性别&#xff0c;职业的个数&#xff1a; 2、查看统计年龄分布情况&#xff08;按照年龄分段为7段&#xff0…

初识树结构和二叉树

一&#xff0c;树概念及结构 1.1树结构的概念 树是一种非线性的数据结构&#xff0c;它是由n&#xff08;n>0&#xff09;个有限结点组成一个具有层次关系的集合。把它叫做树是因为它看起来像一棵倒挂的树&#xff0c;也就是说它是根朝上&#xff0c;而叶朝下的。 注意&a…

AI全栈大模型工程师(九)Function Calling 的机制

文章目录 Function Calling 的机制Function Calling 示例 1:加法计算器Function Calling 实例 2:四则混合运算计算器后记Function Calling 的机制 Function Calling 示例 1:加法计算器 需求:用户输入任意可以用加法解决的问题,都能得到计算结果。 # 加载环境变量import o…

人工智能发展与结构科学

人工智能&#xff08;AI&#xff09;在各种应用中的影响力不断增强&#xff0c;从简单的计算任务到复杂的决策支持。但在这背后&#xff0c;AI的发展其实是一个关于结构演变的故事。从最早的线性结构&#xff0c;到今天的复杂网络结构&#xff0c;结构的演变对AI的能力和效率产…

【linux】查看下载应用在服务器的日志

查看日志路径 一般在配置文件中logback.xml 账号密码xshell连接服务器&#xff0c;进入日志路径 根据搜索关键字查看xxx.log文件内容 cat xxx.log | grep 关键字 下载 xxx.log 到本地&#xff0c;一般可以下载当天的日志文件到本地查看比较方便 sz xxx.log 参考文章&#xff…

Adobe 推出 Photoshop Elements 2024 新版

&#x1f989; AI新闻 &#x1f680; Adobe 推出 Photoshop Elements 2024 新版 摘要:Adobe 最新发布 Photoshop Elements 2024 版本,新增引入 AI 功能,提供匹配颜色、创建照片卷、一键选择照片天空或背景等新功能,界面也进行了优化更新。本次发布重点加强了 AI 支持,简化复杂…

【软考-中级】系统集成项目管理工程师 【19 项目收尾管理】

持续更新。。。。。。。。。。。。。。。 【第十九章】收尾管理 &#xff08;选择题1分&#xff09; 19.1 项目验收19.2 项目总结19.3系统维护19.3.1软件项目的后续工作19.3.2系统集成项目的后续工作 19.4 项目后评价1. 信息系统目标评价2. 信息系统过程评价3. 信息系统效益评价…

嵌入式学习笔记(60)内存管理之堆

1.7.1.什么是堆&#xff08;heap&#xff09; 内存管理对OS来说是一件非常复杂的事&#xff0c;因为首先内存容量大&#xff0c;其次内存需求在时间和大小块上没有规律&#xff08;OS上运行着几十、几百、几千个进程随时都会申请或者释放内存&#xff0c;申请或者释放的内存块…

leetcode:2678. 老人的数目(python3解法)

难度&#xff1a;简单 给你一个下标从 0 开始的字符串 details 。details 中每个元素都是一位乘客的信息&#xff0c;信息用长度为 15 的字符串表示&#xff0c;表示方式如下&#xff1a; 前十个字符是乘客的手机号码。接下来的一个字符是乘客的性别。接下来两个字符是乘客的年…

100天掌握网络安全知识点!

1.网络安全是什么 网络安全可以基于攻击和防御视角来分类&#xff0c;我们经常听到的 “红队”、“渗透测试” 等就是研究攻击技术&#xff0c;而“蓝队”、“安全运营”、“安全运维”则研究防御技术。 2.网络安全市场 一、是市场需求量高&#xff1b; 二、则是发展相对成熟…

Microsoft Edge中使用开源的ChatGPT

一、双击打开浏览器 找到&#xff1a;扩展&#xff0c;打开 二、打开Microsoft Edge加载项 三、Move tab新标签 获取免费ChatGPT 四、启用Move tab。启用ChatGPT。 扩展 管理扩展 启用 五、新建标签页&#xff0c;使用GPT 六、使用举例 提问 GPT回复