05-请求转发和重定向Login
Posted wcymiracle
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了05-请求转发和重定向Login相关的知识,希望对你有一定的参考价值。
目录结构
servlet:
CookieServlet:
package com.bjsxt.servlet; import java.io.IOException; 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 com.bjsxt.pojo.User; import com.bjsxt.service.LoginService; import com.bjsxt.service.impl.LoginServiceImpl; /** * Cookie信息校验 * 判断请求中是否携带正确的Cookie信息 * 如果有则校验Cookie信息是否正确 * 如果校验正确则直接响应主页面给用户 * 如果校验不正确则响应登录页面给用户 * 没有则请求转发给登录页面 * @author MyPC */ 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){ //遍历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){ //将用户数据存储到session对象中 req.getSession().setAttribute("user",u); //网页计数器自增 int nums=(int) this.getServletContext().getAttribute("nums"); nums+=1; this.getServletContext().setAttribute("nums", nums); //重定向 resp.sendRedirect("/login/main"); return; }else{ //请求转发 req.getRequestDispatcher("page").forward(req, resp); return; } } }else{ //响应处理结果 //请求转发 req.getRequestDispatcher("page").forward(req, resp); return; } } }
LoginServlet:
package com.bjsxt.servlet; import java.io.IOException; import javax.servlet.ServletContext; 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 javax.servlet.http.HttpSession; import com.bjsxt.pojo.User; import com.bjsxt.service.LoginService; import com.bjsxt.service.impl.LoginServiceImpl; /** * 请求中文乱码解决: * 1、使用String进行数据重新编码 * uname=new String(uname.getBytes("iso8859-1"),"utf-8"); * 2、使用公共配置 * get方式: * 步骤一:req.setCharacterEncoding("utf-8"); * 步骤二: * 在tomcat的目录下的conf目录中修改server.xml文件:在Connector标签中增加属性 useBodyEncodingForURI="true" * post方式: * req.setCharacterEncoding("utf-8"); * Servlet流程总结: * 浏览器发起请求到服务器(请求) * 服务器接受浏览器的请求,进行解析,创建request对象存储请求数据 * 服务器调用对应的servlet进行请求处理,并将request对象作为实参传递给servlet的方法 * servlet的方法执行进行请求处理 * //设置请求编码格式 * //设置响应编码格式 * //获取请求信息 * //处理请求信息 * //创建业务层对象 * //调用业务层对象的方法 * //响应处理结果 *请求转发学习: * 作用:实现多个servlet联动操作处理请求,这样避免代码冗余,让servlet的职责更加明确。 * 使用: * req.getRequestDispatcher("要转发的地址").forward(req, resp); * 地址:相对路径,直接书写servlet的别名即可。 * 特点: * 一次请求,浏览器地址栏信息不改变。 * 注意: * 请求转发后直接return结束即可。 *reuqet作用域: * 解决了一次请求内的servlet的数据共享问题 *重定向: * 解决了表单重复提交的问题,以及当前servlet无法处理的请求的问题。 * 使用: * resp.sendRedirect(String uri); * 示例: * resp.sendRedirect("/login/main"); * 特点: * 两次请求,两个request对象。 * 浏览器地址栏信息改变 * 时机: * 如果请求中有表单数据,而数据又比较重要,不能重复提交,建议使用重定向。 * 如果请求被Servlet接收后,无法进行处理,建议使用重定向定位到可以处理的资源。 *解决主页面用户名显示为null的问题: * 原因: * 因为在用户登录成功后使用重定向显示主页面,两次请求,而用户的信息 * 在第一次请求中,第二次请求中没有用户数据,所以显示为null * 解决: * 使用session *使用ServletContext对象完成网页计数器 * 在用户登录校验中创建计数器并自增,然后存储到ServletContext对象中 * 在主页面里取出计数器数据显示给用户即可。 * * @author MyPC */ 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进行数据重新编码 String pwd=req.getParameter("pwd"); System.out.println(uname+":"+pwd); //处理请求信息 //获取业务层对象 LoginService ls=new LoginServiceImpl(); User u=ls.checkLoginService(uname, pwd); System.out.println(u); //响应处理结果 if(u!=null){ //创建Cookie信息实现三天免登录。 Cookie c=new Cookie("uid", u.getUid()+""); //设置Cookie的有效期 c.setMaxAge(3*24*3600); c.setPath("/login/ck"); //添加Cookie信息 resp.addCookie(c); //请求转发 //req.getRequestDispatcher("main").forward(req, resp); //将数据存储到session对象中 HttpSession hs=req.getSession(); hs.setAttribute("user",u); //创建网页计数器 //获取计数数据 ServletContext sc=this.getServletContext(); if(sc.getAttribute("nums")!=null){ int nums=Integer.parseInt((String) sc.getAttribute("nums")); //计数器自增 nums+=1; //再次存储到ServletContext对象中 sc.setAttribute("nums", nums); }else{ sc.setAttribute("nums", 1); } //重定向 resp.sendRedirect("/login/main"); return; }else{ //使用request对象实现不同Servlet的数据流转 req.setAttribute("str", "用户名或密码错误"); //使用请求转发 req.getRequestDispatcher("page").forward(req, resp); return; } } }
MainServlet:
package com.bjsxt.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import com.bjsxt.pojo.User; public class MainServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置请求编码格式 req.setCharacterEncoding("utf-8"); //设置响应编码格式 resp.setContentType("text/html;charset=utf-8"); //获取请求信息 //获取session中的数据 User u=(User) req.getSession().getAttribute("user"); //获取网页浏览次数 int nums=(int) this.getServletContext().getAttribute("nums"); //处理请求信息 //响应处理结果 resp.getWriter().write("<html>"); resp.getWriter().write("<head>"); resp.getWriter().write("</head>"); resp.getWriter().write("<body>"); resp.getWriter().write("<h3>欢迎"+u.getUname()+"访问尚学堂管理系统</h3>"); resp.getWriter().write("当前网页浏览次数为:"+nums); resp.getWriter().write("<hr>"); resp.getWriter().write("<form action=‘show‘ method=‘get‘>"); resp.getWriter().write("<input type=‘submit‘ value=‘查看个人信息‘>"); resp.getWriter().write("</form>"); resp.getWriter().write("</body>"); resp.getWriter().write("</html>"); } }
NumServlet:
package com.bjsxt.servlet; import java.io.BufferedReader; import java.io.BufferedWriter; import java.io.FileReader; import java.io.FileWriter; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; public class NumServlet extends HttpServlet { //覆写init初始化方法,将数据读取到ServletContext对象中 @Override public void init() throws ServletException { //获取文件中的计数器数据 //获取文件路径 String path=this.getServletContext().getRealPath("/nums/nums.txt"); //声明流对象 FileReader fr=null; BufferedReader br=null; try { fr=new FileReader(path); br=new BufferedReader(fr); String nums=br.readLine(); System.out.println(nums); this.getServletContext().setAttribute("nums", nums); } catch (Exception e) { e.printStackTrace(); }finally{ try { fr.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { br.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } //覆写销毁方法,存储计数器到文件中 @Override public void destroy() { //获取网页计数器 int nums=(int) this.getServletContext().getAttribute("nums"); //获取文件路径 String path=this.getServletContext().getRealPath("/nums/nums.txt"); //声明流对象 BufferedWriter bw=null; FileWriter fw=null; try { fw=new FileWriter(path); bw=new BufferedWriter(fw); bw.write(nums+""); bw.flush(); } catch (Exception e) { e.printStackTrace(); }finally{ try { fw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { bw.close(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } }
PageServlet:
package com.bjsxt.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; 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")==null?"":(String) req.getAttribute("str"); resp.getWriter().write("<html>"); resp.getWriter().write("<head>"); resp.getWriter().write("</head>"); resp.getWriter().write("<body>"); 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>"); } }
ShowServlet:
package com.bjsxt.servlet; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import com.bjsxt.pojo.User; public class ShowServlet extends HttpServlet { @Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { //设置请求编码格式 req.setCharacterEncoding("utf-8"); //设置响应编码格式 resp.setContentType("text/html;charset=utf-8"); //获取请求信息 HttpSession hs=req.getSession(); if(hs.getAttribute("user")==null){ //重定向 resp.sendRedirect("/login/ck"); return; } User u=(User) hs.getAttribute("user"); //处理请求信息 //响应处理结果 resp.getWriter().write("<html>"); resp.getWriter().write("<head>"); resp.getWriter().write("</head>"); resp.getWriter().write("<body>"); resp.getWriter().write("<table border=‘1px‘>"); resp.getWriter().write("<tr>"); resp.getWriter().write("<td>用户名</td>"); resp.getWriter().write("<td>"+u.getUname()+"</td>"); resp.getWriter().write("</tr>"); resp.getWriter().write("<tr>"); resp.getWriter().write("<td>密码</td>"); resp.getWriter().write("<td>"+u.getPwd()+"</td>"); resp.getWriter().write("</tr>"); resp.getWriter().write("</table>"); resp.getWriter().write("</body>"); resp.getWriter().write("</html>"); } }
service
LoginServiceImpl:
package com.bjsxt.service.impl; import com.bjsxt.dao.LoginDao; import com.bjsxt.dao.impl.LoginDaoImpl; import com.bjsxt.pojo.User; import com.bjsxt.service.LoginService; public class LoginServiceImpl implements LoginService{ //创建Dao层过度向 LoginDao ld=new LoginDaoImpl(); //校验用户登录信息 @Override public User checkLoginService(String uname, String pwd) { return ld.checkLoginDao(uname, pwd); } //校验Cookie信息 @Override public User checkUidService(String uid) { return ld.checkUidDao(uid); } }
LoginService:
package com.bjsxt.service; import com.bjsxt.pojo.User; public interface LoginService { //校验用户登录信息 User checkLoginService(String uname,String pwd); //校验用户Cookie信息 User checkUidService(String uid); }
pojo:
User:
package com.bjsxt.pojo; public class User { private int uid; private String uname; private String pwd; public int getUid() { return uid; } public void setUid(int uid) { this.uid = uid; } public String getUname() { return uname; } public void setUname(String uname) { this.uname = uname; } public String getPwd() { return pwd; } public void setPwd(String pwd) { this.pwd = pwd; } @Override public String toString() { return "User [uid=" + uid + ", uname=" + uname + ", pwd=" + pwd + "]"; } @Override public int hashCode() { final int prime = 31; int result = 1; result = prime * result + ((pwd == null) ? 0 : pwd.hashCode()); result = prime * result + uid; result = prime * result + ((uname == null) ? 0 : uname.hashCode()); return result; } @Override public boolean equals(Object obj) { if (this == obj) return true; if (obj == null) return false; if (getClass() != obj.getClass()) return false; User other = (User) obj; if (pwd == null) { if (other.pwd != null) return false; } else if (!pwd.equals(other.pwd)) return false; if (uid != other.uid) return false; if (uname == null) { if (other.uname != null) return false; } else if (!uname.equals(other.uname)) return false; return true; } public User() { super(); // TODO Auto-generated constructor stub } public User(int uid, String uname, String pwd) { super(); this.uid = uid; this.uname = uname; this.pwd = pwd; } }
dao:
LoginDao:
package com.bjsxt.dao; import com.bjsxt.pojo.User; public interface LoginDao { //根据用户名和密码获取用户信息 User checkLoginDao(String uname,String pwd); //根据uid获取用户信息 User checkUidDao(String uid); }
LoginDaoImpl:
package com.bjsxt.dao.impl; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; import com.bjsxt.dao.LoginDao; import com.bjsxt.pojo.User; public class LoginDaoImpl implements LoginDao{ @Override public User checkLoginDao(String uname, String pwd) { //声明Jdbc对象 Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; //声明数据存储对象 User u=null; try { //加载驱动 Class.forName("com.mysql.jdbc.Driver"); //获取连接对象 conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/407","root","1234"); //创建Sql命令 String sql="select * from t_user where uname=? and pwd=?"; //创建Sql命令对象 ps=conn.prepareStatement(sql); //给占位符赋值 ps.setString(1, uname); ps.setString(2, pwd); //执行 rs=ps.executeQuery(); //遍历执行结果 while(rs.next()){ u=new User(); u.setUid(rs.getInt("uid")); u.setUname(rs.getString("uname")); u.setPwd(rs.getString("pwd")); } //关闭资源 } catch (Exception e) { e.printStackTrace(); }finally{ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //返回 return u; } //根据UID获取用户信息 @Override public User checkUidDao(String uid) { //声明Jdbc对象 Connection conn=null; PreparedStatement ps=null; ResultSet rs=null; //声明数据存储对象 User u=null; try { //加载驱动 Class.forName("com.mysql.jdbc.Driver"); //获取连接对象 conn=DriverManager.getConnection("jdbc:mysql://localhost:3306/407","root","1234"); //创建Sql命令 String sql="select * from t_user where uid=?"; //创建Sql命令对象 ps=conn.prepareStatement(sql); //给占位符赋值 ps.setString(1, uid); //执行 rs=ps.executeQuery(); //遍历执行结果 while(rs.next()){ u=new User(); u.setUid(rs.getInt("uid")); u.setUname(rs.getString("uname")); u.setPwd(rs.getString("pwd")); } //关闭资源 } catch (Exception e) { e.printStackTrace(); }finally{ try { rs.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { ps.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } try { conn.close(); } catch (SQLException e) { // TODO Auto-generated catch block e.printStackTrace(); } } //返回 return u; } }
以上是关于05-请求转发和重定向Login的主要内容,如果未能解决你的问题,请参考以下文章