• 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;
    	}
    		
    }
    

      

      

  • 相关阅读:
    设计模式 --单例模式
    Neor Profile SQL 中文汉化
    office online server 安装部署整合到到C#项目
    C# 线程池
    WinForm版 屏幕截图
    golang-nsq高性能消息队列
    【Go Time】Go语言里的条件语句else、switch
    【Go Time】Go语言常量定义关键字const
    【Go Time】Go定义变量
    【Go Time】Go语言里的空接口
  • 原文地址:https://www.cnblogs.com/wcyMiracle/p/12411931.html
Copyright © 2020-2023  润新知