权限过滤器(filter)
filter的执行原理一个数组与一个map一个map:map的key为 url-pattern 的值,value为filter实例对象的引用一个数组:存放着与请求向匹配的所有Filter执行原理:当对某资源的请求到达Web容器时,会先对请求进行解析,使用解析出的URl作为比较对象,从Map中查找是否存在相匹配的key。若存在:那么读取其value,即Filter对象的引用,将该引用存入...
filter的执行原理
一个数组与一个map
一个map:map的key为 url-pattern 的值,value为filter实例对象的引用
一个数组:存放着与请求向匹配的所有Filter
执行原理:
当对某资源的请求到达Web容器时,会先对请求进行解析,使用解析出的URl作为比较对象,从Map中查找是否存在相匹配的key。
若存在:那么读取其value,即Filter对象的引用,将该引用存入到数组中。然后继续向后查找,知道将该Map查找完毕。这样在数组中就会存在按照查找顺序排好序的Filter引用。
数组初始化完毕后,开始按照数组元素顺序进行执行,所有数组中的Filter全部执行完毕后,在跳转到请求目标资源。
利用filter去判断url的地址是否是该用户可以访问的
是,即可访问
不是,即跳转到登录页面
package com._12_permissionFilter.filters;
import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;
import java.io.IOException;
@WebFilter("/*")
public class ParmissionFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
HttpServletRequest req = (HttpServletRequest) servletRequest;
String servletPath = req.getServletPath();
//若servletPath以/user开头,那么。这个请求的资源必须要登录才可以访问
if(servletPath.startsWith("/user")){
HttpSession session = req.getSession(false);
//若session不为null,则需要判断user
//若session为null,则一定没有登录,那么跳转到登录页面
if(session != null){
String user = (String) session.getAttribute("user");
//若user为null,则说明没有登录,那么跳转到登录页面
//若user不为null,则说明已经登录,则放行
if(user != null){
filterChain.doFilter(servletRequest,servletResponse);
} else {
req.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
return;
}
}else {
req.getRequestDispatcher("/login.jsp").forward(servletRequest,servletResponse);
return;
}
} else {
//若servletPath不以/user开头,那么访问的资源不需要登录即可访问
filterChain.doFilter(servletRequest,servletResponse);
}
}
}
package com._12_permissionFilter.servlets;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/loginServlet")
public class LoginServlet extends HttpServlet {
@Override
protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
String user = req.getParameter("username");
req.getSession().setAttribute("user",user);
resp.getWriter().print(user + " login success");
}
}
package com._12_permissionFilter.servlets;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
@WebServlet("/someServlet")
public class SomeServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
resp.setContentType("text/html;charset=utf-8");
resp.getWriter().print("SomeServlet, 需要登录后才可访问");
}
}
首页页面 index.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>$Title$</title>
</head>
<body>
无需要登录,可访问
</body>
</html>
登录页面 login.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/loginServlet" method="post">
用户名:<input type="text" name="username" />
<input type="submit" value="登录" />
</form>
</body>
</html>
登出页面 user/logout.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%
session.invalidate();
%>
需要登录后才能访问
</body>
</html>
用户浏览页面 user/userList.jsp
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
用户浏览页面
</body>
</html>
先进入登录页面,然后去user/userLsit.jsp页面浏览,再登出 user/logout.jsp,再次进入user/userLsit.jsp,会发现跳转到登录页面
更多推荐
所有评论(0)