标签:dir ali 登录 元素 准备工作 配置信息 encoding arraylist 验证过
Servlet 编写过滤器
Servlet 过滤器可以动态地拦截请求和响应,以变换或使用包含在请求或响应中的信息。
可以将一个或多个 Servlet 过滤器附加到一个 Servlet 或一组 Servlet。Servlet 过滤器也可以附加到 JavaServer Pages (JSP) 文件和 HTML 页面。调用 Servlet 前调用所有附加的 Servlet 过滤器。
Servlet 过滤器是可用于 Servlet 编程的 Java 类,可以实现以下目的:
根据规范建议的各种类型的过滤器:
过滤器通过 Web 部署描述符(web.xml)中的 XML 标签来声明,然后映射到您的应用程序的部署描述符中的 Servlet 名称或 URL 模式。
当 Web 容器启动 Web 应用程序时,它会为您在部署描述符中声明的每一个过滤器创建一个实例。
Filter的执行顺序与在web.xml配置文件中的配置顺序一致,一般把Filter配置在所有的Servlet之前。
过滤器是一个实现了 javax.servlet.Filter 接口的 Java 类。javax.servlet.Filter 接口定义了三个方法:
序号方法 & 描述
|
|
1 |
public void doFilter (ServletRequest, ServletResponse, FilterChain) |
2 |
public void init(FilterConfig
filterConfig) |
3 |
public void destroy() |
以下是 Servlet 过滤器的实例,将输出网站名称和地址。本实例让您对 Servlet 过滤器有基本的了解,您可以使用相同的概念编写更复杂的过滤器应用程序:
package filter; import javax.servlet.*; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; import java.io.IOException; import java.util.ArrayList; import java.util.List; /* * * 登录过滤器 * */ public class LoginFilter implements Filter { private List<String> list; @Override public void init(FilterConfig filterConfig) throws ServletException { list =new ArrayList<>(); // list.add("update"); // list.add("updateDo"); // list.add("delete"); //避免重复编译 String value = filterConfig.getInitParameter("uri");//uri 参数名 String[] uris =value.split(","); //数组 for(String s:uris){ list.add(s); } } @Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest request = (HttpServletRequest)servletRequest; //强转类型 HttpServletResponse response =( HttpServletResponse)servletResponse; String m = servletRequest.getParameter("m"); if(list.contains(m)){ //判断如果存在这个参数 HttpSession session =request.getSession(); Object o = session.getAttribute("C_USER"); if(o ==null){ response.sendRedirect("/web/user?m=login"); return;//退出该方法 } } filterChain.doFilter(request,response); //执行该该请求接下来的事情 } @Override public void destroy() { } }
定义过滤器,然后映射到一个 URL 或 Servlet,这与定义 Servlet,然后映射到一个 URL 模式方式大致相同。在部署描述符文件 web.xml 中为 filter 标签创建下面的条目:
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd" version="4.0"> <filter> <filter-name>login</filter-name> <filter-class >filter.LoginFilter</filter-class> <!--过滤器中参数--> <init-param> <param-name>uri</param-name> <param-value>update,updateDo,delete</param-value> </init-param> </filter> <filter-mapping> <filter-name>login</filter-name> <url-pattern>/user</url-pattern> </filter-mapping> <!--过滤器执行--> <servlet> <servlet-name>MyServlet</servlet-name> <servlet-class>MyServlet</servlet-class> </servlet> <servlet-mapping> <!-- 映射 --> <servlet-name>MyServlet</servlet-name> <url-pattern>/my</url-pattern> </servlet-mapping> <servlet> <servlet-name>UserController</servlet-name> <servlet-class>UserController</servlet-class> </servlet> <servlet-mapping> <servlet-name>UserController</servlet-name> <url-pattern>/user/*</url-pattern> </servlet-mapping> <!--执行登录界面--> </web-app>
上述过滤器适用于所有的 Servlet,因为我们在配置中指定 /* 。如果您只想在少数的 Servlet 上应用过滤器,您可以指定一个特定的 Servlet 路径。
Web 应用程序可以根据特定的目的定义若干个不同的过滤器。假设您定义了两个过滤器 AuthenFilter 和 LogFilter。您需要创建一个如下所述的不同的映射,其余的处理与上述所讲解的大致相同:
<filter> <filter-name>LogFilter</filter-name> <filter-class>test.LogFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value>Initialization Paramter</param-value> </init-param> </filter> <filter> <filter-name>AuthenFilter</filter-name> <filter-class>test.AuthenFilter</filter-class> <init-param> <param-name>test-param</param-name> <param-value>Initialization Paramter</param-value> </init-param> </filter> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>AuthenFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
web.xml 中的 filter-mapping 元素的顺序决定了 Web 容器应用过滤器到 Servlet 的顺序。若要反转过滤器的顺序,您只需要在 web.xml 文件中反转 filter-mapping 元素即可。
例如,上面的实例将先应用 LogFilter,然后再应用 AuthenFilter,但是下面的实例将颠倒这个顺序:
<filter-mapping> <filter-name>AuthenFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <filter-mapping> <filter-name>LogFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>
标签:dir ali 登录 元素 准备工作 配置信息 encoding arraylist 验证过
原文地址:https://www.cnblogs.com/houtian2333/p/10749251.html