spring專題---第三部分MVC---MVC下如何保證數據安全

在這裏插入圖片描述

本篇總結內容如下:

    前言
    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接口在開發中較爲簡便,前者我們只需配置然後加入註解即可,後者需要我們配置並且需要自己自定義校驗類並寫校驗邏輯代碼。所以建議使用前者😄。

分享與交流

以上是我個人學習記錄總結,如果總結的不到位,還請大佬們不吝賜教哦😄
如果你在寫項目的時候,遇到一些不尋常的問題,也可以關注我的博客園,上邊會發布一些我在寫項目中遇到的各種問題以及解決方式。

發佈了31 篇原創文章 · 獲贊 30 · 訪問量 6497
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章