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

摄影作品欣赏网站推荐wordpress商城查件

摄影作品欣赏网站推荐,wordpress商城查件,广东东莞新增本土确诊0例,wordpress数据库字段文章目录 前言一.用户登录权限校验1.1 spring 拦截器1.2 传统的用户登录权限验证1.3 使用拦截器的方式1.4 案例1.5 拦截器实现原理 三.统一异常处理3.1 什么是统一异常处理3.2 具体步骤 四.统⼀数据返回格式4.1 为什么需要统一的数据返回4.2 统一返回数据的格式4.3 统一移除处理… 文章目录 前言一.用户登录权限校验1.1 spring 拦截器1.2 传统的用户登录权限验证1.3 使用拦截器的方式1.4 案例1.5 拦截器实现原理 三.统一异常处理3.1 什么是统一异常处理3.2 具体步骤 四.统⼀数据返回格式4.1 为什么需要统一的数据返回4.2 统一返回数据的格式4.3 统一移除处理在遇到 String 返回返回时报错的问题 前言 前面一篇文章,我们具体学习了,springAOP相关概念,我们再具体的回忆一下,什么是springAOP其实就是统一功能的实现.下面我们将利用AOP的思想,去实现三个功能. 一.用户登录权限校验 ⽤户登录权限的发展从之前每个⽅法中⾃⼰验证⽤户登录权限到现在统⼀的⽤户登录验证处理它是⼀个逐渐完善和逐渐优化的过程。 我们不使用AOP的思想,我们之前做登录验证校验的过程是: 1.1 spring 拦截器 在介绍用户登录的权限验证之前,我们需要介绍一下,spring的拦截器的实现步骤. 对于以上问题Spring 中提供了具体的实现拦截器:HandlerInterceptor拦截器的实现分为以下两个步骤∶ 创建自定义拦截器实现 HandlerInterceptor 接口的preHandle (执行具体方法之前的预处理)方法。将自定义拦截器加入 WebMvcConfigurer的 addInterceptors方法中。 具体实现如下。 我下面给出一个简单的demo 1.创建自定义拦截器,实现HandlerInterceptor接口 Component public class MyInterceptor implements HandlerInterceptor {Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println(preHandle方法被调用);return true;}Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println(postHandle方法被调用);}Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println(afterCompletion方法被调用);} } 2.将自定义拦截器加入 WebMvcConfigurer的 addInterceptors方法中。 Configuration EnableWebMvc public class WebMvcConfig extends WebMvcConfigurerAdapter {Autowiredprivate MyInterceptor myInterceptor;Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(myInterceptor); // 将拦截器注册到 Spring 容器中} } 1.2 传统的用户登录权限验证 具体代码入下: RestControllerRequestMapping(/user)public class UserController {/*** 某⽅法 1*/RequestMapping(/m1)public Object method(HttpServletRequest request) {// 有 session 就获取没有不会创建HttpSession session request.getSession(false);if (session ! null session.getAttribute(userinfo) ! null) {// 说明已经登录业务处理return true;} else {// 未登录return false;}}RequestMapping(/m2)public Object method2(HttpServletRequest request) {// 有 session 就获取没有不会创建HttpSession session request.getSession(false);if (session ! null session.getAttribute(userinfo) ! null) {// 说明已经登录业务处理return true;} else {// 未登录return false;}}// 其他⽅法...}从上述代码可以看出每个⽅法中都有相同的⽤户登录验证权限它的缺点是 每个⽅法中都要单独写⽤户登录验证的⽅法即使封装成公共⽅法也⼀样要传参调⽤和在⽅法中 进⾏判断。添加控制器越多调⽤⽤户登录验证的⽅法也越多这样就增加了后期的修改成本和维护成本。这些⽤户登录验证的⽅法和接下来要实现的业务⼏何没有任何关联但每个⽅法中都要写⼀遍。 所以提供⼀个公共的 AOP ⽅法来进⾏统⼀的⽤户登录权限验证迫在眉睫。 1.3 使用拦截器的方式 具体步骤如下: 创建自定义拦截器实现 HandlerInterceptor 接口的preHandle (执行具体方法之前的预处理)方法。 /* 拦截器的自定义实现*/ Component public class LoginInterceptor implements HandlerInterceptor {//调用目标方法之前执行的方法//此方法返回boolean 类型的值,如果返回true 表示拦截成功,继续执行目标方法//如果返回false,表示拦截执行失败,检验未通过,目标方法不执行.Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {//用户登录判断业务HttpSession sessionrequest.getSession(false);if (session !null session.getAttribute(seesion_userinfo) !null){return true;}response.setContentType(application/json;charsetutf8);response.getWriter().println({\code\:-1,\msg\:\登录失败\,\data\:\\});return false;} }将自定义拦截器加入 WebMvcConfigurer的 addInterceptors方法中。 Configuration public class MyConfig implements WebMvcConfigurer {Autowiredprivate LoginInterceptor loginInterceptor;Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns(/**).excludePathPatterns(/user/login)} }1.4 案例 知道了具体的拦截器练习之后,我们接下来会进行一个案例的练习 登录拦截器 具体的效果如下 1.登录、注册页面不拦截其他页面都拦截。 2.当登录成功写入 session 之后拦截的页面可正常访问 先准备一个前端登录页面 !DOCTYPE html html langen headmeta charsetUTF-8titleLogin/title /head body form action/user/login methodgetlabel forusernameUsername:/labelinput typetext idusername nameusername requiredbrlabel forpasswordPassword:/labelinput typepassword idpassword namepassword requiredbrbutton typesubmitLogin/button /form /body /html 准备UserMapper.xml文件和接口类 ?xml version1.0 encodingUTF-8? !DOCTYPE mapper PUBLIC -//mybatis.org//DTD Mapper 3.0//EN http://mybatis.org/dtd/mybatis-3-mapper.dtd mapper namespacecom.example.demo.mapper.UserMapper select idlogin resultTypecom.example.demo.entity.UserInfoselect * from userinfo where username#{username} /select /mapperMapper public interface UserMapper {UserInfo login(Param(username) String username); }准备Service层代码 Service public class UserService {Autowiredprivate UserMapper userMapper;public UserInfo login(String username){return userMapper.login(username);} } 编写Controller层代码 RestController RequestMapping(/user) public class UserController {Autowiredprivate UserService userService;RequestMapping(/index)public String index(){return index;}RequestMapping(/reg)public String reg(){return login;}RequestMapping(/login)public String login(String username, String password , HttpServletRequest request) {//1.进行非空校验if ( !StringUtils.hasLength(password) ||!StringUtils.hasLength(username)){return 参数有误;}UserInfo userInfouserService.login(username);if (userInfo null || userInfo.getId() 0)return 用户名或密码输入错误;if (!password.equals(userInfo.getPassword()))return 用户名或密码输入错误;HttpSession sessionrequest.getSession();session.setAttribute(userinfo,userInfo);return {\code\:\200\,\message\:\登录成功\};}}编写实体类 Data public class UserInfo {private int id;private String username;private String password;private String photo;private LocalDateTime createtime;private LocalDateTime updatetime;private int state; }最后启动springboot项目就可以了 1.5 拦截器实现原理 我们先来看程序正常的执行流程. 这边是有了拦截器之后的流程 看完了上面的具体流程以后,我们来具体的说明一下流程. 在SpringMVC中拦截器可以通过实现HandlerInterceptor接口来实现。当请求到达时SpringMVC会先通过HandlerMapping找到对应的Controller,然后再通过HandlerAdapter找到对应的处理方法。在这个过程中如果有拦截器实现了HandlerInterceptor接口并重写了preHandle()方法那么这个方法会在Controller和处理方法之前被调用。 三.统一异常处理 3.1 什么是统一异常处理 统⼀异常处理使⽤的是 ControllerAdvice ExceptionHandler 来实现的ControllerAdvice 表 示控制器通知类ExceptionHandler 是异常处理器两个结合表示当出现异常的时候执⾏某个通知也就是执⾏某个⽅法事件 3.2 具体步骤 1.创建一个异常处理类 ControllerAdvice public class MyExceptionAdvice {}2.创建异常检测的类和处理业务方法 ExceptionHandler(NullPointerException.class)public HashMapString,Object NullPointerException(NullPointerException e){HashMapString, Object resultnew HashMap();result.put(code,-1);result.put(msg,空指针e.getMessage());result.put(data,null);return result;}具体的发送请求 RequestMapping(/login2)public int login2(){int num10 / 0;return 2;}显示结果: 一旦项目出现了空指针异常之后,就会统一异常处理. 四.统⼀数据返回格式 4.1 为什么需要统一的数据返回 统一数据返回格式的优点有很多比如以下几个: 1.方便前端程序员更好的接收和解析后端数据接口返回的数据 2.降低前端程序员和后端程序员的沟通成本按照某个格式实现就行了因为所有接口都是这样返回的。 3.有利于项目统一数据的维护和修改。 4.有利于后端技术部门的统一规范的标准制定不会出现稀奇古怪的返回内容 4.2 统一返回数据的格式 统一的数据返回格式可以使用 ControllerAdvice ResponseBodyAdvice 的方式实现,具体的代码如下: /*** 统一的格式处理*/ ControllerAdvice public class ResponseAdvice implements ResponseBodyAdvice {Autowiredprivate ObjectMapper objectMapper;/*** 是否执行beforeBody* param returnType* param converterType* return*/Overridepublic boolean supports(MethodParameter returnType, Class converterType) {return true;}/**** param body 原始返回值* param returnType* param selectedContentType* param selectedConverterType* param request* param response* return*/SneakyThrowsOverridepublic Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {//返回的标准 HashMapString,Object -code,msg,dataif (body instanceof HashMap) {return body;}//重写返回结果,让其中返回一个统一的数据格式HashMapString, Object result new HashMap();result.put(code, 200);result.put(data, body);result.put(msg, );return result;} }4.3 统一移除处理在遇到 String 返回返回时报错的问题 为什么会出现这样的错误呢? 现看具体的流程 1.方法返回的是 String 2.统一数据返回之前处理 - String ConvertHashMap 3.将 HashMap 转换成 application/json宁符串给前端(接口) 具体的错误是出在第三步的, 因为走到第三步之后 就会判断原 Body 的类型 - 1.是 String -StringllttpMessageConverter 进行类型转换 2.非 StringHttpMessageConverter 进行类型转换. 所以我们就可以给出具体的解决方案 1.将 StringHttpMessageConverter 去掉 2.在统一数据重写时单独处理 String 类型让其返回一个 String 宁符串而非 HashMap
http://www.hkea.cn/news/14422040/

相关文章:

  • 商丘网站建设哪家好jsp网站开发
  • 辽宁省建设银行e护航网站如果建设网站
  • 做网站一定要公司备案吗济宁网站建设公司有哪些
  • 做网站的步骤的文本wordpress电子书插件
  • 从事电子商务的网站建设做视频自媒体要投稿几个网站
  • 凡科做的网站手机版wordpress外链批量保存本地
  • 湖南省住房和城乡建设厅老网站免费照片的网站模板
  • 法律网站建设百度网盘账号登录入口
  • 精美手机网站模板网站素材 按钮
  • php购物网站开发成品asp.net网站开发代码
  • 安康创宇网站制作建设做旅游网站包括哪些栏目
  • 用网站的源代码怎么做网站沈阳鸿晟服装有限公司的案例
  • 服务器做jsp网站教程视频wordpress 表格不显示线
  • 文登市住房和城乡建设局网站wordpress拖拽式建站主题
  • 品牌宝免费网站163k地方门户网站系统
  • 有谁想做网站 优帮云东莞网站建设营销的企业
  • 中国建设银行网站主页知名网站欣赏
  • 常州网站建设企业网站制作织梦与wordpress详细比较
  • 公司网站怎么备案网站建设礻首选金手指
  • 龙岩网站建设设计服务淄博教育学校网站建设
  • 做网站主机要选好wordpress如何qq登录界面
  • 秦皇岛网站制作天元建设集团有限公司刘士龙
  • 东莞seo建站推广费用网站集约化建设纪要
  • 建筑工程网免费下载沈阳网站排名seo
  • 厦门 网站设计网站可信认证
  • 网站运行环境建设方案平面设计机构培训
  • 店铺只做商品展示网站怎么做怎么在网站后台加框框
  • 织梦网站被做跳转还被删除文件wordpress站点地址无法更改
  • 网站空间分销百度云搜索引擎入口百度网盘
  • 中小学校园网站建设做摄像头模组的网站