淘客怎么樣做網(wǎng)站谷歌推廣app
認(rèn)識(shí)JSR303
JSR303是一項(xiàng)Java標(biāo)準(zhǔn)規(guī)范,也叫做Bean Validation規(guī)范,提供了一種JavaBean數(shù)據(jù)驗(yàn)證的規(guī)范方式。在SpringMVC中,可以通過(guò)引入JSR303相關(guān)的依賴,來(lái)實(shí)現(xiàn)數(shù)據(jù)的校驗(yàn)。
在使用JSR303進(jìn)行校驗(yàn)時(shí),需要在需要校驗(yàn)的JavaBean的屬性上添加相應(yīng)的注解,如@NotNull、@Size等。同時(shí),還需要在需要進(jìn)行校驗(yàn)的方法中使用@Valid注解進(jìn)行標(biāo)注,以通知SpringMVC進(jìn)行校驗(yàn)操作。
JSR303提供了一些基本的校驗(yàn)注解,如@NotNull、@Size、@Pattern等,還可以通過(guò)自定義注解來(lái)實(shí)現(xiàn)更復(fù)雜的校驗(yàn)邏輯。除了基本的校驗(yàn)注解之外,JSR303還提供了一些組合注解,如@Valid、@GroupSequence等,可以更靈活地進(jìn)行校驗(yàn)。
總的來(lái)說(shuō),JSR303在SpringMVC中的應(yīng)用非常廣泛,可以有效地提高數(shù)據(jù)的安全性和可靠性。
為什么要用
認(rèn)識(shí)了JSR303那我們?yōu)槭裁匆盟?#xff1f;
簡(jiǎn)單易用:JSR303提供了一些簡(jiǎn)單明了的注解和API,使得驗(yàn)證輸入數(shù)據(jù)變得非常容易。
代碼可讀性:使用JSR303注解能讓代碼更具可讀性,因?yàn)轵?yàn)證的邏輯可以直接在Java Bean中看到。
減少重復(fù)代碼:使用JSR303注解可以避免編寫重復(fù)的驗(yàn)證代碼,并降低了維護(hù)和測(cè)試成本。
標(biāo)準(zhǔn)化:JSR303是Java EE標(biāo)準(zhǔn)之一,使用它可以使得代碼更加標(biāo)準(zhǔn)化、可移植。
安全性:使用JSR303注解可以提高代碼的安全性,因?yàn)榭梢詫?duì)輸入數(shù)據(jù)進(jìn)行有效的驗(yàn)證,從而避免了安全漏洞的出現(xiàn)。
可擴(kuò)展性:JSR303提供了一種簡(jiǎn)單的機(jī)制來(lái)擴(kuò)展驗(yàn)證規(guī)則,從而使其滿足應(yīng)用程序的需求。
?注解
給大家解釋一下
JSR303的注解主要用于驗(yàn)證Java Bean的屬性,以確保屬性的有效性和完整性。具體來(lái)說(shuō),主要有以下作用:
-
更方便地驗(yàn)證輸入數(shù)據(jù):通過(guò)使用JSR303的注解,可以很方便地驗(yàn)證輸入數(shù)據(jù)是否符合要求,從而減少了開發(fā)人員的工作量。
-
提高程序的可維護(hù)性:通過(guò)在Java Bean的屬性上定義驗(yàn)證規(guī)則,可以將驗(yàn)證邏輯與業(yè)務(wù)邏輯分離,從而使程序更易于維護(hù)和擴(kuò)展。
-
增加程序的健壯性:通過(guò)對(duì)Java Bean屬性的驗(yàn)證,可以有效地防止非法輸入數(shù)據(jù)對(duì)程序的影響,減少程序出錯(cuò)的概率,增加程序的健壯性。
-
提高程序的安全性:通過(guò)對(duì)Java Bean屬性的驗(yàn)證,可以確保輸入數(shù)據(jù)的有效性和完整性,從而減少了程序被攻擊的風(fēng)險(xiǎn)。
1. @NotNull:驗(yàn)證字段不為null。
2. @NotBlank:驗(yàn)證字段不為空,即長(zhǎng)度大于0,去掉空格后長(zhǎng)度大于0。
3. @NotEmpty:驗(yàn)證字段不為空,即長(zhǎng)度大于0。
4. @Min:驗(yàn)證數(shù)字字段的最小值。
5. @Max:驗(yàn)證數(shù)字字段的最大值。
6. @Size:驗(yàn)證字段的大小范圍。
7. @DecimalMin:驗(yàn)證十進(jìn)制數(shù)字段的最小值。
8. @DecimalMax:驗(yàn)證十進(jìn)制數(shù)字段的最大值。
9. @Pattern:驗(yàn)證字段匹配正則表達(dá)式。
10. @Email:驗(yàn)證字段為Email格式。
11. @Length:驗(yàn)證字段的長(zhǎng)度。
12. @Range:驗(yàn)證字段的值在范圍內(nèi)。
13. @Valid:驗(yàn)證嵌套對(duì)象。
14. @AssertTrue:驗(yàn)證字段為true。
15. @AssertFalse:驗(yàn)證字段為false。
16. @Past:驗(yàn)證日期字段在當(dāng)前時(shí)間之前。
17. @Future:驗(yàn)證日期字段在當(dāng)前時(shí)間之后。
?總之,JSR303的注解可以使程序更加健壯、安全、可維護(hù)和易于開發(fā)。
入門
導(dǎo)入依賴
<!-- 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>
MusicController?
在我們的MusicController方法中添加以下代碼
// 給數(shù)據(jù)添加服務(wù)端校驗(yàn)@RequestMapping("/valiAdd")public String valiAdd(@Validated Music music, BindingResult result, HttpServletRequest req){
// 如果服務(wù)端驗(yàn)證不通過(guò),有錯(cuò)誤if(result.hasErrors()){
// 服務(wù)端驗(yàn)證了實(shí)體類的多個(gè)屬性,多個(gè)屬性都沒有驗(yàn)證通過(guò)List<FieldError> fieldErrors = result.getFieldErrors();Map<String,Object> map = new HashMap<>();for (FieldError fieldError : fieldErrors) {
// 將多個(gè)屬性的驗(yàn)證失敗信息輸送到控制臺(tái)System.out.println(fieldError.getField() + ":" + fieldError.getDefaultMessage());map.put(fieldError.getField(),fieldError.getDefaultMessage());}req.setAttribute("errorMap",map);}else {this.musicBiz.insertSelective(music);return "redirect:list";}return "mic/edit";}
配置校驗(yàn)?
制定規(guī)則限制他
@NotNull(message = "學(xué)生編號(hào)不能為空")private Integer mid;@NotBlank(message = "學(xué)生名稱不能為空")private String mname;@NotBlank(message = "學(xué)生年齡不能為空")private String mtype;@NotBlank(message = "學(xué)生性別不能為空")private String minfo;
?
認(rèn)識(shí)攔截器?
Spring攔截器(Interceptor)是Spring MVC框架中的一種機(jī)制,用于在請(qǐng)求處理前和請(qǐng)求處理后攔截請(qǐng)求。Spring的攔截器類似于JavaEE中的過(guò)濾器(Filter),但是比過(guò)濾器更加靈活和強(qiáng)大。
Spring攔截器通過(guò)在配置文件中配置攔截器實(shí)現(xiàn)類,來(lái)將攔截器注入到Spring容器中。攔截器可以對(duì)請(qǐng)求進(jìn)行前置處理(preHandle)、后置處理(postHandle)和完成處理(afterCompletion)。在攔截器中,可以實(shí)現(xiàn)很多業(yè)務(wù)邏輯,比如:日志記錄、權(quán)限驗(yàn)證、參數(shù)驗(yàn)證等。
Spring攔截器可以攔截MVC請(qǐng)求、WebSocket請(qǐng)求、Restful請(qǐng)求等。在攔截器中,可以獲取請(qǐng)求的相關(guān)參數(shù)、請(qǐng)求頭等信息,可以對(duì)請(qǐng)求參數(shù)進(jìn)行驗(yàn)證和修改,還可以在請(qǐng)求前后記錄日志等操作。
使用Spring攔截器可以讓我們的代碼更加簡(jiǎn)潔,更加易于維護(hù)和擴(kuò)展。同時(shí),它也提高了代碼的可用性和可讀性,使我們的應(yīng)用程序更加健壯和高效。
?為什么要用攔截器
攔截器是一種在請(qǐng)求處理前或處理后攔截請(qǐng)求和響應(yīng)的機(jī)制。它可以在請(qǐng)求到達(dá)目標(biāo)之前對(duì)請(qǐng)求進(jìn)行預(yù)處理或在目標(biāo)處理完響應(yīng)后對(duì)響應(yīng)進(jìn)行后續(xù)處理。攔截器的作用是可以統(tǒng)一處理請(qǐng)求和響應(yīng)數(shù)據(jù),比如請(qǐng)求參數(shù)的校驗(yàn)、權(quán)限認(rèn)證、日志記錄等,可以減少代碼重復(fù)、提高代碼復(fù)用性、增強(qiáng)代碼的可維護(hù)性和可測(cè)試性。此外,攔截器可以對(duì)請(qǐng)求和響應(yīng)數(shù)據(jù)做出細(xì)粒度的控制,可以在某些特定的請(qǐng)求或響應(yīng)條件下觸發(fā)特定的處理邏輯,從而滿足業(yè)務(wù)需求。因此,使用攔截器可以讓我們更好地控制和管理請(qǐng)求和響應(yīng)數(shù)據(jù),提高應(yīng)用程序的可靠性和安全性。
攔截器應(yīng)用的場(chǎng)景
請(qǐng)求參數(shù)的校驗(yàn):可以對(duì)請(qǐng)求中的參數(shù)進(jìn)行非空、數(shù)據(jù)類型、長(zhǎng)度等方面的校驗(yàn),增強(qiáng)應(yīng)用程序的健壯性。
權(quán)限認(rèn)證:可以對(duì)用戶的登錄狀態(tài)、權(quán)限、角色等方面進(jìn)行認(rèn)證和授權(quán),保護(hù)應(yīng)用程序的安全性。
日志記錄:可以在請(qǐng)求進(jìn)入和響應(yīng)退出時(shí)記錄相關(guān)的系統(tǒng)日志,方便開發(fā)人員進(jìn)行問(wèn)題排查和性能優(yōu)化。
緩存處理:可以對(duì)某些請(qǐng)求進(jìn)行緩存,避免重復(fù)查詢數(shù)據(jù)庫(kù)等操作,提高應(yīng)用程序的性能。
數(shù)據(jù)加密:可以對(duì)請(qǐng)求和響應(yīng)數(shù)據(jù)進(jìn)行加密和解密,保護(hù)敏感數(shù)據(jù)的安全性。
異常處理:可以在請(qǐng)求處理發(fā)生異常時(shí)進(jìn)行處理,返回特定的錯(cuò)誤信息,避免系統(tǒng)崩潰或返回不友好的錯(cuò)誤信息。
總之,攔截器可以應(yīng)用于幾乎所有的 Web 應(yīng)用程序,可以對(duì)請(qǐng)求和響應(yīng)數(shù)據(jù)進(jìn)行各種處理和控制,從而提高應(yīng)用程序的可靠性、安全性和性能。
過(guò)濾器與攔截器的區(qū)別
過(guò)濾器屬于Servlet規(guī)范的一部分,攔截器則是SpringMVC框架的一部分。
過(guò)濾器的作用范圍是Servlet,攔截器的作用范圍是方法級(jí)別和類級(jí)別。
過(guò)濾器可以修改HTTP請(qǐng)求和響應(yīng),攔截器可以在執(zhí)行方法之前、之后、異常拋出后等不同的階段進(jìn)行處理。
過(guò)濾器使用Servlet容器管理,攔截器則使用Spring容器管理。
過(guò)濾器可以防止惡意訪問(wèn)和跨站腳本攻擊等,攔截器可以實(shí)現(xiàn)權(quán)限驗(yàn)證、日志記錄等。
用戶登錄權(quán)限?
Spring-mvc
Spring-mvc.xml中配置多攔截器
<!--<!– 用戶權(quán)限的請(qǐng)求攔截–>--><mvc:interceptors><bean class="com.zhanghao.interceptor.LoginInterceptor"></bean></mvc:interceptors><mvc:interceptors><!--2) 多攔截器(攔截器鏈)--><mvc:interceptor><mvc:mapping path="/**"/><bean class="com.zhanhao.interceptor.OneInterceptor"/></mvc:interceptor><mvc:interceptor><mvc:mapping path="/mic/**"/><bean class="com.zhanghao.interceptor.TwoInterceptor"/></mvc:interceptor></mvc:interceptors>
LoginInterceptor?
創(chuàng)造一個(gè)LoginInterceptor攔截器
package com.zhnaghao.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 登錄成功過(guò)String mname = (String) request.getSession().getAttribute("mname");if (mname == null || "".equals(mname)){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 {}
}
OneInterceptor
package com.zhanghao.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...");}
}
TwoInterceptor
package com.zhanghao.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...");}
}
jsp
接著創(chuàng)造一個(gè)新的jsp,用來(lái)寫我們的登入頁(yè)面代碼如下:
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>用戶登入</title>
</head>
<body>
<form action="${pageContext.request.contextPath }/login" method="post" enctype="multipart/form-data"><label>用戶名稱:</label><br/><input type="text" name="mname"/><br/><input type="submit" value="登入"/>
</form>
</body>
</html>
今天的分享就到這了?