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

奇想网站建设搜索引擎平台

奇想网站建设,搜索引擎平台,买淘宝店,金阊做网站价格目录 一. JSR303 1.1 JSR303是什么 1.2 为什么要使用JSR303 1.3 JSR303常用注解 1.4 JSR303快速入门 1. 导入相关pom依赖 2. 配置校验规则 3. 入门示例 二. SpringMVC的拦截器 2.1 什么是拦截器 2.2 拦截器与过滤器的区别 2.3 拦截器工作原理 2.4 入门示例 1. 创建…

目录

一. JSR303

1.1 JSR303是什么

1.2 为什么要使用JSR303

1.3 JSR303常用注解

1.4 JSR303快速入门

1. 导入相关pom依赖

2. 配置校验规则

 3. 入门示例

 二. SpringMVC的拦截器

2.1 什么是拦截器

2.2 拦截器与过滤器的区别

2.3 拦截器工作原理

2.4 入门示例

1. 创建拦截器

2. 配置拦截器

 2.5 拦截器链

2.6  用户登录权限控制


一. JSR303

1.1 JSR303是什么

JSR是Java Specification Requests的缩写,意思是Java 规范提案。是指向JCP(Java Community Process)提出新增一个标准化技术规范的正式请求。任何人都可以提交JSR,以向Java平台增添新的API和服务。JSR已成为Java界的一个重要标准。 JSR-303 是JAVA EE 6 中的一项子规范,叫做Bean Validation,Hibernate Validator 是 Bean Validation 的参考实现 . Hibernate Validator 提供了 JSR 303 规范中所有内置 constraint(约束) 的实现,除此之外还有一些附加的 constraint。

验证数据是一项常见任务,它发生在从表示层到持久层的所有应用程序层中。通常在每一层都实现相同的验证逻辑,这既耗时又容易出错。为了避免重复这些验证,开发人员经常将验证逻辑直接捆绑到域模型中,将域类与验证代码混在一起,而验证代码实际上是关于类本身的元数据。

1.2 为什么要使用JSR303

前端不是已经校验过数据了吗?为什么我们还要做校验呢,直接用不就好了?草率了,假如说前端代码校验没写好又或者是对于会一点编程的人来说,直接绕过前端发请求(通过类似Postman这样的测试工具进行非常数据请求),把一些错误的参数传过来,后端代码不就危险了嘛。

所以我们一般都是前端一套校验,后端在一套校验,这样安全性就能够大大得到提升了。

1.3 JSR303常用注解

注解说明
@Null用于验证对象为null
@NotNull用于对象不能为null,无法查检长度为0的字符串
@NotBlank只用于String类型上,不能为null且trim()之后的size>0
@NotEmpty用于集合类、String类不能为null,且size>0。但是带有空格的字符串校验不出来
@Size用于对象(Array,Collection,Map,String)长度是否在给定的范围之内
@Length用于String对象的大小必须在指定的范围内
@Pattern用于String对象是否符合正则表达式的规则
@Email用于String对象是否符合邮箱格式
@Min用于Number和String对象是否大等于指定的值
@Max用于Number和String对象是否小等于指定的值
@AssertTrue用于Boolean对象是否为true
@AssertFalse用于Boolean对象是否为false

@Validated与@Valid区别

@Validated:

  • Spring提供的

  • 支持分组校验

  • 可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上

  • 由于无法加在成员属性(字段)上,所以无法单独完成级联校验,需要配合@Valid

@Valid:

  • JDK提供的(标准JSR-303规范)

  • 不支持分组校验

  • 可以用在方法、构造函数、方法参数和成员属性(字段)上

  • 可以加在成员属性(字段)上,能够独自完成级联校验

1.4 JSR303快速入门

1. 导入相关pom依赖

<!-- JSR303 -->
<hibernate.validator.version>6.0.7.Final</hibernate.validator.version><!-- JSR303 -->
<dependency><groupId>org.hibernate</groupId><artifactId>hibernate-validator</artifactId><version>${hibernate.validator.version}</version>
</dependency>

2. 配置校验规则

package com.xissl.model;import lombok.ToString;import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;@ToString
public class clazz {@NotNull(message = "班级编号不能为空")
//    @Size(max = 100,min = 10,message = "大小必须在10至100之间")protected Integer cid;@NotBlank(message = "班级名不能为空")protected String cname;@NotBlank(message = "班级教员老师不能为空")protected String cteacher;private String pic="暂无图片";public clazz(Integer cid, String cname, String cteacher, String pic) {this.cid = cid;this.cname = cname;this.cteacher = cteacher;this.pic = pic;}public clazz() {super();}public Integer getCid() {return cid;}public void setCid(Integer cid) {this.cid = cid;}public String getCname() {return cname;}public void setCname(String cname) {this.cname = cname;}public String getCteacher() {return cteacher;}public void setCteacher(String cteacher) {this.cteacher = cteacher;}public String getPic() {return pic;}public void setPic(String pic) {this.pic = pic;}
}

 3. 入门示例

在请求处理方法中,使用@Validated或@Valid注解要验证的对象,并根据BindingResult判断校验是否通过;

controller层

    //    给数据添加服务端校验@RequestMapping("/valiAdd")public String valiAdd(@Validated clazz clazz, BindingResult result, HttpServletRequest req){
//        如果服务端验证不通过,有错误if(result.hasErrors()){
//            服务端验证了实体类的多个属性,多个属性都没有验证通过List<FieldError> fieldErrors = result.getFieldErrors();Map<String,Object> map = new HashMap<>();for (FieldError fieldError : fieldErrors) {
//                将多个属性的验证失败信息输送到控制台System.out.println(fieldError.getField() + ":" + fieldError.getDefaultMessage());map.put(fieldError.getField(),fieldError.getDefaultMessage());}req.setAttribute("errorMap",map);}else {this.clazzBiz.insertSelective(clazz);return "redirect:clzlist";}return "clz/clzedit";}

前端代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>编辑界面</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/${empty c ? 'clazz/valiAdd' : 'clazz/edit'}" method="post">班级编号:<input type="text" name="cid" value="${s.cid }"><span style="color: red">${errorMap.cid}</span><br>班级名称:<input type="text" name="cname" value="${s.cname }"><span style="color: red">${errorMap.cname}</span><br>带班教员:<input type="text" name="cteacher" value="${s.cteacher }"><span style="color: red">${errorMap.cteacher}</span><br>班级logo:<input type="text" name="pic" value="${s.pic }"><br><input type="submit">
</form>
</body>
</html>

运行效果:

 

 二. SpringMVC的拦截器

2.1 什么是拦截器

SpringMVC的处理器拦截器(Interceptor)类似于Servlet开发中的过滤器Filter,用于对处理器进行预处理和后处理,用户可以自己定义一些拦截器来实现特定的功能。处理器拦截器依赖于web框架,在实现上基于Java的反射机制,属于面向切面编程(AOP)的一种运用。由于拦截器是基于web框架的调用,因此可以使用Spring的依赖注入(DI)进行一些业务操作,同时一个拦截器实例在一个 controller生命周期之内可以多次调用。

2.2 拦截器与过滤器的区别

什么是过滤器(Filter)

依赖于servlet容器。在实现上基于函数回调,可以对几乎所有请求进行过滤,但是缺点是一个过滤器实例只能在容器初始化时调用一次。使用过滤器的目的是用来做一些过滤操作,比如:在过滤器中修改字符编码;在过滤器中修改HttpServletRequest的一些参数,包括:过滤低俗文字、危险字符等。

拦截器与过滤器的区别

  • 过滤器(filter)

    1.filter属于Servlet技术,只要是web工程都可以使用

    2.filter主要由于对所有请求过滤

    3.filter的执行时机早于Interceptor

  • 拦截器(interceptor)

    1.interceptor属于SpringMVC技术,必须要有SpringMVC环境才可以使用

    2.interceptor通常由于对处理器Controller进行拦截

    3.interceptor只能拦截dispatcherServlet处理的请求

应用场景:日志处理、登录权限验证等

2.3 拦截器工作原理

  • preHandle:用于对拦截到的请求进行预处理,方法接收布尔(true,false)类型的返回值,返回true:放行,false:不放行。

    执行时机:在处理器方法执行前执行

    方法参数

    参数说明
    request请求对象
    response响应对象
    handler拦截到的方法处理
  • postHandle:用于对拦截到的请求进行后处理,可以在方法中对模型数据和视图进行修改

    执行时机:在处理器的方法执行后,视图渲染之前

    方法参数

    参数说明
    request请求对象
    response响应对象
    handler拦截到的处理器方法
    ModelAndView处理器方法返回的模型和视图对象,可以在方法中修改模型和视图
  • afterCompletion:用于在整个流程完成之后进行最后的处理,如果请求流程中有异常,可以在方法中获取对象

    执行时机:视图渲染完成后(整个流程结束之后)

    方法参数

    参数说明
    request请求参数
    response响应对象
    handler拦截到的处理器方法
    ex异常对象

2.4 入门示例

在 Spring MVC 框架中定义一个拦截器需要对拦截器进行定义和配置,主要有以下 2 种方式。

  1. 通过实现 HandlerInterceptor 接口或继承 HandlerInterceptor 接口的实现类(例如 HandlerInterceptorAdapter)来定义;
  2. 通过实现 WebRequestInterceptor 接口或继承 WebRequestInterceptor 接口的实现类来定义。

这里以实现 HandlerInterceptor 接口的定义方式为例

1. 创建拦截器

package com.xissl.interceptor;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class OneInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("【OneInterceptor】:preHandle...");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("【OneInterceptor】:postHandle...");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("【OneInterceptor】:afterCompletion...");}
}

这里的preHandle()方法返回值为true时,则表示未拦截,

返回值为false时,则表示拦截 

2. 配置拦截器

<!--    配置拦截器--><mvc:interceptors><bean class="com.xissl.interceptor.OneInterceptor"></bean></mvc:interceptors>

 未拦截:

已拦截:

 2.5 拦截器链

  • 当配置多个拦截器时,形成拦截器链
  • 拦截器链的运行顺序参照拦截器添加顺序为准
  • 当拦截器中出现对原始处理器的拦截,后面的拦截器均终止运行
  • 当拦截器运行中断,仅运行配置在前面的拦截器的afterCompletion操作

创建拦截器

package com.xissl.interceptor;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class TwoInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("【TwoInterceptor】:preHandle...");return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {System.out.println("【TwoInterceptor】:postHandle...");}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {System.out.println("【TwoInterceptor】:afterCompletion...");}
}

配置拦截器

    <!-- 多拦截器(拦截器链)--><mvc:interceptors><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.xissl.interceptor.OneInterceptor"/></mvc:interceptor><mvc:interceptor><mvc:mapping path="/clazz/**"/><bean class="com.xissl.interceptor.TwoInterceptor"/></mvc:interceptor></mvc:interceptors>

 <mvc:interceptors>:该元素用于配置一组拦截器。

<bean>:该元素是 <mvc:interceptors> 的子元素,用于定义全局拦截器,即拦截所有的请求。

<mvc:interceptor>:该元素用于定义指定路径的拦截器。

<mvc:mapping>:该元素是 <mvc:interceptor> 的子元素,用于配置拦截器作用的路径,该路径在其属性 path 中定义。path 的属性值为/**时,表示拦截所有路径,值为/clazz/**

时,表示拦截所有以/clazz/**结尾的路径。如果在请求路径中包含不需要拦截的内容,可以通过 <mvc:exclude-mapping> 子元素进行配置。

需要注意的是,<mvc:interceptor> 元素的子元素必须按照 <mvc:mapping.../>、<mvc:exclude-mapping.../>、<bean.../> 的顺序配置。

2.6  用户登录权限控制

登录拦截器

package com.xissl.interceptor;import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {System.out.println("【implements】:preHandle...");StringBuffer url = request.getRequestURL();if (url.indexOf("/login") > 0 || url.indexOf("/logout") > 0){//        如果是 登录、退出 中的一种return true;}
//            代表不是登录,也不是退出
//            除了登录、退出,其他操作都需要判断是否 session 登录成功过String uname = (String) request.getSession().getAttribute("uname");if (uname == null || "".equals(uname)){response.sendRedirect("/page/login");return false;}return true;}@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {}@Overridepublic void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {}
}

配置拦截器

    <mvc:interceptors><bean class="com.xissl.interceptor.LoginInterceptor"></bean></mvc:interceptors>

controller层

package com.xissl.web;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;/*** @author xissl* @create 2023-09-11 19:19*/
@Controller
public class LoginController {@RequestMapping("/login")public String login(HttpServletRequest req){String uname = req.getParameter("uname");HttpSession session = req.getSession();if ("zs".equals(uname)){session.setAttribute("uname",uname);}return "redirect:/clz/clzlist";}@RequestMapping("/logout")public String logout(HttpServletRequest req){req.getSession().invalidate();return "redirect:/clz/clzlist";}
}

前端代码:

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>登录</title>
</head>
<body>
<form action="/login" method="post">用户名:<input name="uname"><input type="submit"></form>
</body>
</html>

这里由于做了限制,只要输入的用户名不是zs,便不会被拦截器放行

 

http://www.yidumall.com/news/12127.html

相关文章:

  • 网站如何做超级链接成都优化网站哪家公司好
  • 网站不做icp备案外链网站
  • wordpress项目需求网站seo优化是什么
  • wordpress 获取评论黄山网站seo
  • vue 做的网站交易平台
  • 政府门户网站建设方案下载学开网店哪个培训机构好正规
  • 中山小榄网站网站搜索优化找哪家
  • 网站建设公司发展理念网站排名优化软件
  • 大连网站建设特色原画培训班一般学费多少
  • 网站平台建设调研报告新闻发稿渠道
  • 购物网站最近浏览怎么做如何通过网络营销自己
  • 怎样做网络推广好石家庄网站建设seo公司
  • wordpress4.3.1济南seo网站优化公司
  • b2b电子商务网站的类型aso推广
  • 定制网站开发哪家强谷歌seo实战教程
  • 网站 前置审批毕节地seo
  • 广东省东莞市seo引擎搜索
  • 一起做网站郑州石家庄seo公司
  • 互联网开发技术有哪些seo教程网
  • 公积金网站 如何做减员宁德市
  • html5网站设计工作室源码快速排名精灵
  • 什么网站可以免费做试卷制作网页
  • 一站式网站建设与运营外包公司为什么没人去
  • 新闻源网站怎么做精准广告投放
  • 绍兴网站建设专业的公司厦门百度开户
  • 莱州网站建设哪家好网络广告宣传平台
  • 万网备案初审过了后网站能访问吗googleseo推广
  • 陕西省建设厅网站查询广东省自然资源厅
  • 织梦网站tag怎么做长春网站建设解决方案
  • 郑州网站关键词推广建网站用什么工具