1.登录页面login.jsp
<form action="doLogin.jsp" method="post">
<table border="1px" width="500px" align="center">
<tr>
<td colspan="2" bgcolor="#7fffd4">登录</td>
</tr>
<tr>
<td>用户:</td><%--文本框--%>
<td><input type="text" name="username"></td>
</tr>
<tr>
<td>密码:</td><%--密码框--%>
<td><input type="password" name="password"></td>
</tr>
<tr>
<td></td><%--提交按钮submit--%>
<td><input type="submit" value="确定"></td>
</tr>
</table>
</form>
2.对login.jsp的数据进行操作的页面:doLogin.jsp
<%@ page import="com.pro.domain.Permission" %>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%
//1.进行登录
String username = request.getParameter("username");
String password = request.getParameter("password");
Users users = new Users();
users.setUsername(username);
users.setPassword(password);
//2.将登录后的结果集封装,得到该用户所有的详细信息
UsersService usersService = new UsersServiceImpl();
Users user1 = usersService.login(users);
String path = "login.jsp";
if (user1 != null) {
Users user2 = usersService.getUsersAllDetails(user1);
session.setAttribute("user2",user2);
path = "index.jsp";
}
//3
response.sendRedirect(path);
%>
3.过滤器代码
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
//向下转型,让request既有自己的方法又有servletRequest的方法(应该是这么理解的),response同理
HttpServletRequest request = (HttpServletRequest) servletRequest;
HttpServletResponse response = (HttpServletResponse) servletResponse;
//1.获取网络地址,取最后一个“/”后面的字符串
String path = request.getRequestURI();
path = path.substring(path.lastIndexOf("/"));
path = path.substring(1);
//2.将公共访问资源与path进行比较,如果path访问的是公共资源,则可以进行公共资源的访问
if ("login.jsp".equals(path) || "doLogin.jsp".equals(path) || "noPermission.jsp".equals(path)) {
filterChain.doFilter(request, response);
return;
}
//3.如果不是访问的公共资源,则需要进行用户验证,即进行访问权限设置
//3.1 获取session作用域对象
HttpSession session = request.getSession();
//3.2 从doLogin.jsp文件中得到User对象
Users user = (Users) session.getAttribute("user2");
boolean flag = false;
/*3.2 当存在这个用户时,先遍历访问权限,然后根据flag判断,如果用户权限中包含了path,则可以访问path,否则跳转到noPermission.jsp页面中*/
if (user != null) {
for (Permission s : user.getRole().getPermissionList()){
if (s.getUrl().equals(path)) {
flag = true;
break;
}
if ("index.jsp".equals(path)) {
flag = true;
break;
}
}
if (flag) {
filterChain.doFilter(request, response);
return;
} else {
response.sendRedirect("noPermission.jsp");
return;
}
}
//4.如果path既不是访问公共资源,也不是访问所在权限资源,则回到login.jsp中
response.sendRedirect("login.jsp");
//记得在web.xml文件中对过滤器进行配置!
/*
<filter>
<filter-name>filter</filter-name>
<filter-class>com.pro.util.MyFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>filter</filter-name>
<url-pattern>/*</url-pattern> 所有页面跳转都会触发过滤器
</filter-mapping>
*/
}
通过编码可以看出servlet过滤器的基本思想:
1.获得要访问的网页,截取最后一个"/"的后面部分
2.和可以访问的公共资源进行对比,符合就可以访问
3.访问的页面不是公共资源:先遍历该用户的权限,如果用户权限中有该页面,则可以访问,否则就是非法访问
4.既不是访问公共资源也不是访问权限资源,此处是跳转到了login.jsp,这个根据实际情况而定