拦截过滤器模式

本文概述

  • 用法
  • 好处
  • UML拦截过滤器模式
  • 拦截过滤模式的实现
拦截过滤器模式表示“如果要在处理请求之前和之后拦截和处理请求和响应”。
用法
  • 当需要集中化时, 跨请求的通用处理, 例如记录有关每个请求的信息, 压缩传出响应或检查每个请求的数据编码方案。
  • 当你需要预处理和后期处理时, 与核心请求处理服务松散耦合的组件不便于添加和删除。
好处
  • 它通过松散耦合的处理程序提供集中控制。
  • 它提高了可重用性。
UML拦截过滤器模式
拦截过滤器模式

文章图片
拦截过滤模式的实现 步骤1
创建一个Login.html网页。
< !DOCTYPE html> < html> < head> < meta charset="US-ASCII"> < title> Login Page< /title> < /head> < body> < form action="LoginServlet" method="post"> Username: < input type="text" name="username"> < br> < br> Password: < input type="password" name="password"> < br> < br> < input type="submit" value="http://www.srcmini.com/Login"> < /form> < /body>

第2步
创建一个LoginServlet类。
package sessions; import java.io.IOException; import java.io.PrintWriter; import javax.servlet.RequestDispatcher; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; ** * Servlet implementation class LoginServlet */ @WebServlet("/LoginServlet") public class LoginServlet extends HttpServlet { private static final long serialVersionUID = 1L; private final String user = "admin"; private final String password = "admin@1234"; public LoginServlet() { super(); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {// get request parameters for username and passwd String username = request.getParameter("username"); String passwd = request.getParameter("password"); if(user.equals(username) & & password.equals(passwd)){ HttpSession session = request.getSession(); session.setAttribute("user", "ashwani"); //setting session to expire in 1 hour session.setMaxInactiveInterval(60*60); Cookie userName = new Cookie("user", user); userName.setMaxAge(60*60); response.addCookie(userName); response.sendRedirect("LoginSuccess.jsp"); }else{ RequestDispatcher rd = getServletContext().getRequestDispatcher("/Login.html"); PrintWriter out= response.getWriter(); out.println("< font color=red> Either user name or password is wrong.< /font> "); rd.include(request, response); } } }//End of the LoginServlet class.

第三步
创建一个LoginSuccess.jsp页面。
< %@ page language="java" contentType="text/html; charset=US-ASCII" pageEncoding="US-ASCII"%> < !DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> < html> < head> < meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> < title> Login Success Page< /title> < /head> < body> < % //allow access only if session exists String user = (String) session.getAttribute("user"); String userName = null; String sessionID = null; Cookie[] cookies = request.getCookies(); if(cookies !=null){ for(Cookie cookie : cookies){ if(cookie.getName().equals("user")) userName = cookie.getValue(); if(cookie.getName().equals("JSESSIONID")) sessionID = cookie.getValue(); } } %> < h3> Hi < %=userName %> , Login successful.Your Session ID=< %=sessionID %> < /h3> < br> User=< %=user %> < br> < a href="http://www.srcmini.com/CheckoutPage.jsp"> Checkout Page< /a> < br> < form action="LogoutServlet" method="post"> < input type="submit" value="http://www.srcmini.com/Logout" > < /form> < /body> < /html>

【拦截过滤器模式】步骤4
创建一个AdminPage.jsp页面。
< %@ page language="java" contentType="text/html; charset=US-ASCII" pageEncoding="US-ASCII"%> < !DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> < html> < head> < meta http-equiv="Content-Type" content="text/html; charset=US-ASCII"> < title> Login Success Page< /title> < /head> < body> < % String userName = null; String sessionID = null; Cookie[] cookies = request.getCookies(); if(cookies !=null){ for(Cookie cookie : cookies){ if(cookie.getName().equals("user")) userName = cookie.getValue(); } } %> < h3> Hi < %=userName %> , These services are only for you to take action.< /h3> < br> < form action="LogoutServlet" method="post"> < input type="submit" value="http://www.srcmini.com/Logout" > < /form> < /body> < /html>

第5步
创建一个LogoutServlet类。
package sessions; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.annotation.WebServlet; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * Servlet implementation class LogoutServlet */ @WebServlet("/LogoutServlet") public class LogoutServlet extends HttpServlet { private static final long serialVersionUID = 1L; protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); Cookie[] cookies = request.getCookies(); if(cookies != null){ for(Cookie cookie : cookies){ if(cookie.getName().equals("JSESSIONID")){ System.out.println("JSESSIONID="+cookie.getValue()); break; } } } //invalidate the session if exists HttpSession session = request.getSession(false); System.out.println("User="+session.getAttribute("user")); if(session != null){ session.invalidate(); } response.sendRedirect("Login.html"); }}//End of the LogoutServlet class

第6步
创建一个AuthenticationFilter类。
package filters; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; /** * Servlet Filter implementation class AuthenticationFilter */ @WebFilter("/AuthenticationFilter") public class AuthenticationFilter implements Filter { private ServletContext context; public void init(FilterConfig fConfig) throws ServletException { this.context = fConfig.getServletContext(); this.context.log("AuthenticationFilter initialized"); }public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse res = (HttpServletResponse) response; String uri = req.getRequestURI(); this.context.log("Requested Resource::"+uri); HttpSession session = req.getSession(false); if(session == null & & !(uri.endsWith("html") || uri.endsWith("LoginServlet"))){ this.context.log("Unauthorized access request"); res.sendRedirect("Login.html"); }else{ // pass the request along the filter chain chain.doFilter(request, response); } } public void destroy() { //close any resources here } }//End of the AuthenticationFilter class

步骤7
创建一个RequestLoggingFilter类。
package filters; import java.io.IOException; import java.util.Enumeration; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletContext; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServletRequest; @WebFilter("/RequestLoggingFilter") public class RequestLoggingFilter implements Filter { private ServletContext context; public void init(FilterConfig fConfig) throws ServletException { this.context = fConfig.getServletContext(); this.context.log("RequestLoggingFilter initialized"); } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; Enumeration< String> params = req.getParameterNames(); while(params.hasMoreElements()){ String name = params.nextElement(); String value = http://www.srcmini.com/request.getParameter(name); this.context.log(req.getRemoteAddr() +"::Request Params::{"+name+"="+value+"}"); }Cookie[] cookies = req.getCookies(); if(cookies != null){ for(Cookie cookie : cookies){ this.context.log(req.getRemoteAddr() + "::Cookie::{"+cookie.getName()+", "+cookie.getValue()+"}"); } } // pass the request along the filter chain chain.doFilter(request, response); } public void destroy() { //we can close resources here } }// End of the RequestLoggingFilter class

步骤8
创建一个web.xml文件。
< ?xml version="1.0" encoding="UTF-8"?> < web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0"> < display-name> ServletFilterExample< /display-name> < welcome-file-list> < welcome-file> Login.html< /welcome-file> < /welcome-file-list> < filter> < filter-name> RequestLoggingFilter< /filter-name> < filter-class> filters.RequestLoggingFilter< /filter-class> < /filter> < filter> < filter-name> AuthenticationFilter< /filter-name> < filter-class> filters.AuthenticationFilter< /filter-class> < /filter> < filter-mapping> < filter-name> RequestLoggingFilter< /filter-name> < url-pattern> /*< /url-pattern> < dispatcher> REQUEST< /dispatcher> < /filter-mapping> < filter-mapping> < filter-name> AuthenticationFilter< /filter-name> < url-pattern> /*< /url-pattern> < /filter-mapping> < /web-app>

输出:
拦截过滤器模式

文章图片
拦截过滤器模式

文章图片
拦截过滤器模式

文章图片
拦截过滤器模式

文章图片

    推荐阅读