本帖最后由 小石姐姐 于 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"
|