利用过滤去实现权限验证
思路分析:
1.当用户没有登录时
除了访问登录界面和注册登录界面以及login.do之外,其他的都不能访问,如果访问其他页面将进入登录界面
2.当用户登录时
1)cookie中有用户信息,点击登录就可以直接登录、
2)cookie里面没有用户信息,判断用户是不是第二次登录
3)cookie和session里面都没有用户信息,那么用户需要输入账号密码进行验证
账号密码正确:登录成功,信息同时保存在会话对象中
如果勾选了三天免登陆,那么信息保存在cookie中
账号密码错误:返回登录界面重新登录
实现步骤:
1.创建项目DServlet,布置运行环境
2.在web下面的WEB-INF下新建lib文件夹,导入需要的第三方jar包
3.在src下面创建com.jrt.web.filter.UserRequestFilter
业务逻辑:
继承ServletException类,首先强转成HttpServlet类型参数,然后获取username值,如果用户登录成功,那么session里面是有值的,如果登录过,可以直接进入index界面,如果没有的登录,再一次进行判断,是不是除了(login.jsp,register.jsp,loginServlet.do)之外的,都会跳转到login.jsp界面进行登录,实现过滤。
4.在src下面创建com.jrt.web.servlet.LoginServlet
业务逻辑:
首先确认cookie里面有没有用户,有用户可以不用输入直接登录了,获取所有的cookis循环判断,然后判断是不是第二次登录,两种情况都不是的情况下输入用户名密码进行验证,验证过程中注意用户是否勾选三天免登陆,勾选的话,要在cookie里面保存信息
5.写前端页面index.jsp
6.写前端页面login.jsp
在form表单里面设置使用户输入用户名和密码,设置三天免登陆选项。
7.写前端页面,register.jsp用户未登录也可以进入这个页面。
UserRequestFilter.java
package com.jrt.web.filter;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.HashSet;
import java.util.Set;
@WebFilter(urlPatterns = {"*.do","*.jsp"})
public class UserRequestFilter implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
Filter.super.init(filterConfig);
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//1.强转
HttpServletRequest request=(HttpServletRequest)servletRequest;
HttpServletResponse response=(HttpServletResponse)servletResponse;
//2.如果用户已经登录成功,那么session里面是有值的,通过判断username来判断是否登录
String username=(String)request.getSession().getAttribute("username");
System.out.println("username="+username);
System.out.println(">>>"+request.getRequestURI());
//3.如果已经登录过
if(username!=null){
request.getRequestDispatcher("index.jsp").forward(request,response);
return;
}
//4.如果没有登录。只有两种情况放行 去登录界面或者注册界面
if(username==null && !isCheck(request.getRequestURI())){
System.out.println("in.....");
request.getRequestDispatcher("login.jsp").forward(request,response);
return;
}
//放行
filterChain.doFilter(request,response);
}
public boolean isCheck(String requsetURI){
boolean flag=false;
Set<String> sets=new HashSet<>();
sets.add("register.jsp");
sets.add("login.jsp");
sets.add("loginServlet.do");
for(String uri:sets){
if(requsetURI.endsWith(uri)){
flag=true;
break;
}
}
return flag;
}
@Override
public void destroy() {
Filter.super.destroy();
}
}
loginServlet.java
package com.jrt.web.servlet;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
import java.io.IOException;
@WebServlet("/loginServlet.do")
public class LoginServlet extends HttpServlet {
@Override
protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//1.首先确认cookie里面有没有用户,就可以不用登录了
//获取所有的cookis
Cookie[] cs=req.getCookies();
//一定要判断这个里面是不是空的
if(cs!=null){
System.out.println("进行cookie判断");
for(Cookie cookie:cs){
String name=cookie.getName();
String value=cookie.getValue();
//value= URLDecoder.decode(value,"utf-8");
if("username".equals(name)){
System.out.println("cookies里面的name:"+name);
req.getSession().setAttribute("username",value);
req.getRequestDispatcher("index.jsp").forward(req,resp);
return;
}
}
}
//2.判断是不是第二次登录这里可以不进行,因为过滤器在username值不为空时,已经进行了放行
String uname=(String) req.getSession().getAttribute("username");
if(uname!=null){
req.getRequestDispatcher("index.jsp").forward(req,resp);
return;
}
//cookie里面没有,也不是第二次登录,只能输入账号密码进行判断
req.setCharacterEncoding("utf-8");
String username =req.getParameter("username");
System.out.println(username);
String password =req.getParameter("pwd");
System.out.println(password);
if("zhangsan".equals(username)&&"123456".equals(password)){
//判断他是否选择了三天免登陆
if("auto".equals(req.getParameter("auto"))){
Cookie cookie1=new Cookie("username",username);
Cookie cookie2=new Cookie("password",password);
cookie1.setMaxAge(24*60*60*3);
cookie2.setMaxAge(24*60*60*3);
resp.addCookie(cookie1);
resp.addCookie(cookie2);
}
String success="登录成功";
req.setAttribute("success",success);
HttpSession session = req.getSession();
session.setAttribute("username",username);
req.getRequestDispatcher("index.jsp").forward(req,resp);
}else{
resp.sendRedirect("login.jsp");
}
}
}
login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<h2 align="center">用户登录验证</h2>
<form method="post" action="loginServlet.do" >
用户名:<input type="text" name="username" id="username"><br>
密码:<input type="text" name="pwd" id="pwd"><br>
<input type="submit" value="登录"><br>
<input type="checkbox" name="auto" value="auto" id="auto">三天免登陆
<a href="register.jsp">前去注册</a>
</form>
</body>
</html>
index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
这里是index
</body>
</html>
register.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
这是注册页面
</body>
</html>