JavaWeb---Filter 访问权限控制

要求:
	没登录过  则不可访问index.jsp主页,已登录的则可以。

分析:
	用cookie存储用户提交的信息,
	在过滤器中找cookie中是否有正确的对应值,
	本来是登录页请求 或 信息匹配——放行;
	反之 跳转登录页。

1.创建首页:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>
这是登录后才可访问的首页
</body>
</html>

2.创建login.jsp登录页:

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
</head>
<body>

<form action="loginServlet">//把登录页 的用户名、密码 提交到 servlet
	用户名<input type="text" name="username"/>
	密码<input type="password" name="pwd"/>
	<input type="submit" value="提交"/>
</form>

</body>
</html>

3.创建servlet:

/**
 * 先走filter,
 * 然后走servlet,
 * 然后回到filter,
 * 一个filter可以用chain.doFilter()分成前后两部分。
 * 
 * 巴特!已经在filter动了手脚 会放行login.jsp 
 * 所以可以顺利来到这里存储cookie哟
 *
 */
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
	protected void doPost(HttpServletRequest hreq, HttpServletResponse hresp) throws ServletException, IOException {
		System.out.println("进入loginServlet开始存cookie到客户机");
		//把用户名、密码存入cookie   便于Filter获取
		String username = hreq.getParameter("username");
		String pwd = hreq.getParameter("pwd");
		//做成1个饼干
		Cookie cookie = new Cookie("username", username);
		Cookie cookie2 = new Cookie("pwd",pwd);
		
		hresp.addCookie(cookie);
		hresp.addCookie(cookie2);
		System.out.println("饼干已存入到hresp完成");
		
		System.out.println("跳转首页 前 开始自动启动过滤器判断...");
		hresp.sendRedirect("index.jsp");
	}

	protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {

		this.doPost(req, resp);
	}
}

4.创建filter:

/**
 * 
 * 登录页可正常放行
 * 其他都过滤
 *
 */
@WebFilter(filterName = "LoginFilter",urlPatterns = "*.jsp")
public class LoginFilter implements Filter{

	@Override
	public void destroy() {
		System.out.println("LoginFilter destroy");
		
	}

	@Override
	public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
			throws IOException, ServletException {
		System.out.println("LoginFilter 搞过滤");
		
		//需要判断是否为登录页.jsp   先获取请求的url  
		HttpServletRequest hreq=(HttpServletRequest)req;
		HttpServletResponse hresp=(HttpServletResponse)resp;
		
		StringBuffer requestURL = hreq.getRequestURL();
		System.out.println("请求的url是"+requestURL);
		//访问login页面 则请求的url是 http://localhost:8080/hihi/login.jsp
		
	
		/**
		 * 截取出最后面的不同部分【login.jsp】  作为判断依据:
		 * 		获取 最后1个/的下标;
		 * 		subString包前	
		 */
		int idx = requestURL.lastIndexOf("/");
		String urlends = requestURL.substring(idx+1);
		
		if(!urlends.equals("login.jsp")) {
			System.out.println("不是登录页请求,开始拦截处理");
			if(isLogin(hreq)) {
				System.out.println("登录过了,可进入首页");
				chain.doFilter(hreq, resp);
			}else {
				System.out.println("没登录过 或 账号密码错误,将跳转到登录页...");
				hresp.sendRedirect("login.jsp");
				//进入下1个jsp 此过滤器又自动执行——毕竟上面设了拦截*.jsp
			}
			
		}else {
			System.out.println("是登录页请求,不拦截   放行!");
			chain.doFilter(req, hresp);
		}	
	}
	
	
	
	/**
	 * 
	     * @Title: isLogin
	     * @参数:HttpServletRequest
	     * @Description: 判断 是否已登录了   =获取请求中的cookie的账户、密码
	     * @return: boolean
	 */
	private boolean isLogin(HttpServletRequest hreq) {
		//获取 请求中的 cookie中的 用户名、密码
		Cookie[] cookies = hreq.getCookies();		
		String username="";
		String pwd="";
		for (Cookie cookie : cookies) {
			//每个cookie是键值对 —— pwd=123——键getName——值getValue
			if(cookie.getName().equals("username")) {
				username=cookie.getValue();
			}
			else if (cookie.getName().equals("pwd")) {
				pwd=cookie.getValue();
			}
		}
		
		//假定个正确答案
		if(username.equals("nancy")&&pwd.equals("123")) {
			return true;
		}
		//用户名、密码  均未被再次赋值
		else if (username.equals("")&&pwd.equals("")) {
			return false;
		}

		//有1个错了啥的
		return false;
			
	}
	


	@Override
	public void init(FilterConfig arg0) throws ServletException {
		System.out.println("LoginFilter init");
		
	}
}

发布了11 篇原创文章 · 获赞 7 · 访问量 215

猜你喜欢

转载自blog.csdn.net/weixin_45881192/article/details/104081339