注册登录整理
把day37中的登录和注册的Servlet统一合并到StudentServlet中
使用action来区分登录和注册
public class StudentServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
doGet(request,response);
}
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("utf-8");
response.setContentType("text/html;charset=utf-8");
String action = request.getParameter("action");
switch (action){
case "login":
login(request,response);
break;
case "register":
register(request,response);
break;
}
}
private void register(HttpServletRequest request, HttpServletResponse response) throws IOException {
//2.获取表单数据
String username = request.getParameter("username");
String password = request.getParameter("password");
String sex = request.getParameter("sex");
String[] hobby = request.getParameterValues("hobby");
String addrs = request.getParameter("addrs");
//3.进行数据判断,判断用户名是否存在
List<Student> list = DBCenter.list;
for (Student stu: list) {
if(stu.getUsername().equals(username)){
response.getWriter().write("用户名已存在,3秒后回到注册页面,或点击<a href='register.html'>注册页面<a/>");
//设置响应头,使页面3秒后跳转到指定路径
response.setHeader("refresh","3;url=register.html");
return;
}
}
//4.创建实体对象,并且存进数据库
Student student = new Student(username, password, sex, hobby, addrs);
list.add(student);
response.getWriter().write("注册成功,3秒后跳转到登录页面,或点击<a href='login.jsp'>登录页面</a>");
response.setHeader("refresh","3;url=login.jsp");
}
private void login(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//2.获取表单数据
String username = request.getParameter("username");
String password = request.getParameter("password");
//验证码判断
//前端输入的验证码
String code = request.getParameter("code");
//存放在session中--可行
String code1 = (String)request.getSession().getAttribute("code");
if(!code1.equals(code)){
request.setAttribute("msg","验证码错误");
request.getRequestDispatcher("login.jsp").forward(request,response);
return;
}
//3.判断用户名和密码是否正确
List<Student> list = DBCenter.list;
for (Student stu:list){
if(stu.getUsername().equals(username) && stu.getPassword().equals(password)){
//登录成功
response.getWriter().write("登录成功,3秒后跳转到首页;或者点击<a href='index.html'>首页</a>");
response.setHeader("refresh","3;url=index.html");
return;
}
}
//1.request(把数据存放在请求中)+转发--可行
request.setAttribute("msg","用户名或密码错误");
request.getRequestDispatcher("login.jsp").forward(request,response);
}
}
- 前端使用不同的提交方式会有所不同
- get请求方式提交会覆盖Servlet?后面的数据,必须要把action的属性值放在表单中,隐藏起来
<form action="StudentServlet?">
<input type="hidden" name="action" value="login" />
用户名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
<img src="CheckServlet" alt="验证码出错"><input type="text" name="code"/><br/>
<input type="submit" value="登录"/>
</form>
- post方式直接写在Servlet?后面就可以
<form action="StudentServlet?action=register" method="post">
用户名:<input type="text" name="username"/><br/>
密码:<input type="text" name="password"/><br/>
性别:<input type="radio" name="sex" value="man"/>男
<input type="radio" name="sex" value="women"/>女<br/>
爱好<input type="checkbox" name="hobby" value="java"/>敲代码
<input type="checkbox" name="hobby" value="sleep"/>睡觉
<input type="checkbox" name="hobby" value="SeeMovie"/>看电影
<br/>
地址:<select name="addrs">
<option value="guandong">广东</option>
<option value="guanxi">广西</option>
<option value="jiangxi">江西</option>
</select><br/>
<input type="submit" value="注册"/>
</form>
cookie设置免登陆功能
登录页面提供免登录按钮
免登录:<input type="checkbox" name="remember">
后台根据前端是否勾选免登录来判断是否需要保存cookie,
//3.判断用户名和密码是否正确
for (Student stu:list){
if(stu.getUsername().equals(username) && stu.getPassword().equals(password)){
//用户登录成功后,判断是否有勾选免登录,cookie设置
String remember = request.getParameter("remember");
if(remember != null){
//把账号信息设置到cookie中,第一个参数是key,第二个参数是设置value的编码,防止存储中文出错
Cookie cookie = new Cookie("username",
URLEncoder.encode(username,"utf-8"));
//设置cookie的有效时间--单位是秒
cookie.setMaxAge(60*60);
response.addCookie(cookie);
}
//把登录信息(用户名)存储到session中当做用户登录凭证
request.getSession().setAttribute("username",username);
response.sendRedirect("index.html");
return;
}
}
登录页面加载页面之前先获取cookie对象数组,判断是否存在登录的对象,存在则直接跳转到首页,记得判断cookies != null
,如果不判断直接遍历可能会出现空指针异常
//获取cookie对象数组
Cookie[] cookies = request.getCookies();
if(cookies != null){
for (Cookie cookie :cookies){
if("username".equals(cookie.getName())){
response.sendRedirect("index.html");
break;
}
}
}
基本信息修改
要修改信息要先把后台的信息回显到前端
先到服务器获取数据–使用登录凭证(就是上面登录时设置到session中的username
)获取对应对象的数据
响应回前端,并且展示出来
private void toModifyInit(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
//从session中获取登录凭证
String username = (String)request.getSession().getAttribute("username");
Student student = null;
for (Student stu:list) {
if (stu.getUsername().equals(username)){
student = stu;
}
}
if(student != null){
//把Hobby数组对象处理成字符串形式
student.setStrHobby(Arrays.toString(student.getHobby()));
//把对象存储到请求中
request.setAttribute("student",student);
//转发
request.getRequestDispatcher("studentInfo.jsp").forward(request,response);
}
}
先在服务器中把Hobby数组转化成strHobby字符串
页面显示:
<%@ page import="com.qf.entity.Student" %><%--
Created by IntelliJ IDEA.
User: Administrator
Date: 2019/2/20 0020
Time: 上午 11:17
To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
//从请求中获取student对象
Student stu = (Student)request.getAttribute("student");
%>
<form action="StudentServlet?action=modify" method="post">
用户名:<%= stu.getUsername()%><br/>
性别:<input type="radio" name="sex" value="man" <%= stu.getSex().equals("man")?"checked='checked'":""%>/>男
<input type="radio" name="sex" value="women" <%= stu.getSex().equals("women")?"checked='checked'":""%>/>女<br/>
爱好<input type="checkbox" name="hobby" value="java" <%=stu.getStrHobby().contains("java")?"checked='checked'":""%> />敲代码
<input type="checkbox" name="hobby" value="sleep" <%=stu.getStrHobby().contains("sleep")?"checked='checked'":""%> />睡觉
<input type="checkbox" name="hobby" value="SeeMovie" <%=stu.getStrHobby().contains("SeeMovie")?"checked='checked'":""%> />看电影
<br/>
地址:<select name="addrs">
<option value="guandong" <%= stu.getAddrs().equals("guandong")?"selected='selected'":""%>>广东</option>
<option value="guanxi" <%= stu.getAddrs().equals("guanxi")?"selected='selected'":""%> >广西</option>
<option value="jiangxi" <%= stu.getAddrs().equals("jiangxi")?"selected='selected'":""%> >江西</option>
</select><br/>
<input type="submit" value="修改"/>
</form>
</body>
</html>
修改和密码重置
修改需要从session中获取username
private void toModify(HttpServletRequest request, HttpServletResponse response) throws IOException {
//1.获取表单信息
// String username = request.getParameter("username");
String username = (String)request.getSession().getAttribute("username");
String sex = request.getParameter("sex");
String[] hobbies = request.getParameterValues("hobby");
String addrs = request.getParameter("addrs");
//2.修改对应的对象信息
for (Student stu: list) {
//找到对应的对象--通过useranme进行判断
if(stu.getUsername().equals(username)){
stu.setSex(sex);
stu.setAddrs(addrs);
stu.setHobby(hobbies);
break;
}
}
response.sendRedirect("index.html");
}
密码重置完后需要清除登录状态,跳转到登录页面
5.注销
清除cookie中的username
清除session中的username
跳转到login.jsp