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的主要内容,如果未能解决你的问题,请参考以下文章

请求转发和重定向的区别

请求转发和重定向的区别

response请求转发和重定向,cookie

SpringMVC框架如何实现请求转发和重定向呢?

java中转发和重定向的区别

Servlet - 请求转发和重定向