专门做网站的公司叫什么,上海外贸,西宁做网站的公司旭云网络,自适应网站制作方案文章目录01 过滤器的简介02 使用过滤器进行乱码解决03 使用过滤器进行登陆的控制04 过滤器更多内容05 监听器实现日志记录06 监听器实现在线人数的统计07 其他监听器使用01 过滤器的简介
为什么使用过滤器#xff1f; 我们目前书写项目中遇到的问题#xff1f; A、目前使用的…
文章目录01 过滤器的简介02 使用过滤器进行乱码解决03 使用过滤器进行登陆的控制04 过滤器更多内容05 监听器实现日志记录06 监听器实现在线人数的统计07 其他监听器使用01 过滤器的简介
为什么使用过滤器 我们目前书写项目中遇到的问题 A、目前使用的baseServlet的优点就是方便可以进行乱码的统一的处理但是如果我们以后不使用servlet,那么我们在进行中文乱码处理的时候就需要在每一个servlet 中去书写但是比较麻烦。 B、在进行登陆拦截处理的时候我们需要把拦截的代码在每一个页面中重复的书写这样就会变的非常的麻烦。 最终的问题 重复的代码在项目中多次的使用书写。 解决方案 过滤器什么是过滤器? 02 使用过滤器进行乱码解决
Class文件
public class EncFilter implements Filter {//初始化方法 --执行一次String abc;Overridepublic void init(FilterConfig filterConfig) throws ServletException {//UTF-8abc filterConfig.getServletContext().getInitParameter(abc);}//服务请求方法---执行多次Overridepublic void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {//到达目标资源之前的处理操作req.setCharacterEncoding(abc);//执行下一个过滤器或者目标资源chain.doFilter(req,resp);//离开服务器之前的处理操作}//销毁--执行一次Overridepublic void destroy() {}web.xml 配置过滤范围
Filtername /Filtername
...03 使用过滤器进行登陆的控制
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain filterChain) throws IOException, ServletException {HttpServletRequest request(HttpServletRequest) req;HttpServletResponse response(HttpServletResponse)resp;Object emp request.getSession().getAttribute(emp);String uri request.getRequestURI();String queryString request.getQueryString();System.out.println(uri--queryString);
if(/sxtoa/login.jsp.equals(uri)||/sxtoa/servlet/EmployeeServlet?methodempLogin.equals(uri?queryString)){filterChain.doFilter(request,response);}else {if(empnull){//用户没有登陆 response.sendRedirect(request.getContextPath()/login.jsp);}else { //直接放行 --执行目标的资源filterChain.doFilter(request,response);}}
}04 过滤器更多内容
问题1多个过滤器执行的顺序怎么确定 的顺序确定执行的顺序 问题2每个请求和响应都要经过过滤器吗 不是是否经过过滤器经过几个过滤器由过滤器的路径来定 /servlet/ / 问题3请求和响应时是不是分别将过滤器代码从头到尾执行一遍 不是请求时执行预处理操作响应时执行后处理操作 请求时过滤器的执行顺序如果是1,2,4响应时过滤器的执行顺序4,2,1 问题4在过滤器中能否跳转到项目的其他任意资源 可以 举例如果一个过滤器是进行权限验证没有登录就不让访问目标资源直接跳转到login.jsp 问题5重定向和转发是否经过过滤器 重定向经过 默认转发不经过因为是服务器端跳转。可以通过配置解决 05 监听器实现日志记录
监听器简介 监听器: 监听事件,处理事件的对象. 使用观察者设计模式实现的. 观察者设计模式: 分为三个角色, 分别是:事件源, 事件, 监听器. 事件: 就是发生的事情, 其中包含事件源 事件源: 发生事情的根源, 触发事件的资源(对象)(发生事件的场所) 监听器: 处理事件的逻辑., 根据事件,获取事件源,并处理事件. Servlet中的监听器 代码实现
public class LogListener implements ServletRequestListener {//监听请求销毁Overridepublic void requestDestroyed(ServletRequestEvent servletRequestEvent) {}//监听请求的发出Overridepublic void requestInitialized(ServletRequestEvent servletRequestEvent) {// XXX 在 XXX时间 访问 程序的XX位置ServletRequest servletRequest servletRequestEvent.getServletRequest();HttpServletRequest request(HttpServletRequest)servletRequest;//获得远程访问的IP地址String ip request.getRemoteAddr();//获得访问的时间String localeString new Date().toLocaleString();//程序的位置 servlet/uu?methodaddString requestURI request.getRequestURI();String queryString request.getQueryString();try {PrintWriter outnew PrintWriter(new FileWriter(D:/log.txt,true));out.println(用户:ip,在:localeString,访问了程序:requestURI?queryString);out.close();} catch (IOException e) {e.printStackTrace();}}
}06 监听器实现在线人数的统计
public class OnLineListener implements HttpSessionListener,HttpSessionAttributeListener {Overridepublic void sessionCreated(HttpSessionEvent httpSessionEvent) {}Overridepublic void sessionDestroyed(HttpSessionEvent httpSessionEvent) {ServletContext application httpSessionEvent.getSession().getServletContext();Integer online (Integer) application.getAttribute(online);if(onlinenull){online0;}else {online--;}application.setAttribute(online,online)}Overridepublic void attributeAdded(HttpSessionBindingEvent httpSessionBindingEvent) {if(emp.equals(httpSessionBindingEvent.getName())){//全局对象ServletContext application httpSessionBindingEvent.getSession().getServletContext();//获得当前的在线人数Integer online (Integer) application.getAttribute(online);if(onlinenull){//当前没人登陆online1;}else {//当前有人登陆online;}//把记录的值重新的设置到applicationapplication.setAttribute(online,online);}}Overridepublic void attributeRemoved(HttpSessionBindingEvent httpSessionBindingEvent) {}Overridepublic void attributeReplaced(HttpSessionBindingEvent httpSessionBindingEvent) {}
}07 其他监听器使用
Override
public void valueBound(HttpSessionBindingEvent httpSessionBindingEvent) {System.out.println(valueBound);
}
Override
public void valueUnbound(HttpSessionBindingEvent httpSessionBindingEvent) {// req.getSession().invalidate();// req.getSession().removeAttribute(emp);System.out.println(valueUnbound);
}
/*** 如果想要实现序列化和反序列化需要在Context.xml中* Manager classNameorg.apache.catalina.session.PersistentManager saveOnRestarttrueStore classNameorg.apache.catalina.session.FileStore directoryE:\apache-tomcat-7.0.79\webapps//Manager如果对象想要实现序列化过程对象上必须实现 Serializable** **/
Override
public void sessionWillPassivate(HttpSessionEvent httpSessionEvent) {System.out.println(sessionWillPassivate);
}
Override
public void sessionDidActivate(HttpSessionEvent httpSessionEvent) { System.out.println(sessionDidActivate);
}