JavaEE核心技术之Filter案例

案例一:登录验证

需求

1. 访问项目案例的资源。验证其实是否登录、
2. 如果登录直接放行
3. 如果没有登录,则会跳转到登录页面,提示“您尚未登录,请先登录”。

Filter代码

package cn.itcast.web.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import javax.servlet.http.HttpServletRequest;
import java.io.IOException;

/**
 * 登录验证的过滤器
 */
@WebFilter(urlPatterns = "/*")
public class LoginFilter implements Filter {


    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {

        HttpServletRequest request = (HttpServletRequest) req;


        //1. 资源亲求路径
        String uri = request.getRequestURI();

        //2. 判断是否包含相关的路径,要注意排除掉 css/js/图片/验证码资源

        if (uri.contains("/login.jsp") || uri.contains("/loginServlet") || uri.contains("/css/") || uri.contains("/js/") || uri.contains("/fonts/") || uri.contains("/checkCodeServlet")) {
            //包含登录页的信息,放行
            chain.doFilter(req, resp);
        }else {
            //不包含登录页的信息,判断是否已经登录
            //获取session对象
            Object user = request.getSession().getAttribute("user");


            if (user != null) {
                //登陆了,放行
                chain.doFilter(req, resp);

            }else{
                request.setAttribute("login_msg","您尚未登录,请登录!");
                System.out.println(request.getAttribute("login_msg"));
                request.getRequestDispatcher("/login.jsp").forward(request,resp);
            }
        }
  }

    @Override
    public void init(FilterConfig config) throws ServletException {

    }

    @Override
    public void destroy() {
    }

}

案例二:敏感词过滤

需求

1. 对案例录入的数据进行敏感词过滤
2. 敏感词参考《敏感词.txt》
3. 如果为敏感词,则替换为 ***

分析

1. 对request对象进行增强。增强获取参数相关参数
2. 放行。传递代理对象。

增强对象的功能

代码

package com.web.filter;

import javax.servlet.*;
import javax.servlet.annotation.WebFilter;
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.lang.reflect.InvocationHandler;
import java.lang.reflect.Method;
import java.lang.reflect.Proxy;
import java.util.ArrayList;
import java.util.List;

/**
 * 敏感词汇过滤器
 */
@WebFilter(urlPatterns = "/*")
public class SensitiveWordsFilter implements Filter {


    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        //1.获取代理对象,增强getParameter方法

        ServletRequest proxy_req = (ServletRequest)Proxy.newProxyInstance(req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() {
            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
                //增强getParamter方法
                //判断是否为getParamter方法
                if (method.getName().equals("getParamter")){
                    //增强返回值
                    //获取返回值
                    String value = (String)method.invoke(req,args);
                    if (value!=null){
                        for (String str:list) {
                            if (value.contains(str)) {
                                value.replaceAll(str,"****");
                            }
                        }
                    }
                    return value;
                }

                //判断方法名是否是 getParameterMap

                //判断方法名是否是 getParameterValue
                return method.invoke(req,args);
            }
        });
        //2.放行
        chain.doFilter(proxy_req, resp);
    }
    private List<String> list = new ArrayList<String>();//敏感词汇集合

    @Override
    public void init(FilterConfig config) throws ServletException {
        try {
            //1.加载文件
             ServletContext servletContext = config.getServletContext();
             String realPath = servletContext.getRealPath("/WEB-INF/classes/敏感词汇.txt");

            //2.读取文件
            BufferedReader br = new BufferedReader(new FileReader(realPath));

            //3.将文件的每一行数据设置或者添加到list中
            String line = null;
            while((line =br.readLine())!=null){
                list.add(line);
            }

            br.close();
            System.out.println(list);

        } catch (Exception e) {
            e.printStackTrace();
        }

    }

    @Override
    public void destroy() {
    }

}

设计模式

	一共23种,一些通用的解决问题的方式。

装饰模式

代理模式

概念

1. 真实对象:被代理的对象 (下图背景北京的代理商)
2. 代理对象:(下图西安卖电脑的)
3. 代理模式:代理对象代理真实对象,达到增强真实功能的目的。

实现方式

1. 静态代理:有一个类文件描述代理模式

2. 动态代理:在内存中来形成代理类
	*实现步骤
		1.  代理对象和真实对象实现相同的接口
		2. 代理对象 = proxy.newProxyInstance();
		3. 使用代理对象来调用方法。
		4. 增强方法

	*增强方式:
		1. 增强参数列表
		2. 增强返回值类型
		3. 增强方法体执行逻辑
package cn.itcast.proxy.impl;

import cn.itcast.proxy.SaleComputer;

import java.lang.reflect.*;

public class ProxyTest {
    public static void main(String[] args) {
        //1.创建真实的对象
        Lenovo lenovo = new Lenovo();

        //2. 动态代理增强lenovo方法
        /*
        * 三个加载器:
        *       1.真实对象.getClass().getClassLoader()  --类加载器
        *       2.接口数组:真实对象.getClass().getInterfaces()   --保证代理对象和真实对象实现的接口
        *       3.处理器:new InvocationHandle()  --核心业务逻辑的处理
        * */
        SaleComputer proxy_lenovo = (SaleComputer) Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() {

           /*
           * 代理逻辑编写的方法:
           *        代理对象调用的多有方法都会出发该方法执行
           *       参数:
           *        1.proxy:代理对象
           *        2.method:代理对象调用方法
           *        3.args:代理对象调用的方法时,传递的实际参数
           *
           * */

            @Override
            public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
/*                System.out.println("该方法执行了。。。");
                System.out.println(method.getName());
                System.out.println(args[0]);*/


                if (method.getName().equals("sale")) {
                    //1. 增强参数
                    double money = (double) args[0];
                    money = money*0.85;

                    System.out.println("专车接你。。。");
                    //使用真实对象调用方法
                    String obj = (String) method.invoke(lenovo, money);
                    System.out.println("免费送货。。。");
                    //增强返回值
                    return obj+"_鼠标垫";

                }else{

                    //使用真实对象该方法
                    Object obj = method.invoke(lenovo, args);
                    return obj;
                }
            }
        });

        //调用方法
        String computer = proxy_lenovo.sale(7000);
        System.out.println(computer);
        proxy_lenovo.show();
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值