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("&", "&");
// " > " -> >
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로 대체했다.
이 내용에 흥미가 있습니까?
현재 기사가 여러분의 문제를 해결하지 못하는 경우 AI 엔진은 머신러닝 분석(스마트 모델이 방금 만들어져 부정확한 경우가 있을 수 있음)을 통해 가장 유사한 기사를 추천합니다:
JavaWeb 파일 다운로드 기능 인스턴스 코드업무 중에 만난 파일을 다운로드하는 기능은 스스로 추출합니다. 코드가 간단합니다. 여러분에게 도움이 되었으면 합니다. 자, 말이 많지 않습니다. 코드를 올리십시오! 이상은 본고의 JavaWeb 파일을 다운로드한 코드...
텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
CC BY-SA 2.5, CC BY-SA 3.0 및 CC BY-SA 4.0에 따라 라이센스가 부여됩니다.