A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

本帖最后由 小石姐姐 于 2018-6-21 16:25 编辑

web高级编程+反向代理+服务器集群

过滤器Filter
1.1.Filter的声明周期
    * 创建:服务器启动的时候.
    * 销毁:服务器关闭的时候.
1.2.过滤器的概述
    Filter:可以过滤从客户端向服务器发送的请求.
1.3.使用场景
    1.可以做很多事情
    2.安全框架
    3.进行IP的过滤,脏话过滤,自动登录,响应压缩...
2.1.Filter(java_ee_api)
* 有三个方法
    * void destroy()  :服务器停止的之后执行一次该方法
    * voiddoFilter(ServletRequest request, ServletResponse response, FilterChainchain)  
            * 过滤器一拦截资源就执行该方法
            * 业务操作写在这个方法中
    * voidinit(FilterConfig filterConfig)  :服务器启动时,调用一次该方法用于初始化
2.2.Filter的使用:
* 1.使用创建一个类实现Filter接口
    * 重写doFilter
    * 将执行的业务逻辑写在这个方法中
* 2.在web.xml中配置
   
* <filter-class>Filter实现类的全名
* <url-pattern>被拦截资源的绝对路径 ---------当访问这个资源时过滤器就会
* <init-param>
   <param-name>初始化参数名</param-name>
   <param-value>初始化参数值</param-value>
  </init-param>
例:
  <filter>
    //配置Filter
    <filter-name>自定义</filter-name>
    <filter-class>Filter实现类的全名</filter-class>
    //配置初始化参数
     <init-param>
        <param-name></param-name>
        <param-value></param-value>
     </init-param>
     
  </filter>
  //配值映射
  <filter-mapping>
    <filter-name>自定义名字</filter-name>
    <url-pattern>被拦截资源的绝对路径</url-pattern>
  </filter-mapping>
3.FilterConfig 获取初始化参数的类
     String getFilterName()
              
     String getInitParameter(String name)
              
     Enumeration getInitParameterNames()
              
     ServletContext getServletContext()  ------重要
        **获得一个ServletContext对象.
        **在Filter中只能通过该方法获取ServletContext对象
        **用于获取服务器初始化时配置的一些参数
    3.2在Filter中获取ServletContext中的公共属性的方法
        **filterConfig.getServletContext().getAttribute("xx");
        ** 使用方法
4.FilterChain 链(只有一个方法)
    4.1 voiddoFilter(ServletRequest request, ServletResponse response)  
        * 导致链中的下一个过滤器被调用,如果调用的过滤器是链中的最后一个过滤器,则导致调用链末尾的资源。
        *  放行,放行到下一个过滤器中,如果没有下一个过滤器,到达目标资源.
    4.2为什么有过滤器链?
        * 在Fliter中只要可以匹配到url-pattern,就会执行Filter,因此才有了过滤器链.
        * 区别于Servlet,Servlet每次只会匹配一个url-pattern,
    4.2过滤器链的执行顺序
        * 跟在web.xml中的<url-pattern>的配置顺序有关
        * 假定有三个过滤器 f1 , f2 , f3 , 依次配置
        程序执行过程:(分文两部分执行)
            请求:   请求端 ->f1 ->f2->f3 -> 服务器 (请求时执行chain.doFilter上边的代码)
            响应:   请求端<-f1 <-f2<-f3 <-  服务器 (响应时执行chain.doFilter下边的代码)
            
        
    4.3 链的创建
    4.4匹配路径<url-pattern>
        三种:
            * 完全路径匹配   : /文件夹名/文件名
            * 目录匹配       : /文件夹名字/*
            * 扩展名匹配     : /*.do
            
*/
    4.5 设置过滤器专门用于拦截Servlet
        1.第一种方法:
        <servlet-name>Servlet的名字</servlet-name>专门用于拦截Servlet
            用法:替换掉过滤器配置的<url-pattern></url-pattern>
        2.第二种方法:
            将<url-pattern>设置为要拦截的servlet的绝对路径
        <url-pattern>/Servlet</url-pattern>
        
        
    4.6 <dispatcher>的配置  : Filter过滤器默认不过滤服务器内的转发,
                              如果要拦截转发就需要配置<dispatcher>
            * REQUEST   :默认值.  
            * FORWARD   :转发. //拦截服务器内的转发
            * INCLUDE   :包含. //拦截获取的包含页面
            * ERROR     :错误页面跳转.(全局错误页面)  // 就是自己配置的错误跳转页面
            
        4.6.1.dispatcher的配置位置
        
            * 在拦截路径的mapping中配置dispatcher
            * 可以配置多个dispatcher,实现更多的功能
        例:
            //在拦截路径的mapping中配置dispatcher
             <filter-mapping>
            
                <filter-name></filter-name>
                <url-pattern></url-pattern>
                //可以配置多个dispatcher,实现更多的功能
                <dispatcher>ERROR</dispatcher>
                <dispatcher>FORWARD</dispatcher>
               
             </filter-mapping>
        
5.使用Filter实现自动登录:
* 核心:1.在服务器或过滤器中设置session,将用户的登录信息(用户名,密码,等用户信息)封装到user对象存入session
         session作为域对象可以在浏览器端拿到,在浏览器端通过判断session中是否有用户信息是否登录的依据判断.
       2.将登陆成功登陆的用户的用户名和密码存入cookie保存到浏览器,当下次用户登录时,使用过滤器拦截请求判断
         是否有session信息,没session信息但是有cookie信息时,就验证cooki中的用户信息,如果信息正确,就将该用户的
         所有信息封装为对象,存入session中然后放行,这样跳转到页面上时,页面就会获取session中用户信息,将信息展示到
         页面中.
* 自动登录的案例在web技术中
6.(通用的字符集编码的过滤器)HttpServletRequest增强类结合Filter过滤器实现request的通用解码
* 核心: 使用过滤器将请求信息先拦截,将请求中的ServletRequest更换为增强的ServletRequest(可以自动进行解码)
* 思想: 通过设置过滤器在过滤器中更换ServletRequest可以使所有的servlet避免请求乱码的问题,
        也提高了代码的复用性(之前每个servlet都要处理乱码).对于大批量重复的操作,要对其进行向上抽取.
* 实现步骤:
    1.继承HttpServletRequestWrapper(它是java_ee_API提供的ServletRequest的一个模板类,实现了ServletRequest类所有的方法)
      并创建有参构造函数
    2.重写它的getParameter(String name);方法
    3.在过滤其中将ServletRequest的request对象向下转型为HttpServletRequest 的对象
    4.创建增强类将HttpServletRequest对象作为参数传入
    5.将增强类的对象作为chain.doFilter的参数放行到服务器或下一个链;
7.增强类或接口的方法(三种)
* 继承      :控制这个类构造. (找不到实现类,因此不能用)
* 装饰者模式    :增强的类和被增强类实现相同的接口,增强的类中获得到被增强的类的引用.
      缺点      :接口中方法太多.
* 动态代理  :被增强的类实现接口就可以.
***************************************************************************
动态代理 Proxy
#动态代理
代理的分类:
1.静态代理(类似于装饰者模式)
2.动态代理(jdk提供的代理,接口代理)
3.Cglib代理(基于继承的方式实现)
多态的概念??
1.增强一个类的三种方法
    * 继承  :能够控制这个类的构造.
    * 装饰者    :增强的类和被增强的类实现相同的接口,增强的类中获得到被增强的类的引用.
            ** 接口中方法过多,只增强其中的某个方法.其他的方法也需要重写.
    * 动态代理:被增强的类实现了接口.
2.
    * 可以实现类本身的方法还能增强这个类
3.JDK中动态代理 :Proxy对象.
    *)Proxy.newProxyInstance(ClassLoader cl,Class[] interfaces,InvocationHandler ih);
        **三个参数:
            * ClassLoadercl       :类加载器(在那个类中写代码就用哪个类的类名获取类的加载器)
            * Class[]interfaces   :被增强对象所实现的所有接口
            * InvocationHandlerih :处理类(一个接口,需要自己去实现)
                1.直接使用该接口的匿名内部类
                2.创建类实现这个接口,把实现类的对象作为参数
        例:
            ClassLoaderclassLoader = ProxyDemo1.class.getClassLoader();
            Class[]interfaces = waiter.class.getIn
    *) InvocationHandler 接口
        **方法:
        * Objectinvoke(Object proxy, Method method, Object[] args)  
            *三个参数:
                *proxy  :产生代理对象的引用(当调用invoke方法时,就会传进该代理的引用).
                * method :当前正在调用的方法
                * args   :正在执行中的方法的参数
3.1.动态代理的实现:
    * 创建一个类
    * 在类中创建被增强类的对象
    * 通过Proxy.newProxyInstance(ClassLoader cl,Class[] interfaces,InvocationHandler ih);获取代理对象
        * 其中InvocationHandler类的实体通过匿名内部类的形式获取,再改匿名内部类中对被增强类的方法进行增强
    * 调用代理对象的方法
3.2.类加载器的获取方式的区别
    * 接口名.getInterface: 只能拿到它所继承的接口的方法
        
    * 对象.getInterface    : 它可以拿到这个类实现的所有接口的方法
waiter2是waiter的代理对象,它俩是兄弟关系
4.框架中的代理叫通知:
    前置通知: 业务前去执行
    后置通知: 业务后去执行
    环绕通知: 业务前后去执行
5.扩展(代理的一些应用):
    1.计算代码执行时间
    2.日志:可通过代理的技术去实现
6.代理的企业应用:
【Spring的AOP】
    *AOP的底层使用的就是代理机制:
        * AOP:面向切面编程.新的思想,用来解决OOP中遇到的一些问题!!!
              ** OOP面向对象编程
7.spring是通过配置完成代理的,不需要写代理
    * spring的两大核心:
        * IOC
        * AOP
    * spring boot: spring技术的全家桶(在spring的基础上再次进行了封装)
*******************************************************************************
Linux
Linux目录
bin :   存二进制可执行文件
etc :   存系统配置文件
usr :   存放共享的系统资源
home:  存放用户文件根目录
root   :  超级管理员用户名目录
dev :  用户存放设备文件
boot   :  存放系统引导
命令:
cd - 回到上一个路径
ls [-a]  查询所有文件
cat 查看文件
less 查看文件
tail [-行数] [-f 时刻动态加载]  显示后指定行数信息
more 查看文件
rm [-f 不询问直接·删除文件]
tar 压缩或解压
-C 指定路径操作文件
-c 创建压缩文件
-x 解压tar文件
-f(一般在参数最后显示) 压缩解压指定文件
扩展名:
.tar   仅仅把多个文件合成一个文件,没有压缩
.gz   真正压缩过的
grep 搜索字符串 文本文件 --color -A(显示搜索结果前几行记录) -B(显示搜索结果后几行记录)
wget 下载链接地址(必须保证是下载链接直接地址)
管道:
ps -ef | grep 指定内容
逻辑控制:
命令1&& 命令2
如果命令1 执行成功后,命令2才会执行
Linux隐藏文件
以 . 开头的文件都是隐藏文件
VIM
插入模式:
i   :在光标位置开始插入字符
shitf+i:在行首插入
shift+o:在当前行上一行插入字符
o   :在当前行的下一行插入字符
shift+a:在当前行尾插入
a   :
命令模式:
esc :退出编辑模式,返回命令模式
:wq :保存并推出
:q! :保存不推出
q 不保存退出,!强制退出
文本操作:
低行模式:
:wq
:q!
dd  :删除当前行
p   :粘贴
yy  :复制
重定向
>   把执行结果输出到制定文件中,如果文件存在覆盖
>>  往制定文件中追加内容
Linux基本操作
管理网卡:
ifconfig eth(网卡编号) (up|down)
设置时间:
date -s"yyyy-mm-dd 时:分:秒'
显示磁盘中的信息:
df [-h]
显示内存状态
free [-m] 以mb为单位
动态显示进程信息:
top
结束进程:
kill [-9(强制杀死进程))] (PID)
显示文件大小
du [-h]
显示当前用户登录信息:
who
修改主机名:
hostname
/etc/sysconfig/network
显示系统信息:
uname
Linux的用户和组:
useradd 添加用户
useradd 用户名[-d 用户存放路径]
useradd 用户名[-d用户存放路径] [-g 组名]
passwd 用户名
userdel 用户名
[-r ] 删除用户名时删除Home下问文件
ssh
ssh -l 用户名 -p 端口号 IP地址
groupadd 组名
id命令:
查看用户一些信息
su命令:
/etc/passwd 用户文件
/etc/shadow 密码文件
Linux权限命令:
Linux文件类型:
-  开头,文件
d  开头,目录
l  开头,链接
三部分
-          rwxr            rwxr        --
[文件类型] 用户权限        组权限  其他用户权限
文件权限管理:
三种权限:
chmod u=用户权限,g=组权限,o=其他权限  文件
改变所属组或所属用户:
chown [-R目录下所有文件/文件夹都生效] (所属用户[:组名]) 文件
*****************************************************************************
Nginx
Nginx
目的是为了减轻服务器压力,控制多台服务器,让多台服务器一起运行
正向代理:
客户端 -> 代理服务器 -> 目标服务器
配置Nginx:
修改/nginx/conf/nginx.conf
Session共享问题:
1.
使用tomcat广播机制
ip_hash   算法
2.
使用radis缓存机制,把Session信息放在radius中
修改Tomcat端口:
1.修改关闭端口:
prot='8006'shutdown="SHUTDOWN"
2.修改服务器端口:
prot="8081"
把修改后的服务器端口添加到防火墙
3.修改AJP下的端口:
prot="8010"


0 个回复

您需要登录后才可以回帖 登录 | 加入黑马