javaEE框架类——过滤器(Filter)
2016-08-17 16:35
471 查看
1简介:
2.过滤器图解:
过滤器技术要点:
3.创建自定义的过虑器:
自定义的过虑器必须实现:javax.servlet.Filter接口。此接口定义了以下三个方法:
Init(FilterConfig conf) – 过虑器的初始化方法。-初始化工作执行一次(启动时)。
doFilter(ServletRequest,ServletResponse,FilterChain) –
此方法完成实际的过虑操作。只要是配置的url匹配此过虑器的配置,即执行此方法。
destroy()-Servlet窗口在销毁过虑器时执行此方法。-销毁工作也只执行一次。
4.过滤器配置说明:
注意:
这里的的dispatcher只拦截/servlet/和/jsps/的forward页面,并不是所有的forward页面
5.应用场景:
黑名单
爬虫重复URL检测
代理缓存技术
设置通用功能(代理)
不文明话语过滤(管理员踢人)
自动登录(登录保存技术)
6.自动登录代码实现:
index.jsp
字符过滤器CharacterFilter.java
自动登录过滤器AutoLoginFilter.java
LoginServlet.java
web.xml配置文件
- 过虑器能对客户的请求进行预先处理,然后再将请求转发给其他web组件。 - 过虑器是在Servlet2.3规范中定义的,它可以对Web组件的,ServletRequest和ServletResponse进行检查和修改。 - 过虑器本身并不生成ServletRequest对象和ServletResponse对象,它只对web组件提供以下过虑功能: 在web组件调用之前检查request,并修改请求头和请求正文。 过虑器能够在web组件被调用之后检查response对像,修改响应头和响应正文。
2.过滤器图解:
过滤器技术要点:
1)可以拦截(在前端页面与servlet之间进行) 2)可以拦截服务器中的任意资源(jsp,html,jpg,servlet) 3)该拦截不影响访问速度,而且可以放置多个过滤器 4)优先级高于servlet,请求时先执行filter,响应时后执行filter 5) 有关路径的说明: /* 拦截项目下的所有资源 *.jsp 拦截所有的jsp页面 /jsps/* 拦截jsps目录下的所有资源 /buy/* 拦截buy目录(注意,不一定是真实文件夹,这里指的是路径中的一段)下的所有资源 /LoginServlet 只拦截该servlet login 只拦截名为“login”的servlet /jsps/*.jsp ----非法路径,因为里面要求类似“*.jsp”这样的格式只能放在开头,不能放在后面 6)如果配置了多个过滤器,它们的先后位置(从前端到后台方向的先后顺序)是以“filter-mapping” 的书写顺序来定的
3.创建自定义的过虑器:
自定义的过虑器必须实现:javax.servlet.Filter接口。此接口定义了以下三个方法:
Init(FilterConfig conf) – 过虑器的初始化方法。-初始化工作执行一次(启动时)。
doFilter(ServletRequest,ServletResponse,FilterChain) –
此方法完成实际的过虑操作。只要是配置的url匹配此过虑器的配置,即执行此方法。
destroy()-Servlet窗口在销毁过虑器时执行此方法。-销毁工作也只执行一次。
4.过滤器配置说明:
过虑器的配置:以下几乎是所有单位的标准配置 <filter> <filter-name>autoLoginFilter</filter-name> <filter-class>cn.itcast.autologinfilter.AutoLoginFilter</filter-class> </filter> <filter-mapping> <filter-name>autoLoginFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> filter-name是过虑器的名称 filter-class是过虑器的类文件 init-param是过虑器的初始化参数。 param-name – 是参数名。 param-value - 是参数值。 filter-mapping是过虑器的映射信息。 url-pattern-是需要过虑的资源url. dispatcher-需要拦截的导向页面属性(基于url-pattern设置)
注意:
- Filter-mapping子的元素: 对于一个<filter/>元素,可以设置多个filter-mapping对应的元素。 <serlvet-name/>如果不配置<url-pattern/>元素,也可以通过配置<serlvet-name/>元素的形式设置需要拦截的Servlet。 <dispatcher/>元素:可以为FORWARD- INCLUDE- REQUEST(默认)- ERROR之一。指定需要拦截的Servlet的请求试。
<filter-mapping> <filter-name>login</filter-name> <url-pattern>/servlet/*</url-pattern> <url-pattern>/jsps/*</url-pattern> <dispatcher>FORWARD</dispatcher> </filter-mapping>
这里的的dispatcher只拦截/servlet/和/jsps/的forward页面,并不是所有的forward页面
5.应用场景:
黑名单
爬虫重复URL检测
代理缓存技术
设置通用功能(代理)
不文明话语过滤(管理员踢人)
自动登录(登录保存技术)
6.自动登录代码实现:
index.jsp
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%> <%@taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %> <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> <head> <title>这是主页</title> </head> <body> <h3>这是主页</h3> <a href="<c:url value='/css/table.css' />">访问css</a> <hr/> <c:if test="${!empty sessionScope.error}"> ${sessionScope.error} <c:remove var="error" scope="session"/> </c:if> <c:if test="${empty sessionScope.user }" var="boo"> <form action="<c:url value='/LoginServlet'/>" method="post"> Name:<input type="text" name="name"><br/> Pwd:<input type="text" name="pwd"><br/> <input type="submit" value="登录"> <input type="radio" name="time" value="0" checked="checked"> 不保存 <input type="radio" name="time" value="1">一天 <input type="radio" name="time" value="7">七天 </form> </c:if> <c:if test="${!boo}"> ${user.name }欢迎回来! <a href="<c:url value='/jsps/show.jsp'/>">浏览商品</a><br/> <a href="<c:url value='/CancelAutoLoginServlet'/>">取消自动登录</a> </c:if> </body> </html>
字符过滤器CharacterFilter.java
package cn.hncu.pubs; import java.io.IOException; import java.util.Date; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; import javax.servlet.http.HttpServletResponse; public class CharacterFilter implements Filter { private String charset; public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { request.setCharacterEncoding(charset); response.setCharacterEncoding(charset); HttpServletResponse resp=(HttpServletResponse) response; chain.doFilter(request, resp); } public void init(FilterConfig fConfig) throws ServletException { charset=fConfig.getInitParameter("charset"); } }
自动登录过滤器AutoLoginFilter.java
package cn.hncu.pubs; import java.io.IOException; import java.net.URLDecoder; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; 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; import cn.hncu.domain.User; public class AutoLoginFilter implements Filter { public AutoLoginFilter() { } public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req=(HttpServletRequest) request; Cookie cs[]=req.getCookies(); if (cs!=null) { for (Cookie c : cs) { if (c.getName().equals("autoLogin")) { String value = c.getValue(); String[] strs = value.split("@#"); String name = URLDecoder.decode(strs[0], "utf-8"); String pwd = URLDecoder.decode(strs[1], "utf-8"); if (name.equals(pwd)) { User user = new User(); user.setName(name); user.setPwd(pwd); System.out.println(user); req.getSession().setAttribute("user", user); } break; } } } chain.doFilter(req, response); } public void init(FilterConfig fConfig) throws ServletException { } }
LoginServlet.java
package cn.hncu.servlet; import java.io.IOException; import java.net.URLEncoder; import javax.servlet.ServletException; import javax.servlet.http.Cookie; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import cn.hncu.domain.User; public class LoginServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html;charset=utf-8"); String name=request.getParameter("name"); String pwd=request.getParameter("pwd"); String time=request.getParameter("time"); User user=new User(); user.setName(name); user.setPwd(pwd); if (name!=null&&name.trim().length()>0&&pwd!=null) { if (name.equals(pwd)) { //登录成功,就往客户端写一个cookie,将用户名和密码存到cookie中 //为了能够兼容中文,要进行编码 name=URLEncoder.encode(name, "utf-8"); pwd=URLEncoder.encode(pwd, "utf-8"); Cookie cookie=new Cookie("autoLogin", name+"@#"+pwd); cookie.setPath(request.getContextPath()); cookie.setMaxAge(60*60*24*Integer.parseInt(time));//分钟为单位 response.addCookie(cookie); request.getSession().setAttribute("user", user); }else{ request.getSession().setAttribute("error", "用户名或者密码错误"); } }else{ request.getSession().setAttribute("error", "用户名或者密码不能为空"); } response.sendRedirect(request.getContextPath()+"/index.jsp"); } }
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" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" 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></display-name> <filter> <filter-name>CharacterFilter</filter-name> <filter-class>cn.hncu.pubs.CharacterFilter</filter-class> <init-param> <param-name>charset</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter> <filter-name>AutoLoginFilter</filter-name> <filter-class>cn.hncu.pubs.AutoLoginFilter</filter-class> <init-param> <param-name>charset</param-name> <param-value>utf-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>AutoLoginFilter</filter-name> <url-pattern>/LoginServlet</url-pattern> <url-pattern>/index.jsp</url-pattern> </filter-mapping> <filter-mapping> <filter-name>CharacterFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <servlet> <servlet-name>LoginServlet</servlet-name> <servlet-class>cn.hncu.servlet.LoginServlet</servlet-class> </servlet> <servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>CancelAutoLoginServlet</servlet-name> <servlet-class>cn.hncu.servlet.CancelAutoLoginServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>LoginServlet</servlet-name> <url-pattern>/LoginServlet</url-pattern> </servlet-mapping> <servlet-mapping> <servlet-name>CancelAutoLoginServlet</servlet-name> <url-pattern>/CancelAutoLoginServlet</url-pattern> </servlet-mapping> <welcome-file-list> <welcome-file>index.jsp</welcome-file> </welcome-file-list> </web-app>
相关文章推荐
- JavaEE之过滤器-Filter
- JAVAEE之--------过滤器设置是否缓存(Filter)
- JAVAEE之--------过滤器设置是否缓存(Filter)
- JavaEE框架类——全站压缩——对网站内容进行数据压缩(Filter和GzipOutputStream二合一)
- JavaEE学习之过滤器 Filter
- JavaEE学习14--过滤器filter
- VC6.0下MFC中CFileDialog的文件过滤器lpstrfilter的设置
- JavaWeb学习总结(四十二)——Filter(过滤器)学习
- Filter 过滤器
- Spring CharacterEncodingFilter字符集过滤器
- 通过过滤器Filter来完成登录访问权限限制
- UrlRewriteFilter 4.0.3过滤器参数
- Servlet过滤器Filter和监听器
- Servlet中的过滤器Filter详解
- 使用java的过滤器filter备忘(HttpServletResponseWrapper)
- Filter-编码过滤器
- 基于Filter<过滤器>登录权限验证设计心得
- 使用filter(过滤器)处理JSP和servlet的中文乱码
- AngularJs filter 过滤器
- elasticsearch__5__java操作之FilterBuilders构建过滤器Query