Javaweb之servlet(二)

 
 
 
 
//1.Cookie学习
@WebServlet({ "/CookieServlet", "/cookie" })
public class CookieServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    public CookieServlet() {
        super();
        // TODO Auto-generated constructor stub
    }
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

		//cookie本意小甜饼
		//在浏览器中我们希望保存一些用户信息。cookie就是为此而设计
		//cookie因为保存在浏览器端,所以可能安全性较差。
		//所以往往保存时进行一些加密
		//cookie保存东西是键值对
		//有点像map,但它不是在内存中。
		//问题:
		//既然它在浏览器端,我们如何能够在服务器端操作它呢?
		//我们要获取cookie应该通过request
		//我们要设置cookie应该通过response
		response.setContentType("text/html;charset=utf-8");
		Cookie[] cookies = request.getCookies();
		if(cookies!=null){
			for (int i = 0; i < cookies.length; i++) {
				Cookie cookie = cookies[i];
				String name = cookie.getName();
				String value = cookie.getValue();
				System.out.println(name+":"+value);
				if("lastLoginTime".equals(name)){
					long t = Long.parseLong(value);
					String date =new SimpleDateFormat("yyyy-mm-dd HH:mm:ss").format(new Date(t)).toString();
					response.getWriter().println("上次登录时间:"+date);
				}
			}
		}
		//设置cookie
		Cookie cookie = new Cookie("lastLoginTime", System.currentTimeMillis()+"");
		//单位是秒
		//设置cookie的生存时间
		//参数为0时,代表销毁cookie。
		//参数为-1时,代表在浏览器关闭时销毁。
		cookie.setMaxAge(60*60);
		//设置cookie的目录
		//cookie的保存时基于网站地址的
		cookie.setPath(request.getContextPath());
		response.addCookie(cookie);
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
}
//2.登录
@WebServlet({ "/LoginServlet", "/login" })
public class LoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
    public LoginServlet() {
    }
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		String username = "";
		String checked= "";
		//获取所有的Cookie
		Cookie[] cookies = request.getCookies();
		if(cookies!=null){
			for (int i = 0; i < cookies.length; i++) {
				if("username".equals(cookies[i].getName())){
					username = cookies[i].getValue();
					checked = "checked='checked'";
				}
			}
		}
		PrintWriter out = response.getWriter();
		out.println("<html>");
		out.println("<head>");
		out.println("<body>");
		out.println("<form action='/day12_response/dologin' method = 'post'>");
		out.println("用户名: <input type='text' name='username' value='"+username+"'><br>");
		out.println("密码 : <input type ='password' name='password'  ><br>");
		out.println("记住用户名:<input type='checkbox' name='rem' "+checked+"/><br>");
		out.println("<input type = 'submit' value = '登录'> ");
		out.println("</form>");
		out.println("</body>"+"</html>");
		out.close();
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
//登录操作
@WebServlet({ "/DoLoginServlet", "/dologin" })
public class DoLoginServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;
       
    public DoLoginServlet() {
    }
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		response.setContentType("text/html;charset=utf-8");
		request.setCharacterEncoding("utf-8");
		String username=request.getParameter("username");
		String password=request.getParameter("password");
		String rem=request.getParameter("rem");
		//实例一个Cookie
		Cookie cookie =new Cookie("username", username);
		cookie.setPath(request.getContextPath());
		PrintWriter out = response.getWriter();
		out.println("<html>"+"<head></head>"+"<body>");
		if("zhangsan".equals(username)&&"123456".equals(password)){
			//
			if(rem!=null){
				//保存
				cookie.setMaxAge(60*60);
			}else{
				//不勾选记住用户名
				cookie.setMaxAge(0);
			}
			response.addCookie(cookie);
			out.println("<h1>登录成功</h1>");
		}else{
			out.println("<h1>用户名密码错误,3秒后自动跳转到登录页</h1>");
			response.setHeader("refresh", "3;url='"+request.getContextPath()+"/login'");
		}
		out.println("</body>"+"</html >");
		out.close();
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}

}
在WebContent目录下放置压缩包,通过请求web程序会自动下载,但是图片不行,且对于安全性来说,将资源文件放入src目录下,实际上访问路径在/WEB-INF/classes/..,通过读写即可对文件进行操作
@WebServlet("/demo2")
public class ResponseDemo2 extends HttpServlet {
	private static final long serialVersionUID = 1L;
      
    public ResponseDemo2() {
        superO Auto-generated constructor stub
    }
	@SuppressWarnings("unused")
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		//1、文件路径在哪?
		//src?而是WEB-INF/classes/zuozhu.jpg
		//获取servlet上下文对象
		ServletContext context=this.getServletContext();
		//获取目录位置
		String path=context.getRealPath("WEB-INF/classes/zuozhu.jpg");
		File file=new File(path);
		FileInputStream fis=new FileInputStream(path);
		if(fis==null) {
			response.getWriter().print("文件下载错误。");
			return;
		}
		//客户端下载,我们的策略是什么?
		//可能资源很大
		//读一点,写一点。
		ServletOutputStream out=response.getOutputStream();
		//让客户端知道下载的文件的名字
		String fileName=path.substring(path.lastIndexOf("\\")+1);
		//防止文件名有中文
		String name=URLEncoder.encode(fileName,"utf-8");
		//设置用户下载的属性
		response.setHeader("content-disposition", "attachment;filename="+name);
		//告诉浏览器下载的资源是图片
		response.setHeader("content-type", "image/jpeg");
		//告诉浏览器文件大小
		response.setHeader("content-length", file.length()+"");
		//读一点儿写一点儿
		int len=0;
		byte[] arr=new byte[1024];
		for (;(len=fis.read(arr))!=-1;) {
			out.write(arr, 0, len);
		}
		fis.close();
		out.close();
	}
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doGet(request, response);
	}

}
//二代验证码
@WebServlet({ "/ResponseDemo3", "/demo3" })
public class ResponseDemo3 extends HttpServlet {
	private static final long serialVersionUID = 1L;
    public ResponseDemo3() {
    }

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		verifyCode(4,response);
		//宽度,高度,位数,噪点数量.使用工具类方便
		//ValidateCode code = new ValidateCode(120, 25, 4, 8);
		//code.write(response.getOutputStream());
		//String name = code.getCode();
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		doGet(request, response);
	}
	private static void verifyCode(int num, HttpServletResponse response) throws IOException{
		//定义宽高
		int width= 100;
		int height = 30;
		//创建一个图片,宽高指定,最后一个参数是像素点的格式
		//像素点的格式:int类型,顺次是RGB。
		//一个int类型四个字节,第一个字节代表透明度,剩下三个字节顺次是rgb
		//rgb当中每一个都是0~255之间的数字。和html的表达方式一样
		BufferedImage image = new BufferedImage(width, height, BufferedImage.TYPE_INT_RGB);
		//拿到了图片的画布对象
		Graphics graphics = image.getGraphics();
		//设置一个颜色
		graphics.setColor(Color.GRAY);
		//画一个灰色的背景,
		graphics.fillRect(0, 0, width, height);
		//画一个边框
		Color color = new Color(255, 0, 0);
		graphics.setColor(color);
		graphics.setFont(new Font("宋体",Font.BOLD,10));
		//绘制数字
		Random random = new Random();
		int p =10;
		for (int i = 0; i < num; i++) {
			graphics.setColor(Color.red);
			graphics.drawString(random.nextInt(10)+"", p, 15);
			p +=20;
		}
		//噪点  干扰你判断的图形
		for (int i = 0; i < 3; i++) {
			graphics.setColor(Color.orange);
			graphics.drawLine(random.nextInt(width), random.nextInt(height), random.nextInt(width), random.nextInt(height));
		}
		ImageIO.write(image, "jpg", response.getOutputStream());
	}
}
//过滤器编写
public class MyFilter implements Filter{
	@Override
	public void init(FilterConfig filterConfig) throws ServletException {
	}
	@Override
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain)
			throws IOException, ServletException {
		request.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		System.out.println("过滤器执行了");
		Cookie[] cookies =((HttpServletRequest) request).getCookies();
		//获取当前cookie的用户名,在数据库中查看是否存在该用户
		String username = null;
		for (int i = 0; i < cookies.length; i++) {
			if("username".equals(cookies[i].getName())){
				username = cookies[i].getValue();
			}
		}
		boolean bool = true;
		if(bool){
			chain.doFilter(request, response);
		}else{
			request.getRequestDispatcher("error.jsp").forward(request, response);;
		}
	}
	@Override
	public void destroy() {
	}

}
//字符编码格式过滤器
@WebFilter("/*")
public class EncodingFilter implements Filter {

    public EncodingFilter() {
    }
	public void destroy() {
	}
	public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException {
		request.setCharacterEncoding("utf-8");
		response.setCharacterEncoding("utf-8");
		response.setContentType("text/html;charset=utf-8");
		chain.doFilter(request, response);
	}
	public void init(FilterConfig fConfig) throws ServletException {
	}

}
监听器:监听器可以监听三种对象,分别是request、session、context
request:请求
session:会话
context:上下文
Spring
//xml中配置监听器对象
<listener>
		<listener-class>com.cdu.dj.lister.ContextListener</listener-class>
	</listener>
	<listener>
		<listener-class>com.cdu.dj.lister.RequestListener</listener-class>
	</listener>
	<listener>
		<listener-class>com.cdu.dj.lister.SessionListener</listener-class>
	</listener>
1.请求转发和重定向区别


2.Cookie是使用原理


3.总结


猜你喜欢

转载自blog.csdn.net/qq_41813207/article/details/80273124