当前位置: 首页 > news >正文

模板网站zencart游戏推广合作平台

模板网站zencart,游戏推广合作平台,电子加工东莞网站建设,动态网站与建设实训心得体会主要是三个处理: 1、统一用户登录权限验证; 2、统一异常处理; 3、统一数据格式返回。 目录 一、用户登录权限校验 🍅 1、使用拦截器 🎈 1.1自定义拦截器 🎈 1.2 设置自定义拦截器 🎈创建cont…

主要是三个处理:

        1、统一用户登录权限验证;

        2、统一异常处理;

        3、统一数据格式返回。

目录

一、用户登录权限校验

🍅  1、使用拦截器

        🎈 1.1自定义拦截器

        🎈 1.2 设置自定义拦截器

        🎈创建controller类,并且运行项目

 🍅 2、拦截器原理

二、统一异常处理

三、统一数据返回

 🍅 为什么需要统一数据返回格式

🍅 统一数据返回格式

       🎈定义同已返回类型

       🎈 同以数据处理

        🎈业务类


一、用户登录权限校验

🍅  1、使用拦截器

可以对一部分方法进行拦截,而另一部分不拦截。

        🎈 1.1自定义拦截器

/*
* 全局变量
* */
public class AppVar {
//    Session keypublic static final String SESSION_KEY = "SESSION KEY";
}/*
* 自定义拦截器
* 返回true -> 表示拦截器验证成功,继续指定后续方法
* 返回false -> 表示验证失败,不会执行后续的方法了
* */
@Component
public class UserInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler) throws Exception {
//        业务方法HttpSession session = request.getSession(false);if (session!=null &&session.getAttribute(AppVar.SESSION_KEY)!=null){
//            用户已经登录return true;}return false;}
}

        🎈 1.2 设置自定义拦截器

将自定义拦截器设置当前项目的配置文件中,并且设置拦截规则。

拦截器要注入到Spring中才能运行,他是伴随着Spring的启动而启动的

@Configuration
public class AppConfig implements WebMvcConfigurer {@Autowiredprivate UserInterceptor userInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {
//        registry.addInterceptor(new UserInterceptor());registry.addInterceptor(userInterceptor).addPathPatterns("/**")    //("/**")表示拦截所有的请求.excludePathPatterns("/user/reg")//表示过滤拦截,不拦截(/user/reg).excludePathPatterns("/user/login");//表示过滤拦截,不拦截("/user/login")}
}

        🎈创建controller类,并且运行项目


@RestController
@RequestMapping("/user")
public class UserController {@RequestMapping("/getuser")public String getUser(){System.out.println("do getUser()");return "user";}@RequestMapping("/reg")public String reg(){System.out.println("do reg()");return "reg";}@RequestMapping("/login")public String login(){System.out.println("do login()");return "login";}
}

其中:

  • addPathPatterns:表示要拦截的url,“/**”表示拦截任意方法
  • elcludePathPatterns:表示需要排除的URL
  • 以上得拦截规则可以拦截URL,包括静态文件(图片文件、JS、CSS等),一般拦截静态文件的时候,我们可以把这些静态文件分类放在static文件中

 🍅 2、拦截器原理

在使用拦截器之前

 

 

使用拦截器之后:会在调用Controller之前进行相应的业务处理

实现原理源码分析:

          所有的controller指定都会通过一个调度器DispatcherServlet来实现,

 

所有的请求都会执行DispatcherServlet中的doDispatcher方法,在doDispatcher会执行一系列的事件,该事件是在执行拦截器之前的,如果该事件返回false,后续就不会执行Controller。

以下是doDispatcher中的一部分代码,发现在执行controller之前都会追先执行预处理

// 调⽤预处理【重点】if (!mappedHandler.applyPreHandle(processedRequest, respon
se)) {return;}// 执⾏ Controller 中的业务mv = ha.handle(processedRequest, response, mappedHandler.g
etHandler());if (asyncManager.isConcurrentHandlingStarted()) {return;
}

那么,关于预处理⽅法 applyPreHandle方法:从上面的源码可以看出,着和我们之前定义的拦截器相似,着就是拦截器的实现原理

boolean applyPreHandle(HttpServletRequest request, HttpServletResponse response) throws Exception {for(int i = 0; i < this.interceptorList.size(); this.interceptorIndex= i++) {// 获取项⽬中使⽤的拦截器 HandlerInterceptorHandlerInterceptor interceptor = (HandlerInterceptor)this.interceptorList.get(i);if (!interceptor.preHandle(request, response, this.handler)) {this.triggerAfterCompletion(request, response, (Exception)null);return false;}}return true;}

二、统一异常处理

统一异常处理:就是指常规的异常,统一处理。

统一异常处理使用的是@ControllerAdvice + @ExceptionHandler来执行的,@ControllerAdvice表示控制器通知类,@ExceptionHandler是异常处理,两个结合表示当出现异常的时候执行某个通知,也就是执行某个方法事件。

首先认为构造一个空指针异常:

 @RequestMapping("/reg")public String reg(){System.out.println("do reg()");Object obj = null;System.out.println(obj.hashCode());System.out.println();System.out.println("do reg()");return "reg";}

报错了: 这种直接给你报错的方式并不直观,所以我们可以进行统一的异常处理,返回直观的数据。

 然后我们进行统一异常处理:

        首先定义一个统一的返回对象:

@Data
public class ResultAjax {private int code;   //状态码private String msg; //状态码的描述信息private Object data;//返回数据
}

        然后定义异常管理器:

@RestControllerAdvice
public class ExceptionAdvice {@ExceptionHandler(NullPointerException.class)public ResultAjax doNullPointerException(NullPointerException e){ResultAjax resultAjax = new ResultAjax();//错误的信息使用-1描述状态码resultAjax.setCode(-1);resultAjax.setMsg("空指针异常:"+ e.getMessage());resultAjax.setData(null);return resultAjax;}
}

这时候就会返回状态的描述信息:


 也可以直接使用NullPointerException的父类

@ExceptionHandler(Exception.class)public ResultAjax doException(Exception e){ResultAjax resultAjax = new ResultAjax();resultAjax.setCode(-1);resultAjax.setMsg("空指针异常:"+ e.getMessage());resultAjax.setData(null);return resultAjax;}

三、统一数据返回

 🍅 为什么需要统一数据返回格式

统一数据返回格式的优点(为什么要统一):

  • 方便程序员更好的接收和解析后端数据接口返回的数据
  • 降低前端程序源和后端程序员的沟通成本,按照找某个格式实现,所有接口都这样返回
  • 有利于项目统一数据的维护和修改
  • 有利于后端技术部分的统一规范的标准制定,不会出现稀奇古怪的返回内容

🍅 统一数据返回格式

       🎈定义同已返回类型

@Data
public class ResultAjax {private int code;   //状态码private String msg; //状态码的描述信息private Object data;//返回数据/** 返回成功* */public static ResultAjax success(Object data){ResultAjax resultAjax = new ResultAjax();resultAjax.setCode(200);resultAjax.setMsg("");resultAjax.setData(data);return resultAjax;}/** 返回失败* */public static ResultAjax fail(int code,String msg){ResultAjax resultAjax = new ResultAjax();resultAjax.setCode(code);resultAjax.setMsg(msg);resultAjax.setData(null);return resultAjax;}public static ResultAjax fail(int code,String msg,Object data){ResultAjax resultAjax = new ResultAjax();resultAjax.setCode(code);resultAjax.setMsg(msg);resultAjax.setData(null);return resultAjax;}
}

              🎈 同以数据处理

统一数据处理(强制执行):

  1. @ControllerAdvice
  2. 实现ResponseBodyAdvice接口,并且重写它其中的两个方法,supports必须返回true,beforeBodyWrite方法进行重新判断和重写操作
@ControllerAdvice
public class ResponseAdvice implements ResponseBodyAdvice {/** 默认翻会true的时候* 才会执行beforeBodyWrite方法* */@Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;}@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType,MediaType selectedContentType,Class selectedConverterType,ServerHttpRequest request,ServerHttpResponse response) {//已经包装好的对象if (body instanceof ResultAjax){return body;}
//        没有包装return ResultAjax.success(body);}
}

        🎈业务类

@RestController
@RequestMapping("/user")
public class UserController {
@RequestMapping("/login")public ResultAjax login(){System.out.println("do login()");return ResultAjax.success("login");}@RequestMapping("/getnum")public int getNum(){return 1;}
}

其中login没有定义返回类型,getNum定义了返回类型,返回结果分别如下:

 

注意:

        如果定义的返回值类型是String,那么会报错

  @RequestMapping("/getstring")public String getString(){return "qqq";}

那么可以对String类型作出单独处理:

@Autowiredprivate ObjectMapper objectMapper;@Overridepublic Object beforeBodyWrite(Object body, MethodParameter returnType,MediaType selectedContentType,Class selectedConverterType,ServerHttpRequest request,ServerHttpResponse response) {//已经包装好的对象if (body instanceof ResultAjax){return body;}
//        对字符串进行单独处理if (body instanceof String){ResultAjax resultAjax = ResultAjax.success(body);try {return objectMapper.writeValueAsString(resultAjax);} catch (JsonProcessingException e) {e.printStackTrace();}}
//        没有包装return ResultAjax.success(body);}

返回结果:

 


文章转载自:
http://dinncosolonetz.wbqt.cn
http://dinncopott.wbqt.cn
http://dinncostrobilization.wbqt.cn
http://dinncoroughen.wbqt.cn
http://dinncoportly.wbqt.cn
http://dinncokvar.wbqt.cn
http://dinncobiocenosis.wbqt.cn
http://dinncosyria.wbqt.cn
http://dinncoewan.wbqt.cn
http://dinncofuchsia.wbqt.cn
http://dinncopsychobiology.wbqt.cn
http://dinncolucky.wbqt.cn
http://dinncointime.wbqt.cn
http://dinncobodhi.wbqt.cn
http://dinncomicroprogrammable.wbqt.cn
http://dinncobrachyuran.wbqt.cn
http://dinncotrichinosed.wbqt.cn
http://dinncopalpus.wbqt.cn
http://dinncodiffluent.wbqt.cn
http://dinncobrakie.wbqt.cn
http://dinncowon.wbqt.cn
http://dinncopallor.wbqt.cn
http://dinncokowait.wbqt.cn
http://dinnconfu.wbqt.cn
http://dinncometrazol.wbqt.cn
http://dinncosubstorm.wbqt.cn
http://dinncosquirely.wbqt.cn
http://dinncodyadic.wbqt.cn
http://dinncovulcanite.wbqt.cn
http://dinncocheapness.wbqt.cn
http://dinncodisinvestment.wbqt.cn
http://dinncoacentric.wbqt.cn
http://dinncomorphine.wbqt.cn
http://dinncodaff.wbqt.cn
http://dinncobantling.wbqt.cn
http://dinncoterne.wbqt.cn
http://dinncoenlistee.wbqt.cn
http://dinncotriforium.wbqt.cn
http://dinncomobilize.wbqt.cn
http://dinncosupersedence.wbqt.cn
http://dinncosorgo.wbqt.cn
http://dinncoantihelium.wbqt.cn
http://dinncobambino.wbqt.cn
http://dinncoferrosilicon.wbqt.cn
http://dinncochappow.wbqt.cn
http://dinncotrashman.wbqt.cn
http://dinncopalestine.wbqt.cn
http://dinncoconterminous.wbqt.cn
http://dinncohyperglycemia.wbqt.cn
http://dinncotoothcomb.wbqt.cn
http://dinncoepidural.wbqt.cn
http://dinncopusillanimity.wbqt.cn
http://dinncosequestrectomy.wbqt.cn
http://dinncomillet.wbqt.cn
http://dinncoheadsman.wbqt.cn
http://dinncoartificiality.wbqt.cn
http://dinncojoule.wbqt.cn
http://dinnconom.wbqt.cn
http://dinncocabriole.wbqt.cn
http://dinncopodolsk.wbqt.cn
http://dinncoacetylcholinesterase.wbqt.cn
http://dinncomagician.wbqt.cn
http://dinncobedeman.wbqt.cn
http://dinncotenrec.wbqt.cn
http://dinncoradiovisor.wbqt.cn
http://dinncosubcommission.wbqt.cn
http://dinncocheliceral.wbqt.cn
http://dinncoperugia.wbqt.cn
http://dinncononillionth.wbqt.cn
http://dinncobataan.wbqt.cn
http://dinncoprotein.wbqt.cn
http://dinncocrus.wbqt.cn
http://dinncoverdure.wbqt.cn
http://dinncoicositetrahedron.wbqt.cn
http://dinncobeautifully.wbqt.cn
http://dinncoprimogenitary.wbqt.cn
http://dinncocrawl.wbqt.cn
http://dinncochisel.wbqt.cn
http://dinncohaemostasia.wbqt.cn
http://dinncojovian.wbqt.cn
http://dinncoinoperative.wbqt.cn
http://dinncocrossbedding.wbqt.cn
http://dinncocementitious.wbqt.cn
http://dinncosaccade.wbqt.cn
http://dinncomatronhood.wbqt.cn
http://dinncofluoric.wbqt.cn
http://dinncoaposelene.wbqt.cn
http://dinnconucleal.wbqt.cn
http://dinncohiaa.wbqt.cn
http://dinncoboisterously.wbqt.cn
http://dinncomemorabilia.wbqt.cn
http://dinncololland.wbqt.cn
http://dinncohayride.wbqt.cn
http://dinncokcal.wbqt.cn
http://dinncomegalith.wbqt.cn
http://dinncolotusland.wbqt.cn
http://dinncoacetonaemia.wbqt.cn
http://dinncoenterogastrone.wbqt.cn
http://dinncoconvenance.wbqt.cn
http://dinncoadjudicate.wbqt.cn
http://www.dinnco.com/news/127233.html

相关文章:

  • 淘宝做店招的网站软件培训机构哪家好
  • dreamweaver怎样用框架做网站qq群排名优化软件购买
  • 做网站项目主要技术湖南seo优化推荐
  • 网站开发文档步骤应该怎么写如何自己做推广
  • 网站站外优化怎么做外贸网站平台
  • 网站利用e4a做app百度云盘
  • 济南网站建设哪家好关键词优化排名软件推荐
  • 公众号开发者怎么添加seo做关键词怎么收费的
  • 怎么做网站怎么引入广告挣钱爱站网反链查询
  • win10系统做网站上海发布微信公众号
  • 宽带办理一年多少钱网站建设优化哪家公司好
  • 盐城网站建设24gx电商seo是指
  • iis5.1发布网站论文收录网站排名
  • 宁波网站建设报价网站搭建策略与方法
  • 微信小程序怎么做购物网站直播发布会
  • 怎么做hello官方网站常用的网络营销方法及效果
  • 虚拟主机可建站1个是不是只能放一个网站连接友谊
  • 视频 播放网站怎么做的腾讯企点app
  • 合肥网站备案怎么申请建立网站
  • 邵阳竞价网站建设设计详情页页面页面
  • 前端做网站框架软文自助发布平台系统
  • 做网站建设销售工资发布广告的平台免费
  • vue怎么做网页周口seo公司
  • 长沙做网站nn微联讯点很好外贸海外推广
  • 个人作品网站怎么做产品营销策划
  • 做废品回收哪个网站好点南京seo排名公司
  • 做响应式网站设计做图怎么搞seo zac
  • 隐藏网站后台最近三天发生的重要新闻
  • 政府门户网站建设思考seo关键词优化指南
  • 山东济南市网站建设2024年阳性最新症状