高档手表网站自己弄一个网站要多少钱
news/
2025/10/7 17:06:34/
文章来源:
高档手表网站,自己弄一个网站要多少钱,做网站单线程CPU和多线程cpu,php网页设计教程拦截器
1 回顾过滤器#xff1a;
Servlet规范中的三大接口#xff1a;Servlet接口#xff0c;Filter接口、Listener接口。
过滤器接口#xff0c;是Servlet2.3版本以来#xff0c;定义的一种小型的#xff0c;可插拔的Web组件#xff0c;可以用来拦截和处理Servlet容…拦截器
1 回顾过滤器
Servlet规范中的三大接口Servlet接口Filter接口、Listener接口。
过滤器接口是Servlet2.3版本以来定义的一种小型的可插拔的Web组件可以用来拦截和处理Servlet容器的请求和响应过程。以便查看提取或以某种方式操作正在客户端与服务器端之间交换的数据。
过滤器的配置比较简单直接实现Filter 接口即可也可以通过WebFilter注解实现对特定URL拦截。Filter 接口中定义了三个方法。 init() 该方法在容器启动初始化过滤器时被调用它在 Filter 的整个生命周期只会被调用一次。「注意」这个方法必须执行成功否则过滤器会不起作用。 doFilter() 容器中的每一次请求都会调用该方法 FilterChain 用来调用下一个过滤器 Filter。 destroy() 当容器销毁 过滤器实例时调用该方法一般在方法中销毁或关闭资源在过滤器 Filter 的整个生命周期也只会被调用一次。
2 拦截器的简介
SpringMVC里的拦截器是面向切面编程AOP的一个具体实现用于对请求做预处理。
1什么是拦截器
在AOPAspect-Oriented Programming中用于在某个方法或字段被访问之前进行拦截然后在之前或之后加入某些操作。拦截是AOP的一种实现策略
2为什么需要拦截器
在做身份认证或者是进行日志的记录时我们需要通过拦截器达到我们的目的。最常用的登录拦截、或是权限校验、或是防重复提交、或是根据业务像12306去校验购票时间,总之可以去做很多的事情
3 拦截器的应用
步骤1)自定义一个类实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter抽象类
步骤2)根据自己的需求重写方法 方法1boolean preHandle()- 想要在执行Controller之前执行拦截就重写该方法。- 存在多个interceptor时它们基于链式方式调用按照注册的先后顺序依次执行。- 方法返回true时后续有拦截器就继续执行拦截器没有就执行controller.- 方法返回false时后续任何内容都不执行了直接返回浏览器
方法2void postHandle()会在Controller执行后视图渲染之前调用该方法。因此可以在这个阶段对将要返回给客户端的ModelAndView进行处理。
方法3void afterCompletion- 该方法会在视图渲染后被调用主要是用来进行资源清理工作。- 多个拦截器时依旧是先执行先注册的拦截器的afterCompletion方法- 不管处理器是否抛出异常该方法都将执行。 步骤3在spring的配置文件中配置拦截器(或者配置类中也可以)
4 拦截器执行流程
4.1 拦截器的执行时机 4.2 拦截器和过滤器一起应用时的执行时机 5 拦截器的应用场景
日志记录记录请求信息的日志以便进行信息监控、信息统计等
权限检查如登录校验在处理器处理之前先判断是否已经登录
性能监控通过拦截器在进入处理器之前记录开始时间在处理完后记录结束时间从而得到该请求的处理时间。
通用行为读取 Cookie 得到用户信息并将用户对象放入请求从而方便后续流程使用。还有如提取 Locale、Theme 信息等只要是多个处理器都需要的都可以用拦截器来实现。
6 当前路径绑定权限拦截器 package com.ssm.netctoss.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 步骤1)自定义一个类实现HandlerInterceptor接口或者继承HandlerInterceptorAdapter抽象类 * 步骤2)根据自己的需求重写方法 * 步骤3在spring的配置文件中配置拦截器(或者配置类中也可以) */ public class CurrentPathPrivilegeInterceptor implements HandlerInterceptor { /** * * param request 请求对象 * param response 响应对象 * param handler 请求路径对应的Controller里的方法对象(反射机制) * /fee/findByPage * public String findByPage(){ * ........ * } * return * throws Exception */ Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println(----------preHandle------------); System.out.println(-------注意需要给每个用户添加0,8,9权限在数据库中-----------); System.out.println(-------注意需要给每个用户添加0,8,9权限在数据库中-----------); System.out.println(-------注意需要给每个用户添加0,8,9权限在数据库中-----------); //获取请求路径 String uri request.getRequestURI(); int currentPrivilege -1; if(uri.contains(/toIndex)){ currentPrivilege 0; }else if(uri.contains(/role/)){ currentPrivilege 1; }else if(uri.contains(/admin/)){ currentPrivilege 2; }else if(uri.contains(/fee/)) { currentPrivilege 3; }else if(uri.contains(/account/)) { currentPrivilege 4; }else if(uri.contains(/service/)) { currentPrivilege 5; }else if(uri.contains(/bill/)) { currentPrivilege 6; }else if(uri.contains(/report/)) { currentPrivilege 7; }else if(uri.contains(/user/show)) { currentPrivilege 8; }else if(uri.contains(/user/toUpdate)) { currentPrivilege 9; } request.getSession().setAttribute(currentPrivilege, currentPrivilege); return true; } Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println(----------postHandle------------); HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); } Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println(----------afterCompletion------------); HandlerInterceptor.super.afterCompletion(request, response, handler, ex); } } 编写导航高亮提示 %taglib prefixc urihttp://java.sun.com/jsp/jstl/core % %taglib prefixfmt urihttp://java.sun.com/jsp/jstl/fmt % div idnavi ul idmenu lia href../index/toIndex classc:choosec:when test${currentPrivilege0}index_on/c:whenc:otherwiseindex_off/c:otherwise/c:choose/a/li lia href../role/findByPage classc:choosec:when test${currentPrivilege1}role_on/c:whenc:otherwiserole_off/c:otherwise/c:choose/a/li lia href../admin/findByPage classc:choosec:when test${currentPrivilege2}admin_on/c:whenc:otherwiseadmin_off/c:otherwise/c:choose/a/li lia href../fee/findByPage classc:choosec:when test${currentPrivilege3}fee_on/c:whenc:otherwisefee_off/c:otherwise/c:choose/a/li lia href../account/findByPage classc:choosec:when test${currentPrivilege4}account_on/c:whenc:otherwiseaccount_off/c:otherwise/c:choose/a/li lia href../service/searchService classc:choosec:when test${currentPrivilege5}service_on/c:whenc:otherwiseservice_off/c:otherwise/c:choose/a/li lia href../bill/bill_list.html classbill_off/a/li lia href../report/report_list.html classreport_off/a/li lia href../user/showUserInfo classc:choosec:when test${currentPrivilege8}information_on/c:whenc:otherwiseinformation_off/c:otherwise/c:choose/a/li lia href../user/toUpdatePwd classc:choosec:when test${currentPrivilege9}password_on/c:whenc:otherwisepassword_off/c:otherwise/c:choose/a/li /ul /div 7 登录拦截 package com.ssm.netctoss.interceptor; import org.springframework.web.servlet.HandlerInterceptor; import org.springframework.web.servlet.ModelAndView; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; /** * 使用拦截器来完成用户是否登录过。 如果没有登录应该跳转到登录页面强制其登录 * * 返回值 * false: 不执行后续的代码包括Controller * true: 执行后续的代码如果有下一个拦截器就执行下一个拦截器的preHandle。如果没有拦截器执行Controller */ public class LoginInterceptor implements HandlerInterceptor { Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { System.out.println(----------LoginInterceptor的preHandle-----------); //获取session从中获取绑定的信息 Object loginAdmin request.getSession().getAttribute(LOGINADMIN); if (loginAdmin null) { //没有登录过就跳转 response.sendRedirect(request.getContextPath()/login/toLogin); return false; } return true; } Override public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception { System.out.println(----------LoginInterceptor的postHandle----------); HandlerInterceptor.super.postHandle(request, response, handler, modelAndView); } Override public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception { System.out.println(----------LoginInterceptor的afterCompletion----------); HandlerInterceptor.super.afterCompletion(request, response, handler, ex); } } 8 权限验证拦截器 package com.ssm.netctoss.interceptor; import com.ssm.netctoss.pojo.Admin; import com.ssm.netctoss.pojo.Privilege; import com.ssm.netctoss.pojo.Role; import com.ssm.netctoss.service.AdminService; import org.springframework.web.servlet.handler.HandlerInterceptorAdapter; import javax.annotation.Resource; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import java.util.HashSet; import java.util.List; import java.util.Set; /** * 登录用户的权限校验拦截 * 比如登录用户只能访问管理员资费账务没有其他权限那么相应的导航栏有的能访问有的不能访问 * * * admin_info ---- admin_role----role_info---role_privilege--privilege_info * caocao 管理员1 100 1 2 3 * 营业员 200 3 4 5 6 * 经理 300 7 */ public class PrivilegeInterceptor extends HandlerInterceptorAdapter { /** * 因为拦截器是运行在Spring容器中维护的。Bean因此可以使用DI注入其他业务层/控制层的各种类型属性 */ // Resource // private AdminService adminService; Override public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception { //获取当前登录用户的所有权限 Admin admin (Admin) request.getSession().getAttribute(LOGINADMIN); //创建一个Set集合用于存储该用户的所有权限(privilegeId,name) SetPrivilege privileges new HashSetPrivilege(); // Privileges实体类要重新hashCode和equals方法 ListRole roles admin.getRoles(); for (Role role : roles) { //添加进集合并去重 privileges.addAll(role.getPrivileges()); } /*从当前的请求路径上获取对应的绑定权限*/ int currentPrivilege (Integer)(request.getSession().getAttribute(currentPrivilege)); /*查看当前路径的绑定权限是否在当前用户的权限集合里如果没有就跳转进行提示*/ for (Privilege privilege : privileges) { if(privilege.getPrivilegeId()currentPrivilege){ return true; } } //如果在循序期间没有遇到return true说明要访问的路径用户是没有该权限的。因此要做一个跳转 response.sendRedirect(request.getContextPath()/login/nopower); return false; } } 注册拦截器 !--注册拦截器: 拦截器的执行顺序与配置的先后有关系。 先配置的先执行-- mvc:interceptors !--配置登录拦截器-- mvc:interceptor mvc:mapping path/**/ mvc:exclude-mapping path/login/login/ mvc:exclude-mapping path/login/getCheckCode/ mvc:exclude-mapping path/login/toLogin/ bean classcom.ssm.netctoss.interceptor.LoginInterceptor/bean /mvc:interceptor !-- 当前路径的权限绑定拦截器 -- mvc:interceptor !-- 需要拦截的各种路径-- mvc:mapping path/**/ !-- mvc:mapping path/login/toIndex/-- !-- mvc:mapping path/login/showUserInfo/-- !-- 不需要拦截的路径-- mvc:exclude-mapping path/login/toLogin/ mvc:exclude-mapping path/login/login/ mvc:exclude-mapping path/login/logout/ !-- 手动配置拦截器的Bean对象 -- bean classcom.ssm.netctoss.interceptor.CurrentPathPrivilegeInterceptor/bean /mvc:interceptor mvc:interceptor mvc:mapping path/**/ mvc:exclude-mapping path/login/*/ bean classcom.ssm.netctoss.interceptor.PrivilegeInterceptor/bean /mvc:interceptor /mvc:interceptors 9 拦截器与过滤器的比较 **①** 拦截器是基于java的反射机制的而过滤器是基于函数回调。 **②** 拦截器不依赖与servlet容器过滤器依赖与servlet容器。 **③** 拦截器只能对action请求起作用而过滤器则可以对几乎所有的请求起作用。 **④** 拦截器可以访问action上下文、值栈里的对象而过滤器不能访问。 **⑤** 在action的生命周期中拦截器可以多次被调用而过滤器只能在容器初始化时被调用一次。 **⑥** 拦截器可以获取IOC容器中的各个bean而过滤器就不行这点很重要在拦截器里注入一个service可以调用业务逻辑。 **⑦ **过滤器和拦截器触发时机、时间、地方不一样 **⑧**过滤器包裹住servletservlet包裹住拦截器。
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/930630.shtml
如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!