SSM 기반 부동산 관리 시스템(로그인, 등록, 비밀번호 찾기, MD5, 자바메일, html 주입 방지)

58464 단어 JavaWeb

SSM 구축


초보자에게 SSM 프레임워크를 구축하는 것은 고통스럽다. 친구와 이 블로그를 통해 SSM 첫 번째 가장 간단한 SSM 프레임워크 구축 과정인 SSM 단순 통합의 도움은 결국 구축되었다.
건설할 때 겪는 몇 가지 문제를 제시한다. 1.역방향 생성 도구는 Dao, Mapping, Pojo를 자동으로 생성하는 도구로 경로를 src와 같은 디렉터리에 두면 생성 경로의 고민을 피할 수 있다.      2. 생성된 Dao 파일의 이름은 xxMapper입니다. 필요하면 xxDao로 바꿀 수 있습니다. 저는 귀찮아서 바꾸지 않았습니다.      3. 정적 파일 (css 등) 을 차단하지 마십시오. 그렇지 않으면 전단 스타일이 표시되지 않습니다. 저는 웹에 있습니다.xml에 설정되어 있습니다

default
/static/*

      4. SendMail 클래스를 작성할 때, 클래스 주석을 컨트롤 (@Component) 으로 표시하고, 클래스를 설명할 때 @Autowired로 클래스에 표시하여 자동 조립 작업을 완성합니다.
    @Autowired
    SendMail sendMail;

이제 본론으로 들어갑니다.

로그인


로그인 인터페이스에는 비밀번호 기억, 비밀번호 찾기, 로그인, 등록 기능이 있습니다.로그인: 먼저 계정의 비밀번호가 비어 있는지 판단한 다음에 데이터베이스에 이 계정이 존재하는지 판단하고 마지막으로 비밀번호가 정확한지 판단한다. 비밀번호는 MD5로 암호화되기 때문에 입력한 비밀번호를 MD5로 한 다음에 데이터베이스에 있는 비밀번호와 비교하고 정확하면 시스템에 들어간다.비밀번호 찾기: 메일박스에 인증코드를 보내는 형식으로 리셋(MD5는 인코딩할 수 없음);비밀번호 기억하기: 쿠키로 사용자 계정, 비밀번호 저장하기;등록: 자바 메일 도구 클래스를 사용하여 자신의 QQ 메일박스로 사용자 메일박스에 인증코드를 발송합니다.FrontLoginController.java:
    /**
     *          
     * @return login.jsp
     */
    @RequestMapping("/login")
    public String login(){
        return "/front/login";
    }

login.jsp:
  <form id="frontLoginForm" action="${pageContext.request.contextPath}/frontLogin/check" method="post"> 
   <fieldset> 
    <div> 
     <c:choose> 
      <c:when test="${not empty loginEmail}"> 
       <input value="${requestScope.loginEmail}" id="email" name="email" type="email" autofocus="" /> 
      c:when> 
      <c:otherwise> 
       <input placeholder="E-mail" id="email" name="email" type="email" autofocus="" /> 
      c:otherwise> 
     c:choose> 
    div> 
    <div > 
     <input placeholder="  " id="password" name="password" type="password" value="" /> 
    div> 
    <div > 
     <label> <input id="remember" name="remember" type="checkbox" value="Remember Me" />     label> 
    div> 
    <div >
    <a href="${pageContext.request.contextPath}/frontLogin/forget" style="float:right">      a>
    <a href="${pageContext.request.contextPath}/frontRegister/register">    a>
    div> 
    <font size="4" color="red"> ${loginError} font> 
    <button type="submit" class="btn btn-lg btn-success btn-block">  button>
   fieldset> 
  form>

암호 기억하기

<script>
        window.onload = function(){
            var oForm = document.getElementById('frontLoginForm');
            var oUser = document.getElementById('email');
            var oPswd = document.getElementById('password');
            var oRemember = document.getElementById('remember');
            //      ,      cookie     
            if(getCookie('email') && getCookie('password')){
              oUser.value = getCookie('email');
              oPswd.value = getCookie('password');
              oRemember.checked = true;
            }
            //            ,        cookie
            oRemember.onchange = function(){
              if(!this.checked){
                delCookie('email');
                delCookie('password');
              }
            };
            //         ,             cookie
            oForm.onsubmit = function(){
              if(remember.checked){ 
                setCookie('email',oUser.value,7); //     cookie,   7 
                setCookie('password',oPswd.value,7); //     cookie,   7 
              }
            };
        };
        //  cookie
        function setCookie(name,value,day){
            var date = new Date();
            date.setDate(date.getDate() + day);
            document.cookie = name + '=' + value + ';expires='+ date;
        };
        //  cookie
        function getCookie(name){
            var reg = RegExp(name+'=([^;]+)');
            var arr = document.cookie.match(reg);
            if(arr){
              return arr[1];
            }else{
              return '';
            }
        };
        //  cookie
        function delCookie(name){
            setCookie(name,null,-1);
        };
    script>

FrontLoginController.자바는session으로 사용자의 계정 비밀번호를 저장하고session의 정보는 서버에 존재하며sessionId는 클라이언트의 쿠키에 저장됩니다. 같은session으로 사용자의 정보를 저장하기 때문에 한 브라우저가 한 사용자만 로그인할 수 있도록 제한합니다.시스템에 로그인하기 전에 이session이 존재하는지 판단하고, 존재하면 로그인한 계정인지 판단하고, 그렇지 않으면 다시 시스템에 들어가고, 그렇지 않으면 로그인 인터페이스로 돌아간다.
    /**
     *           ,    
     * @param request
     * @param session
     * @return login.jsp   index.jsp
     */
    @RequestMapping(value = "/check", method = RequestMethod.POST)
    public ModelAndView check(HttpServletRequest request, HttpSession session){
        String email = request.getParameter("email");
        String password = request.getParameter("password");

        ModelAndView mv = new ModelAndView();
        mv.addObject("loginEmail", email);
        mv.setViewName("/front/login");

        if(email.equals("")){
            request.setAttribute("loginError", "      ");
            return mv;
        }else{
            if(password.equals("")){
                request.setAttribute("loginError", "      ");
                return mv;
            }
        }
        //           
        Owner owner = frontLoginService.getByEmail(email);
        if(owner == null){
            request.setAttribute("loginError", "     ");
            return mv;
        }

        //       MD5  
        MD5 md5 = new MD5();
        String md5Password = md5.getMD5(password);
        if(md5Password.equals(owner.getOwnersPassword())){

            mv.setViewName("/front/index");

            Owner sessionOwner = (Owner) session.getAttribute("owner");
            //    session
            if(sessionOwner != null ){
                String sessionEmail = sessionOwner.getOwnersEmail();
                //    
                if(sessionEmail.equals(email)){
                    return mv;
                }else{
                    mv.setViewName("/front/login");
                    request.setAttribute("loginError", "             ,        ");
                    return mv;
                }
            //   session
            }else{
                session.setAttribute("owner", owner);
                return mv;
            }
        }else{
            request.setAttribute("loginError", "     ");
            return mv;
        }
    }

등록!


등록업자는 업주의 메일박스가 유효한 메일박스임을 보증해야 한다. 그렇지 않으면 검증 코드 검사를 통과할 수 없다.인증코드는 6개의 0-9의 정수로 랜덤으로 구성되며 발송된 인증코드마다 이메일코드표에 저장됩니다.등록할 때 상응하는 단원 번호를 기입해야 하며 각 단원 방은 하나의 계좌만 등록할 수 있다.
FrontRegisterController
    /**
     *        
     * @return register.jsp
     */
    @RequestMapping("/register")
    public String register(){
        return "/front/register";
    }

register.jsp
<form action="${pageContext.request.contextPath}/frontRegister/check" method="post"> 
   <fieldset> 
    <div> 
     <c:choose> 
      <c:when test="${not empty registerEmail}"> 
       <input value="${requestScope.registerEmail}" id="email" name="email" type="email" required="" autofocus="" /> 
      <a href="javascript:void" style="float:center" onclick="getEmail()">     a>
      c:when> 
      <c:otherwise> 
       <input placeholder="E-mail" id="email" name="email" type="email" required="" autofocus="" /> 
       <a href="javascript:void" style="float:center" onclick="getEmail()">     a>
      c:otherwise> 
     c:choose> 
    div> 
    <div > 
     <input placeholder="   " name="code" type="text" required="" /> 
    div> 
    <div> 
     <c:choose> 
      <c:when test="${not empty registerPassword}"> 
       <input value="${requestScope.registerPassword}" id="pwd1" name="password" type="password" required="" onkeyup="checkLength()" /> 
       <span id="spanLen">span> 
      c:when> 
      <c:otherwise> 
       <input placeholder="  " id="pwd1" name="password" type="password" required="" onkeyup="checkLength()" /> 
       <span id="spanLen">span> 
      c:otherwise> 
     c:choose> 
    div> 
    <div> 
     <input placeholder="    " id="pwd2" name="password2" type="password" required="" onblur="checkPSW()" /> 
     <span id="pswInfo" style="color: #c41a15;">span> 
    div> 
    <div> 
     <c:choose> 
      <c:when test="${not empty registerRoomId}"> 
       <input value="${requestScope.registerRoomId}" name="roomId" type="text" required="" /> 
      c:when> 
      <c:otherwise> 
       <input placeholder="   " name="roomId" type="text" required="" /> 
      c:otherwise> 
     c:choose> 
    div> 
    <font size="3"> <a href="${pageContext.request.contextPath}/frontLogin/login" style="float:center">a> font> 
    <font size="4" color="red"> ${loginError} font> 
    <button id="btregister" type="submit" >  button> 
   fieldset> 
  form>

암호 강도 판단, 인증코드 보내기(script)
    <script>  
        function checkLength(){  
            var pwd1 = document.getElementById("pwd1").value;  
            var spanLen = document.getElementById("spanLen");  
            if(pwd1.length <= 3 && pwd1.length > 0)  
                spanLen.innerHTML="    : ";  
            else if(pwd1.length <= 6)  
                spanLen.innerText="    : ";  
            else  
                spanLen.innerText="    : ";  
        }  
        function checkPSW(){
            var pwd1 = document.getElementById("pwd1").value;  
            var pwd2 = document.getElementById("pwd2").value;  
            var pswInfo = document.getElementById("pswInfo");  
            if(pwd1 != pwd2){
                pswInfo.innerText="      ";
                document.getElementById("btregister").disabled = true;
            }
            else {
                pswInfo.innerText="";
                document.getElementById("btregister").disabled = false;
            } 
        }
        function getEmail(){
            var email = document.getElementById("email").value; 
            if(email != ''){
                window.location.href = "${pageContext.request.contextPath}/frontRegister/registerCode?email="+email;
            }else{
                alert("      ");
            }
        }
    script> 

FrontLoginController.java
    /**
     *        
     * @param request
     * @return register.jsp
     */
    @RequestMapping("/registerCode")
    public ModelAndView forget(HttpServletRequest request){

        String email = request.getParameter("email");

        ModelAndView mView = new ModelAndView();
        mView.addObject("registerEmail", email);
        mView.setViewName("/front/register");

        Owner owner = ownerService.selectByEmail(email);
        if(owner != null){
            request.setAttribute("loginError", "       ");
            return mView;
        }
        //      0-9         
        StringBuffer code = new StringBuffer();
        Random random = new Random();
        for (int i=0; i<6; i++) {
            code.append(random.nextInt(10));
        }
        //    
        try {
            sendMail.sendCode(email, code.toString());
        } catch (Exception e) {
            request.setAttribute("loginError", "     ");
            return mView;
        }
        // emailcode      
        EmailCode existCode = emailCodeService.getByEmail(email);
        //     
        if(existCode == null){
            EmailCode emailCode = new EmailCode();
            emailCode.setOwnersEmail(email);
            emailCode.setCodeNum(code.toString());
            emailCodeService.insertByNoId(emailCode);
        //     
        }else{
            emailCodeService.updateByEmail(code.toString(), email);
        }
        return mView;
    }

등록된 사용자 정보가 규범에 부합되는지 검사하다
    /**
     *         ,     
     * @param request
     * @param session
     * @return true:index.jsp false:register.jsp
     */
    @RequestMapping(value = "/check", method = RequestMethod.POST)
    public ModelAndView setOwner (HttpServletRequest request, HttpSession session){
        String registerEmail = request.getParameter("email");
        String registerPassword = request.getParameter("password");
        int registerRoomId = Integer.valueOf(request.getParameter("roomId"));
        String inputCode = request.getParameter("code");

        Owner existOwner = frontRegisterService.getByEmail(registerEmail);

        ModelAndView mView = new ModelAndView();
        mView.addObject("registerEmail", registerEmail);
        mView.addObject("registerPassword", registerPassword);
        mView.addObject("registerRoomId", registerRoomId);
        mView.setViewName("/front/register");

        if(existOwner != null){
            request.setAttribute("loginError", "      ");
            return mView;
        }

        //         
        EmailCode emailCode = emailCodeService.getByEmail(registerEmail);
        String existCode = emailCode.getCodeNum();
        if(!inputCode.equals(existCode)){
            request.setAttribute("loginError", "      ");
            return mView;
        }
        //             
        Room existRoom = roomService.getByPrimaryKey(registerRoomId);
        if(existRoom != null ){
            if(existRoom.getRoomOwner() == null){
                //       
                MD5 md5 = new MD5();
                String registerPasswordMD5 = md5.getMD5(registerPassword);

                Owner owner = new Owner();
                owner.setOwnersEmail(registerEmail);
                owner.setOwnersPassword(registerPasswordMD5);
                owner.setRoomId(registerRoomId);

                //     
                ownerService.insertByRegister(owner);

                //  room  id
                Owner roomOwner = ownerService.selectByEmail(registerEmail);
                if(roomOwner != null){
                    int ownerId = roomOwner.getOwnersId();
                    roomService.updateByRegister(ownerId, registerRoomId);
                }

                session.setAttribute("owner", owner);

                mView.setViewName("/front/index");
                return mView;
            }else{
                request.setAttribute("loginError", "       ,          ");
                return mView;
            }
        }else{
            request.setAttribute("loginError", "     ");
            return mView;
        }
    }

비밀번호 찾기


메일박스를 입력하고 메일박스에 인증코드를 보내서 인증코드를 데이터베이스에 저장하고 입력한 인증코드와 데이터베이스가 존재하는지 재검사하며 MD5는 인코딩할 수 없기 때문에 비밀번호만 리셋할 수 있습니다.
    /**
     *          
     * @return forget.jsp
     */
    @RequestMapping(value = "/forget")
    public String forget(){
        return "/front/forget";
    }

forget.jsp, 비밀번호의 강도를 판단하고 두 번의 비밀번호가 동일한지 판단하며 인증코드를 보내는 js는 다시 붙이지 않습니다
<form action="${pageContext.request.contextPath}/frontLogin/updatePWD" method="post"> 
   <fieldset> 
    <div> 
     <c:choose> 
      <c:when test="${not empty forgetEmail}"> 
       <input id="email" value="${requestScope.forgetEmail}" name="email" type="email" required="" autofocus="" /> 
       <a href="javascript:void" style="float:center" onclick="getEmail()">     a> 
      c:when> 
      <c:otherwise> 
       <input id="email" placeholder="E-mail" name="email" type="email" required="" autofocus="" /> 
       <a href="javascript:void" style="float:center" onclick="getEmail()">     a>
      c:otherwise> 
     c:choose> 
    div> 
    <div > 
     <input placeholder="   " name="code" type="text" required="" /> 
    div> 
    <div > 
     <c:choose> 
      <c:when test="${not empty updatePassword}"> 
       <input value="${requestScope.updatePassword}" id="pwd1" name="password" type="password" required="" onkeyup="checkLength()" /> 
       <span id="spanLen">span> 
      c:when> 
      <c:otherwise> 
       <input placeholder="  " id="pwd1" name="password" type="password" required="" onkeyup="checkLength()" /> 
       <span id="spanLen">span> 
      c:otherwise> 
     c:choose> 
    div> 
    <div > 
     <input placeholder="    " id="pwd2" name="password2" type="password" required="" onblur="checkPSW()" /> 
     <span id="pswInfo" style="color: #c41a15;">span> 
    div> 
    <a href="${pageContext.request.contextPath}/frontLogin/login" style="float:center">a>
    <font size="4" color="red"> ${loginError} font> 
    <button id="btforget" type="submit" >    button> 
   fieldset> 
  form>

인증 코드를 보낸 Controller도 다시 붙이지 않습니다.암호 재설정(암호 업데이트):
    /**
     *          、      
     * @param request
     * @return true:login.jsp false:forget.jsp
     */
    @RequestMapping(value = "/updatePWD", method = RequestMethod.POST)
    public ModelAndView updatePWD(HttpServletRequest request){
        String email = request.getParameter("email");
        String inputCode = request.getParameter("code");
        String password = request.getParameter("password");

        ModelAndView mv = new ModelAndView();
        mv.addObject("forgetEmail", email);
        mv.addObject("updatePassword", password);
        mv.setViewName("/front/forget");

        EmailCode emailCode = emailCodeService.getByEmail(email);
        String existCode = emailCode.getCodeNum();

        if(!inputCode.equals(existCode)){
            request.setAttribute("loginError", "      ");
            return mv;
        }

        Owner owner = frontLoginService.getByEmail(email);
        if(owner == null){
            request.setAttribute("loginError", "     ");
            return mv;
        }

        MD5 md5 = new MD5();
        String md5Password = md5.getMD5(password);

        ownerService.updatePasswordByEmail(md5Password, email);

        mv.setViewName("/front/login");
        return mv;
    }

html 주입 방지


사이트에 input과 같은 입력 상자가 존재하기 때문에 누군가가 html의 문법을 사이트에 삽입할 수 있다. 이런 상황을 방지하기 위해 입력 내용 중의 특수한 기호, 예를 들어 <등을 대응하는 실체 이름으로 바꾸는 것이 필요하다.상기 코드에서 E-Mail은 고정된 형식, 비밀번호가 있고 MD5 암호화가 필요하며 표시할 필요가 없기 때문에 이 기능을 사용하지 않았습니다. 그러나 뒷부분의 기능(예를 들어 게시 등)에서 사용할 것입니다. 왜 SQL 주입을 방지하지 않았습니까?My Batis가 가지고 있으니까.
public class CleanStyle {
    public String cleanStyle(String str){

        // " < "  ->  <
        String s1 = str.replace("&", "&amp");

        // " > "  ->  >
        String s2 = s1.replace(">", ">");

        // " & "  ->  &
        String s3 = s2.replace(", "<");

        // " " "  ->  "
        String s4 = s3.replace("\"", """);

        // " ' "  ->  '
        String s5 = s4.replace("\'", "'");

        return s5;
    }
}

클래스를 인스턴스화하고 컨텐트를 매개 변수로 cleanStyle 메소드를 호출하면 됩니다.

MD5 암호화

public class MD5 {
    public String getMD5(String password){
        String md5Password = null;
        try {
            //          
            MessageDigest digest = MessageDigest.getInstance("md5");
            byte[] result = digest.digest(password.getBytes());
            StringBuffer buffer = new StringBuffer();
            //     byte        0xff;
            for (byte b : result) {
                //    
                int number = b & 0xff;
                String str = Integer.toHexString(number);
                if (str.length() == 1) {
                    buffer.append("0");
                }
                buffer.append(str);
            }
            md5Password = buffer.toString();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        }
        return md5Password;
    }
}

우편물을 보내다


과정을 대략적으로 말하자면: 우선mail을 말해야 한다.jar는 프로젝트에 가져온 다음 설정 파일에 다음 코드를 넣고 마지막으로sendMail 방법을 호출하면 됩니다.

    <bean id="javaMailSender" class="org.springframework.mail.javamail.JavaMailSenderImpl">
        <property name="host" value="smtp.qq.com"/>
        <property name="port" value="465"/>
        <property name="username" value="[email protected]"/>
        
        <property name="password" value="xxx"/>

        <property name="javaMailProperties">
            <props >
                <prop key="mail.smtp.auth">trueprop>
                <prop key="mail.smtp.ssl.enable">trueprop>
                <prop key="mail.smtp.timeout">25000prop>
                <prop key="mail.smtp.socketFactory.class">javax.net.ssl.SSLSocketFactoryprop>
            props>
        property>
    bean>

인증 코드를 보내는 클래스
    @Component
public class SendMail {
    @Autowired
    private JavaMailSender javaMailSender;

    /**
     * @Description:       
     * @param to                 
     * @param subject            
     * @param content            
     */
    public void sendCode(String toEmail, String code) throws Exception {
        SimpleMailMessage message = new SimpleMailMessage();
        message.setFrom("[email protected]");
        message.setTo(toEmail);
        message.setSubject("          ");
        message.setText("      :" + code);
        javaMailSender.send(message);
    }
}

여기까지 이 블로그는 끝났습니다. 많은 부족한 점이 있습니다. 예를 들어 단일 로그인을 하지 않았고 비밀번호의 강도 측정이 너무 간단하며 최적화 코드가 없습니다. 여기서 저는 벽돌을 던져 옥을 끌어올렸습니다.마크다운이 두 칸을 비우는 기능이 없다고 토로하자 많은 작문을 쓴 나에게 정말 괴로웠다. 생생하게 6개의 nbsp로 대체했다.

좋은 웹페이지 즐겨찾기