要求:
没登录过 则不可访问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");
}
}