jsp学习(九.Filter过滤器、通配符和Cookie处理)

提示:最后有一个实列包括所以类容

Filter过滤器

过滤器又可以叫前置处理器,他是在执行某个页面(servlet或网页)之前执行的一个程序,常拿来验证cookie或过滤渗透(一种网页破解方式)

Fitter可以指定在哪个或哪些页面执行:
比如我要在全部页面执行就用/*(*为通配符)
如果只想在servlet-mapping为/abc的页面执行,只需要把filter-mapping改为/abc即可
如果只想在abc.jsp的页面执行,只需要把filter-mapping改为/abc.jsp即可
在这里插入图片描述
写fiter时需要接口implements Filter
并对doFilter进行重写
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException

通配符

上面看到在设置mapping的时候可以使用通配符,这涉及到匹配优先级
分为三部:
首先匹配完全匹配的
再匹配/*通配符
再匹配后缀通配符

举个例子:
我有5个servlet的mapping分别为 /abc.k/abc/* 、/abc/* 、/*.k
我现在在浏览器输入: 项目/abc
首先匹配/abc,有,显示第二个
我现在在浏览器输入: 项目/ab
首先匹配/ab,没有
其次匹配/*,有两个:/*/abc/* ,会选择长的那个,所以显示的第四个
如果没有/*,才会匹配/*.k

Cookie简单介绍

1.服务器脚本发送一系列 cookie 至浏览器。比如名字,年龄,ID 号码等等。
2.浏览器在本地机中存储这些信息,以备不时之需。
3.当下一次浏览器发送任何请求至服务器时,它会同时将这些 cookie 信息发送给服务器,然后服务器使用这些信息来识别用户或者干些其它事情。

其实也没有像一个已经学过的东西:session,我之前以为一个session就是一个用户,这不完全准确,比如我登录某个网站,我又退出了当前登录的账号,登录另外一个账号,一个session就对应了两个用户了,而且如果只用session的话退出账号我们实现自动登录时,只能通过设置session的存活时间来完成。cookie简化了这些操作:
设置cookie的方法:

Cookie cookie = new Cookie("user", user+"-"+password);
cookie.setPath(req.getContextPath());/有效范围为我的这个网页
cookie.setMaxAge(60*60*1);/有效期为一小时
resp.addCookie(cookie);

设置好的cookie会像以下的形式发送:
复制的菜鸟的图,参数对应不上
在这里插入图片描述

实列项目

利用Filter过滤器、通配符和Cookie处理,实现自动登录
登录页面的servlet:

package com.ljq;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.activation.DataSource;
import javax.naming.InitialContext;
import javax.naming.NamingException;
import javax.servlet.RequestDispatcher;
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.mysql.cj.exceptions.DataReadException;
import com.sun.org.apache.bcel.internal.generic.Select;
import com.sun.xml.internal.bind.CycleRecoverable.Context;

import sun.awt.windows.WPrinterJob;

public class loginservlet extends HttpServlet {
	@Override
	public void init() throws ServletException {
		// TODO Auto-generated method stub
		super.init();
	}
	
	@Override
	protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		HttpSession session = req.getSession();
		req.setCharacterEncoding("utf-8");
		resp.setContentType("text/html;charset=utf-8");
		PrintWriter pWriter = resp.getWriter();
		String user = req.getParameter("user");
		String password = req.getParameter("password");
		String string = null;
		if (user == null || password == null || user.length() == 0 || password.length() == 0) {
			session.setAttribute("failmess", ",输入为空");
			string = "loginfail.jsp";
		}
		String dataBase = "updatabase";
		String mysqluser = "root";
		String mysqlpassword = "123";
		String table = "up";
		String ruser[][] = null;
		if (string == null)
		try {
			Connection connection = DriverManager.getConnection("jdbc:mysql://192.168.101.121:3306/"+dataBase+"?"+"userSSL=false&serverTimezone=CST&characterEncoding=utf-8",mysqluser,mysqlpassword);
			Statement sql = connection.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);
			ResultSet rs = (ResultSet)sql.executeQuery("Select * from "+table);
			rs.last();
			int n = rs.getRow();
			rs.beforeFirst();
			ruser = new String[n][2];
			int i = 0;
			while(rs.next()) {
				ruser[i][0] = rs.getString(1);
				ruser[i][1] = rs.getString(2);
				i++;
			}
			sql.close();
			if (ruser == null || ruser.length == 0)
			{
				session.setAttribute("failmess", ",数据库没有数据或读取错误");
				string = "loginfail.jsp";
			}
			if ((i = login(ruser, user, password)) != -1) {
				Userbean Userbean = new Userbean();
				Userbean.setUser(user);
				Userbean.setPassword(password);
				Userbean.setImage(user+".png");
				session.setAttribute("Userbean", Userbean);
				string = "loginsuccess.jsp";
				String autoLogin = req.getParameter("autologin");
				if (autoLogin.equals("1小时自动登录")) {
					Cookie cookie = new Cookie("user", user+"-"+password);
					cookie.setPath(req.getContextPath());
					cookie.setMaxAge(60*60*1);
					resp.addCookie(cookie);
				}
				else{
					Cookie cookie = new Cookie("user", user+"-"+password);
					cookie.setPath(req.getContextPath());
					cookie.setMaxAge(60*5);
					resp.addCookie(cookie);
				}
			}
			else {
				session.setAttribute("failmess", ",密码错误");
				string = "loginfail.jsp";
			}
		} catch (SQLException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
			session.setAttribute("failmess", ",数据库连接失败");
			string = "loginfail.jsp";
		}
		resp.sendRedirect(string);
//		try {
//			Context context = (Context) new InitialContext();
//			Context contextNeeded = (Context)((InitialContext) context).lookup("java:comp/env");
//			DataSource ds = (DataSource)((InitialContext) contextNeeded).lookup("up");
//			System.out.println(ds);
//		} catch (NamingException e) {
//			// TODO Auto-generated catch block
//			e.printStackTrace();
//		}
		
		
	}
	public int login(String mysqlup[][], String user, String password) {
		for (int i = 0; i < mysqlup.length; i++) {
			if (mysqlup[i][0].equals(user) && mysqlup[i][1].equals(password))
			{
				return i;
			}
		}
		return -1;
	}
	@Override
	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
		// TODO Auto-generated method stub
		doPost(req, resp);
	}
}

里面更具用户的要求设置了cookie

Fiter里的代买:

package com.ljq;

import java.io.IOException;
import java.io.PrintWriter;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.RequestDispatcher;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;
import javax.servlet.http.Cookie;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import javax.xml.ws.Dispatch;

import com.sun.xml.internal.ws.client.dispatch.DataSourceDispatch;

public class AutoLoginFilter implements Filter{
	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
			throws IOException, ServletException {
		// TODO Auto-generated method stub
		req.setCharacterEncoding("utf-8");
		HttpServletRequest request2 = (HttpServletRequest)req;
		HttpSession session = request2.getSession();
		Cookie[] cookies = request2.getCookies();
		String userp = null;
		for (int i = 0; cookies != null && i < cookies.length; i++) {
			if ("user".equals(cookies[i].getName())) {
				userp = cookies[i].getValue();
				break;
			}
		}
		Userbean Userbean = (Userbean)session.getAttribute("Userbean");
		if (userp != null && Userbean != null) {
			String[] userpp = userp.split("-");
			String user = userpp[0];
			String password = userpp[1];
			
			if (!user.equals(Userbean.getUser()) || !password.equals(Userbean.getPassword()))
			{
				Userbean.setUser(null);
				Userbean.setPassword(null);
			}
		}
		else if (Userbean!=null){
				Userbean.setUser(null);
				Userbean.setPassword(null);
				Userbean.setImage(null);
		}
		chain.doFilter(request2, resp);
	}
	
	public int login(String mysqlup[][], String user, String password) {
		for (int i = 0; i < mysqlup.length; i++) {
			if (mysqlup[i][0].equals(user) && mysqlup[i][1].equals(password))
			{
				return i;
			}
		}
		return -1;
	}
	
}

退出的servlet:
由于不能删除cookie,我们可以直接把他的有效期设置为0,让他过期

package com.ljq;

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;

public class Logout extends HttpServlet{

	protected void doGet(HttpServletRequest req, HttpServletResponse resp) 
			throws ServletException, IOException {
		
		// 移除session
		req.getSession().removeAttribute("Userbean");
		// 创建cookie
		Cookie cookie = new Cookie("user", "msg");
		cookie.setPath(req.getContextPath());

		// 将cookie置为过期
		cookie.setMaxAge(0);
		resp.addCookie(cookie);
		
		// 导航,重定向
		resp.sendRedirect(req.getContextPath()+"/index.jsp");
	}

	protected void doPost(HttpServletRequest request, HttpServletResponse response) 
			throws ServletException, IOException {
		doGet(request, response);
	}

}

展示:

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

I Am Rex

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值