黑马程序员技术交流社区
标题: 【石家庄校区】web高级编程+oracle数据库 [打印本页]
作者: zhangxuchang 时间: 2018-6-16 11:51
标题: 【石家庄校区】web高级编程+oracle数据库
本帖最后由 小石姐姐 于 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"
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) |
黑马程序员IT技术论坛 X3.2 |