Servlet----登录(cookie实现三天免登录)
一:
1.Servlet流程总结
(1)浏览器发起请求到服务器(请求)
(2)服务器接收浏览器的请求,进行解析,创建Request对象存储请求数据
(3)服务器调用对应的servlet进行请求处理,并将Request对象作为实参传递给Servlet方法
(4)Servlet调用方法进行请求处理
①设置请求编码
req.setCharacterEncoding("utf-8");
②设置响应编码
resp.setContentType("text/html;charset=utf-8");
③获取请求信息
String xxx = req.getParameter("");
④处理请求信息
⑤响应处理结果
二.数据流转
浏览器----->服务器------>数据库
浏览器<-----服务器<------数据库
三.具体实现
1.包.接口.类
Servlet(浏览器访问服务器数据接收处理并响应)
①CookieServlet 用户访问服务器的servlet
②LoginServlet 处理登录请求
③PageServlet 返回登录页面
④MainServlet 登录成功后返回主界面
Service(服务层)
LoginService接口(定义服务的接口)
impl包
LoginServiceImpl类(实现LoginService接口并实现)
dao (具体实现业务)
LoginDao接口(定义实现方法的接口)
impl包
LoginDaoImpl类(具体实现LoginDao方法)
pojo (定义和使用的一些类)
User类(用于存储用户信息)
2.
(1)用户访问定义的首页 此次项目中将/ck 作为首页
逻辑:
CookieServlet
①用户发送请求,CookieServlet接收后,将请求中的Cookie信息存入Cookie数组中
②如果用户之前正确登录过,在请求信息中会附带由uid信息,通过foreach循环遍历Cookie数组,并获得uid信息
(如果Cookie获取后为null则直接使用请求转发技术转到登录页面)
③检验获取的uid是否为空字符,如果为空则请求转发至登录页面.
通过UID检验用户登录信息是否符合,检验正确则使用重定向至MainServlet,否则请求转发至page
package com.bjsxt.servlet.login; import com.bjsxt.pojo.User; import com.bjsxt.service.LoginService; import com.bjsxt.service.impl.LoginServiceImpl; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * Cookie信息校验 * 判断请求中是否携带正确的Cookie信息 * 如果有则校验Cookie信息是否正确' * 如果校验正确则直接响应主页面给用户 * 如果校验不正确则响应登录页面给用户 * 没有则请求转发给登录页面. * */ @WebServlet(name = "CookieServlet") public class CookieServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置请求编码格式 req.setCharacterEncoding("utf-8"); //设置响应编码格式 resp.setContentType("text/html;charset=utf-8"); //获取请求信息 //获取Cookie信息 Cookie cks[] = req.getCookies(); //处理请求信息 if(cks!=null){ //使用uid反向去查数据库,存在即返回用户主页面,否则返回登录页面 //遍历Cookie信息 String uid = ""; for (Cookie c:cks) { if("uid".equals(c.getName())){ uid = c.getValue(); } } //校验uid是否存在 if("".equals(uid)){ //请求转发 req.getRequestDispatcher("page").forward(req,resp); return; }else{ //校验UID用户信息 //获取业务层对象 LoginService ls = new LoginServiceImpl(); User u = ls.checkUidService(uid); if(u!=null){ //重定向 resp.sendRedirect("main"); return; }else{ //请求转发 req.getRequestDispatcher("page").forward(req,resp); } } }else{ //响应处理结果 //请求转发 req.getRequestDispatcher("page").forward(req,resp); } } }
PageServlet
①将网页响应给浏览器,Html中会保存请求发送路径(到LoginServlet)
package com.bjsxt.servlet.login; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; public class PageServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置响应编码格式 resp.setContentType("text/html;charset=utf-8"); //获取请求信息 //处理请求 //响应处理结果 //获取request作用域数据 String str = (String) req.getAttribute("str"); //也可以使用三目运算代替判断 // str = (String) req.getAttribute("str")==null? "":(String) req.getAttribute("str"); resp.getWriter().write("<html>"); resp.getWriter().write("<head>"); resp.getWriter().write("</head>"); resp.getWriter().write("<body>"); if(str!=null){ resp.getWriter().write("<font color='red' size = '20px'>"+str+"</font>"); } resp.getWriter().write("<form action='login' method = 'get'>"); resp.getWriter().write("用户名:<input type='text' name='uname' value=''/><br/>"); resp.getWriter().write("密码:<input type='password' name='pwd' value=''/><br/>"); resp.getWriter().write("<input type='submit'value='登录'/><br/>"); resp.getWriter().write("</form>"); resp.getWriter().write("</body>"); resp.getWriter().write("</html>"); System.out.println("返回登录页面成功"); } }
LoginServlet
①获取请求中的uname和pwd信息,在数据库中查找是否符合,符合即返回主界面,不符合则请求转发至PageServlet
package com.bjsxt.servlet.login; import com.bjsxt.pojo.User; import com.bjsxt.service.LoginService; import com.bjsxt.service.impl.LoginServiceImpl; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.io.IOException; /** * 处理用户请求的登录页面 * 解决中文乱码问题 * ①.使用String.getBytes()方法 * ②.直接使用公共配置 * get方式:步骤一:req.setCharacterEncoding("utf-8"); * 步骤二:在tomcat的目录下的conf目录中修改server.xml文件; * post方法: * 步骤一:req.setCharacterEncoding("utf-8"); * Servlet流程总结: * 浏览器发起请求到服务器(请求) * 服务器接收浏览器的请求,进行解析,创建request对象存储请求数据 * 服务器调用对应的servlet进行请求处理,并将request对象作为实参传递给servlet的方法 * servlet的方法执行进行请求处理 * //设置请求编码 * //设置响应编码格式 * //获取请求信息 * //处理请求信息 * //创建业务层对象 * //调用业务层对象的方法 * //响应处理结果 * 请求转发学习: * 作用:实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确. * 请求转发使用多个servlet来响应请求,让servlet功能明确. * 解决了一次请求内的不同Servlet的数据(请求数据+其他数据)共享问题 * 使用:req.getRequestDispatcher("servlet别名").forward(req,resp); * 特点: 一次请求,请求转发后直接return 结束即可. * 作用域:基于请求转发,一次请求中的所有Servlet共享 * 注意: 使用request对象进行数据流转,数据只在一次请求内有效. * 特点: * 一次请求. * 服务器创建 * 每次请求都会创建 * 生命周期一次请求 * 重定向 * 解决了表单重复提交的问题,以及但钱servlet无法处理的请求的问题 * 使用: * resp.sendRedirect(String uri); * 示例: * resp.sendRedirect("/login/main"); * 使用: * response.sendRedirect("路径"); * 本地路径为:uri * 网络路径为:定向资源的URL信息. * 特点: * 两次请求 * 浏览器地址栏信息改变 * 两个request对象 * 时机: * 如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向 * 如果请求被Servlet接收后,无法处理,建议使用重定向定位到可以处理的资源. * servlet的使用流程: * 设置请求编码格式 * 设置响应编码格式 * 获取请求信息 * 处理请求信息 * 响应处理结果 *数据流转流程 * 浏览器----->服务器------>数据库 * 浏览器<-----服务器<------数据库 * */ public class LoginServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置请求编码格式 req.setCharacterEncoding("utf-8"); //设置响应编码格式 resp.setContentType("text/html;charset=utf-8"); //获取请求信息 String uname = req.getParameter("uname"); // uname = new String(uname.getBytes("iso8859-1"),"utf-8"); String pwd = req.getParameter("pwd"); System.out.println(uname+":"+pwd); //处理请求信息 //获取业务层对象 LoginService ls = new LoginServiceImpl(); User u = ls.checkLoginService(uname,pwd); //响应处理结果 if(u!=null){ //创建Cookie信息实现三天免登录. Cookie c = new Cookie("uid",u.getUid()+""); //设置Cookie的有效期 c.setMaxAge(3*24*3600); //设置路径 c.setPath("ck"); //添加Cookie信息 resp.addCookie(c); //请求转发 //req.getRequestDispatcher("main").forward(req,resp); //重定向 resp.sendRedirect("/jdbc_war_exploded/main"); return; }else{ //使用request对象是实现不同servlet的数据流转, req.setAttribute("str","用户名或密码错误"); //使用请求转发将当前的请求转发给其他servlet req.getRequestDispatcher("page").forward(req,resp); return; } } }

浙公网安备 33010602011771号