本篇總結內容如下:
前言
MVC爲我們提供的安全校驗組件
Validator
Annotaion JSR-303
總結
分享與交流
前言
數據安全是項目運行的重要保障。用戶在註冊時、項目表單在提交時;不符合規範的數據或許會對我們的項目運行起到致命的錯誤。因此我們通常會寫一些規則約束這些數據,比如用戶性別只能填寫男或女等等,之前我們寫Java web的時候,一般會在業務代碼中寫數據校驗的邏輯代碼,或是專門寫一個數據校驗的類;MVC作爲一款優秀的組件,在數據安全方面提供了一套很好的支持,這些組件能大大減少代碼量,使得我們的項目開發更加輕鬆便捷。
MVC爲我們提供的安全校驗組件
MVC爲我們提供了兩種方式的校驗組件:
(1)基於Validator接口進行校驗;
(2)使用Annotaion JSR-303標準進行校驗。
Validator
Validator是一個接口,我們通過實現這個接口並重寫接口的抽象方法來加入校驗規則,起到數據校驗的作用。
具體使用還請往下看👇:
(1)創建一個Student類
public class Student {
private String name;
private String password;
//省略getter,setter,toString方法
}
(2)自定義校驗器StudentValidator,實現Validator接口,重寫接口的抽象方法,加入校驗規則
public class StudentValidator implements Validator {
public boolean supports(Class<?> clazz) {
return Student.class.equals(clazz);
}
public void validate(Object o, Errors errors) {
ValidationUtils.rejectIfEmpty(errors,"name",null,"姓名不能爲空");
ValidationUtils.rejectIfEmpty(errors,"password",null,"密碼不能爲空");
}
}
(3)創建控制器StudentController,POST請求的業務方法login參數列表中@Validator表示參數student是需要校驗的對象,@BindingResult用來存儲錯誤信息,兩者缺一不可,並且這兩個參數要緊挨在一起,中間不能有其他參數。
@Controller
@RequestMapping("/student")
public class StudentController {
@RequestMapping(value = "/login",method = RequestMethod.GET)
public String login(Model model){
model.addAttribute(new Student());
return "login";
}
@RequestMapping(value = "/login",method = RequestMethod.POST)
public String login(@Validated Student student, BindingResult br){
if(br.hasErrors()){
return "login";
}
return "success";
}
}
(4)創建JSP頁面
<body>
<h1>學生登錄</h1>
<form:form modelAttribute="student" action="login" method="post">
學生姓名:<form:input path="name"/><form:errors path="name"/><br/>
學生密碼:<form:input path="password"/><form:errors path="password"/><br/>
<input type="submit" value="提交"/>
</form:form>
</body>
(5)測試,首先用get請求訪問傳參name和password,然後輸入框中不填使用POST請求進行訪問
Annotaion JSR-303
使用Annotaion JSR-303標準進行驗證,需要導入支持這種標準的jar包,我們使用Hibernate Validator。
我們通過用戶註冊的案例來進行演示👇
(1)在pom.xml中添加Hibernate Validator依賴。
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.0.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.1.3.Final</version>
</dependency>
<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
<version>1.1.0.Final</version>
</dependency>
</dependencies>
•我是JDK8的版本,如果你的環境是JDK9以下,那麼可以和我一樣不用添加其他的依賴,如果你是JDK9以上,請再添加以下四個依賴👇
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-impl</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>com.sun.xml.bind</groupId>
<artifactId>jaxb-core</artifactId>
<version>2.3.0</version>
</dependency>
<dependency>
<groupId>javax.activation</groupId>
<artifactId>activation</artifactId>
<version>1.1.1</version>
</dependency>
(2)創建實體類User,通過註解的方式給屬性指定校驗規則
public class User {
@NotEmpty(message = "用戶名不能爲空")
private String username;
@Size(min = 6,max = 20,message = "密碼長度爲6-20位")
private String password;
@Email(regexp = "^[a-zA-Z0-9_.-]+@[a-zA-Z0-9]+(\\.[a-zA-Z0-9-]+)*\\.[a-zA-Z0-9]{2,6}$",message = "請輸入正確的郵箱格式")
private String email;
@Pattern(regexp = "^((13[0-9])|(14[5][7])|(15([0-3]|[5-9]))|(18[0,5-9]))\\\\d{8}$",message = "請輸入正確的電話格式")
private String phone;
//這裏省略getter,setter,toString方法
}
(3)創建控制器UserController,在POST請求的業務方法register使用@Validated綁定要檢驗的對象,使用@BindingResult保存錯誤信息。
@Controller
@RequestMapping("/user")
public class UserController {
@RequestMapping(value = "/register",method = RequestMethod.GET)
public String register(Model model){
model.addAttribute(new User());
return "register";
}
@RequestMapping(value = "/register",method = RequestMethod.POST)
public String register2(@Validated User user, BindingResult br){
if(br.hasErrors()){
return "register";
}
return "success";
}
}
• @RequestMapping(value = “/register”,method = RequestMethod.GET)等價於@GetMapping(value="/register")
(4)在springmvc.xml中添加配置
<!--base-package包下要包含所有@controller的類-->
<context:component-scan base-package="cn.lxy.controller"/>
<bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix" value="/"></property>
<property name="suffix" value=".jsp"></property>
</bean>
<mvc:annotation-driven/>
(5)創建register.jsp頁面
<body>
<h1>用戶註冊</h1>
<form:form modelAttribute="user" action="register" method="post">
用戶名:<form:input path="username"/><form:errors path="username"/><br/>
密碼:<form:input path="password"/><form:errors path="password"/><br/>
郵箱:<form:input path="email"/><form:errors path="email"/><br/>
電話:<form:input path="phone"/><form:errors path="phone"/><br/>
<input type="submit" value="提交"/>
</form:form>
</body>
(6)測試,首先用get請求訪問傳參username、password、email、phone,然後輸入框中不填使用POST請求進行訪問
總結
本篇總結了MVC下的數據安全,MVC爲我們提供了很好的組件,方便了我們的開發,Annotaion JSR-303相比於Validator接口在開發中較爲簡便,前者我們只需配置然後加入註解即可,後者需要我們配置並且需要自己自定義校驗類並寫校驗邏輯代碼。所以建議使用前者😄。
分享與交流
以上是我個人學習記錄總結,如果總結的不到位,還請大佬們不吝賜教哦😄
如果你在寫項目的時候,遇到一些不尋常的問題,也可以關注我的博客園,上邊會發布一些我在寫項目中遇到的各種問題以及解決方式。