//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.总结