一.登录
@WebFilter("/*")
public class Filterlogin implements Filter {
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
HttpServletRequest request = (HttpServletRequest) req;
String uri = request.getRequestURI();
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&& user !=""){
chain.doFilter(req,resp);
}else {
request.setAttribute("login_msg","您还没有登录!");
request.getRequestDispatcher("login.jsp").forward(request,resp);
}
}
}
1.因为 ServletRequest 没有 getRequestURI方法 所以需要强转为 HttpServletRequest 对象
2.包含登录操作 css js 的请求跳过过滤 然后判断有没有session
二.过滤敏感词汇
1.代理设计模式 类似python 装饰器 ,给方法 加一些功能
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain){}
原来的 req中的 getparams 方法没有过滤的功能 所以可以用 代理模式对它加强
1.ServletRequest proxy_req = Proxy.newProxyInstance (
req.getClass().getClassLoader(), req.getClass().getInterfaces(), new InvocationHandler() { 匿名内部类重写}
固定的 普通对象的类加载器 普通对象的接口 实现接口
2.重写方法:
list 集合中存放的是 敏感词汇
@Override
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
if(method.getName().equals("getParameter")){ 增强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);} 如果不是这个方法 就照样执行
参数 method 就是req对象中的所有方法 args 就是req方法中的所有参数
method.invoke(req, args) 执行真正的原来的方法 req 为方法的对象
Listener:监听器
1.概念:web的三大组件之一
1.事件监听机制: 1.事件:一件事情 2.事件源 :事件发生的地方 3.监听器 :一个对象
4.注册监听:将事件、事件源、监听器绑定在一起。 当事件源上发生某个事件后,执行监听器代码
2.ServletContextListener: 监听ServletContext对象的创建和销毁
* 方法:1. void contextDestroyed(ServletContextEvent sce) : ServletContext对象被销毁之前会调用该方法
2. void contextInitialized(ServletContextEvent sce) : ServletContext对象创建后会调用该方法
3.步骤:
1. 定义一个类,实现ServletContextListener接口 2. 复写方法
3. 配置 1. web.xml 2. 注解: @WebListener 两个都要
@WebListener
public class ContextLoaderListener implements ServletContextListener {
@Override 在服务器启动后自动调用
public void contextInitialized(ServletContextEvent servletContextEvent) {
加载资源文件
1.获取ServletContext对象
ServletContext servletContext = servletContextEvent.getServletContext();
2.加载资源文件
String contextConfigLocation = servletContext.getInitParameter("contextConfigLocation");
3.获取真实路径
String realPath = servletContext.getRealPath(contextConfigLocation);
4.加载进内存
try{
FileInputStream fis = new FileInputStream(realPath);
System.out.println(fis);
}catch (Exception e){
e.printStackTrace();
}
System.out.println("ServletContext对象被创建了。。。");
}
@Override 在服务器关闭后,ServletContext对象被销毁。当服务器正常关闭后该方法被调用
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("ServletContext对象被销毁了。。。");
}}