JavaWeb Filter
Filter
Filter的作用:用于登录验证、同一编码处理、敏感字符过滤
步骤:
1.定义一个类,实现接口Filter
2.复写方法
3.配置拦截路径
1)web.xml配置
2)注解配置
拦截路径设置:
1.具体资源路径:/index/jsp
2.拦截目录:/user/*
3.后缀名拦截:.jsp
4.拦截所有资源:/
**拦截方式设置:**在注解中设置dispatcherTypes属性
1.REQUEST:默认值,游览器直接请求资源时拦截
2.FORWARD:转发访问资源
3.INCLUDE:包含访问资源
4.ERROR:错误跳转资源
5.ASYNC:异步访问
登录验证案例
@WebFilter(filterName = "LoginFilter")
public class LoginFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request =(HttpServletRequest)req;//强制类型转换成HttpServletRequest,因为ServletRequest中没有geturl方法
String uri =request.getRequestURI();
if(uri.contains("/login.jsp")||uri.contains("/loginServlet")||uri.contains("/css/"))//排除登录页面的相关资源
{
//包含登录相关请求,放行
chain.doFilter(req, resp);
}
else{
//不包含登录相关请求,需要验证用户是否登录
Object user = request.getSession().getAttribute("user");
if(user !=null){//已登录,放行
chain.doFilter(req, resp);
}else{
//没有登录,跳转登录页面
request.setAttribute("login_msg","您尚未登录,请登录");//设置资源共享,向login_msg传递您尚未登录,请登录
request.getRequestDispatcher("login.jsp").forward(request,resp);
}
}
}
public void init(FilterConfig config) throws ServletException {
}
}
动态代理及敏感词汇过滤案例
动态代理
需要对request对象进行增强以替换request.getparamaters中的数据,使用设计模式来达到增强要求
此处可用的设计模式有两种:
1.装饰模式
2.代理模式:
1)真实对象:被代理的对象
2)代理对象:
3)代理模式:代理对象代理真实对象,以达到增强真实对象功能的目的
代理模式实现方式:
1)静态代理:有一个类文件描述代理模式
2)动态代理:在内存中形成代理类
实现步骤:
1)代理对象和真实对象实现相同的接口
2)代理对象 = Proxy.newProxyInstance();
3)使用代理对象来调用方法。
4)增强方法
代理类实现对被代理类增强的方式:
1.增强参数列表
2.增强返回值类型
3.增强方法体执行逻辑
动态代理增强接口的实例
SaleComputer为接口,Lenovo为实现该接口的实现类,Proxy_Test为动态代理类
给代理对象的invoke方法传递相关参数来实现通过代理对象调用并增强被代理的方法
invoke参数:
1.proxy:被代理的对象,为被代理方法的实现对象
2.method:代理对象调用的方法,被封装为对象
3.args:代理对象调用方法时,传递的实际参数
SaleComputer接口
package web.filter;
public interface SaleComputer {
public String sale(double money);
}
Lenovo类用于实现SaleComputer接口
package web;
import web.filter.SaleComputer;
public class Lenovo implements SaleComputer{
@Override
public String sale(double money) {
return null;
}
}
Proxy_Test动态代理类
public class ProxyTest {
public static void main(String[] args) {
//1.创建真实对象
Lenovo lenovo = new Lenovo();
//2.动态代理增强lenovo对象
//三个参数:
/*1.类加载器:真实对象.getClass().getClassLoader()
2.接口数组:真实对象.getClass().getInterfaces()
3.处理器:new InvocationHandler()
* */
SaleComputer proxy_lenovo =(SaleComputer)Proxy.newProxyInstance(lenovo.getClass().getClassLoader(), lenovo.getClass().getInterfaces(), new InvocationHandler() {
//invoke为代理逻辑编写的方法,代理对象调用所有的方法都会触发该方法,其中填写增强代码的逻辑
// invoke参数:
// 1.proxy:被代理的对象
// 2.method:代理对象调用的方法,被封装为对象
// 3.args:代理对象调用方法时,传递的实际参数
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
//1.增强参数
//1.1判断是否为sale方法
if(method.getName().equals("sale")){
double money =(double) args[0];
money = money*0.85;
//1.2修改参数并传递到invoke,调用真实对象的该方法
Object obj = method.invoke(lenovo,money);
return obj;
//2增强返回值
// String obj =(String)method.invoke(lenovo,money);
//return obj+"鼠标垫";
}else{
Object obj = method.invoke(lenovo,args );
return obj;
}
}
});
String conputer = proxy_lenovo.sale(8000);//调用代理的方法
}
}
敏感词汇过滤案例
创建SensitiveWordsFilter类实现对ServletRequest方法的增强,调用任意Servlet都能有增强(即过滤)的效果
@WebFilter(filterName = "SensitiveWordsFilter")
public class SensitiveWordsFilter implements Filter {
public void destroy() {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
//1.创建代理对象,增强getParamete方法
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 {
//增强getParameter方法
//判断是否是getParameter方法
if(method.getName().equals("getParameter")){
//增强返回方法
//获取返回值
String value = (String) method.invoke(req,args);
if(value!=null){
for(String str:list){
if(value.contains(str)){
value = value.replaceAll(str,"***");
}
}
}
return value;
}
return method.invoke(req,args);
}
});
chain.doFilter(proxy_req, resp);
}
private List<String> list = new ArrayList<String>();
public void init(FilterConfig config) throws ServletException {
//1.获取文件真实路径加载文件
try{
ServletContext servletContext = config.getServletContext();
String realPath = servletContext.getRealPath("/WEB-INF/classes/敏感词汇.txt");
BufferedReader br =new BufferedReader(new FileReader(realPath));
String line =null;
while ((line = br.readLine())!=null){
list.add(line);
}
br.close();
System.out.println(list);
}catch (Exception e){
e.printStackTrace();
}
}
}