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

1简介:

 - 过虑器能对客户的请求进行预先处理,然后再将请求转发给其他web组件。
 - 过虑器是在Servlet2.3规范中定义的,它可以对Web组件的,ServletRequest和ServletResponse进行检查和修改。
 - 过虑器本身并不生成ServletRequest对象和ServletResponse对象,它只对web组件提供以下过虑功能:
   在web组件调用之前检查request,并修改请求头和请求正文。
   过虑器能够在web组件被调用之后检查response对像,修改响应头和响应正文。

2.过滤器图解:
这里写图片描述

  1. 过滤器技术要点:
  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>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值