CharacterFilter

package cn.hncu.filter;

import java.io.IOException;

import javax.servlet.Filter;
import javax.servlet.FilterChain;
import javax.servlet.FilterConfig;
import javax.servlet.ServletException;
import javax.servlet.ServletRequest;
import javax.servlet.ServletResponse;

/*
 * 过滤器开发:
 * 1.写一个类实现Filter接口
 * 2.配置web.xml (配置<filter>和<filter-mapping>两个元素)
 * 
 */

public class CharacterFilter implements Filter{

    private String charset;
    //过滤器的init在服务器一启动时就会执行。
    //servlet如果配置了load-on-startup选项则也会在服务器启动
    //时就执行初始化,否则只有在第一次访问该servlet时才会执行。
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("CharacterFilter-init...");
        this.charset=filterConfig.getInitParameter("charset");
    }

    @Override//该方法在拦截到相应请求或响应时才会执行
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        System.out.println("CharacterFilter-doFilter...拦截请求");//拦截请求
        //request.setCharacterEncoding("utf-8");//编码写死了
        request.setCharacterEncoding(charset);
        //编码写活,让用户可配置(在web.xml中修改参数)
        chain.doFilter(request, response);//放行
        System.out.println("CharacterFilter-doFilter...拦截响应");//拦截响应
        response.setContentType("text/html;charset="+charset);
    }

    @Override
    public void destroy() {
        System.out.println("CharacterFilter-destory...");

    }

}

LoginSecureFilter

package cn.hncu.filter;

import java.io.IOException;

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.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class LoginSecureFilter implements Filter{

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("LoginSecureFilter-init...");
    }

    @Override
    public void doFilter(ServletRequest request, ServletResponse response,
            FilterChain chain) throws IOException, ServletException {
        System.out.println("LoginSecureFilter-doFilter...拦截请求");//拦截请求
        HttpServletRequest req=(HttpServletRequest) request;
        String name=(String) req.getSession().getAttribute("name");

        if(name==null||name.trim().equals("")){
            //踢到登录页面
            //注意,重定向时路径中的第一个"/"是指Tomcat的根目录,因此这里必须加一个项目名。
            ((HttpServletResponse)response).sendRedirect(req.getContextPath()+"/index.jsp");
        }
        chain.doFilter(request, response);//放行
        System.out.println("LoginSecureFilter-doFilter...拦截响应");//拦截响应
    }

    @Override
    public void destroy() {

    }

}

web.xml–配置Filter和Servlet

<?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>
  <!-- 过滤器链中,这一段的配置顺序决定init的执行顺序 -->



  <filter>
    <filter-name>login</filter-name>
    <filter-class>cn.hncu.filter.LoginSecureFilter</filter-class>
  </filter>
  <filter>
    <filter-name>three</filter-name>
    <filter-class>cn.hncu.filter.CharacterFilter</filter-class>
    <init-param>
        <param-name>charset</param-name>
        <param-value>UTF-8</param-value>
    </init-param>
  </filter>

  <!-- 拦截路径设置说明:
      1.  “/*” 表示拦截所有资源
      2.  “*.jsp” 表示拦截所有jsp页面的请求与响应
      3.  “/jsps/*.jsp”  ※不能这样写,格式错误※
      4.  “/jsps/*” 表示拦截jsps目录下的所有资源 
      5.  “/LoginServlet” 表示只拦截映射路径为“/LoginServlet”的这一个servlet
      6.  “login” 表示只拦截名“login”的servlet(可以把jsp页面配置成serlvet)
   -->
  <!-- 过滤器链中,这一段的配置顺序决定拦截顺序(过滤器的过滤顺序) -->

  <filter-mapping>
    <filter-name>three</filter-name>
    <!-- 指定拦截访问后台的哪些资源(servlet,jsp,jpg文件等), '/*'代表所有资源 -->
    <url-pattern>/*</url-pattern>
  </filter-mapping>


  <servlet>
    <servlet-name>LoginServlet</servlet-name>
    <servlet-class>cn.hncu.servlet.LoginServlet</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>BuyServlet1</servlet-name>
    <servlet-class>cn.hncu.servlet.BuyServlet1</servlet-class>
  </servlet>
  <servlet>
    <servlet-name>BuyServlet2</servlet-name>
    <servlet-class>cn.hncu.servlet.BuyServlet2</servlet-class>
  </servlet>



  <servlet-mapping>
    <servlet-name>LoginServlet</servlet-name>
    <url-pattern>/login</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>BuyServlet1</servlet-name>
    <url-pattern>/buy/buy1</url-pattern>
  </servlet-mapping>
  <servlet-mapping>
    <servlet-name>BuyServlet2</servlet-name>
    <url-pattern>/buy/buy2</url-pattern>
  </servlet-mapping>

  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

初始化顺序

Java代码 过滤乱码字符串 java过滤器代码_Java代码 过滤乱码字符串

主页面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>

  </head>

  <body>
    <h2>这是主页...OKOK</h2>
    <c:url value="/login"/>
    <form action='<c:url value="/login"/>' method="post">
        姓名:<input type="text" name="name"/><br/>
        <input type="submit" value="提交">
    </form>

    <a href='<c:url value="/buy/buy1"/>'>商品1</a>
    <a href='<c:url value="/buy/buy2"/>'>商品2</a>
    <a href='<c:url value="/jsps/a.jsp"/>'>欢迎</a>
  </body>
</html>

/jsps/wel.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>

  </head>

  <body>
  <h2>这是欢迎页面</h2>
        欢迎你,${name}!
  </body>
</html>

/jsps/a.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>
  </head>

  <body>
    <h2>很多贵宾才能看到的商品</h2>
        欢迎你,${name}! <br/>
        <img  src="<c:url value='/imgs/1.png'/>" />   
  </body>
</html>

LoginServlet–登录,未被LoginSecureFilter拦截

package cn.hncu.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

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 {
        String name=request.getParameter("name");
        //....//省略若干行代码(调用service及dao层,到数据库中验证身份)
        request.getSession().setAttribute("name", name);//这里假设验证成功
        System.out.println(request.getContextPath()+"/jsps/wel.jsp");
        response.sendRedirect(request.getContextPath()+"/jsps/wel.jsp");
//      response.sendRedirect(request.getContextPath()+"/index.jsp");
    }

}

BuyServlet1–BuyServlet2同(映射路径为”/buy/buy1”和“/buy/buy2”)

package cn.hncu.servlet;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class BuyServlet1 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 {

        String name = request.getParameter("name");
        PrintWriter p=response.getWriter();
        p.print(name+"访问了buy1");
        p.print("进行购物---调用service层的相应逻辑");//要求必须登录过后才能访问该模块
    }

}

第一次访问主页的filter拦截

Java代码 过滤乱码字符串 java过滤器代码_Java代码 过滤乱码字符串_02


未登录时访问超链接 欢迎

Java代码 过滤乱码字符串 java过滤器代码_System_03


登陆

Java代码 过滤乱码字符串 java过滤器代码_过滤器_04