您的位置:首页 > 编程语言 > Java开发

javaEE框架类——过滤器(Filter)

2016-08-17 16:35 471 查看
1简介:

- 过虑器能对客户的请求进行预先处理,然后再将请求转发给其他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>
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: