百度搜索網(wǎng)站介紹杭州上城區(qū)抖音seo有多好
目錄
- 引言
- JSR303
- 什么是JSR303?
- 為什么要使用JSR303?
- 常用注解
- 快速入門JSR303
- 攔截器
- 什么是攔截器
- 攔截器與過(guò)濾器
- 應(yīng)用場(chǎng)景
- 快速入門攔截器
- 總結(jié)

引言
在Java Web開(kāi)發(fā)過(guò)程中,我們經(jīng)常會(huì)遇到需要對(duì)輸入數(shù)據(jù)進(jìn)行驗(yàn)證和處理,同時(shí)需要對(duì)請(qǐng)求進(jìn)行攔截與控制的需求。為了方便實(shí)現(xiàn)這些功能,我們可以使用JSR303驗(yàn)證框架和攔截器技術(shù)。本篇博客將介紹JSR303和攔截器的基本概念,并探討它們?cè)贘ava Web開(kāi)發(fā)中的應(yīng)用與實(shí)踐。
JSR303
什么是JSR303?
JSR303是一項(xiàng)Java標(biāo)準(zhǔn)規(guī)范,也被稱為Bean Validation,它提供了一組注解和API用于對(duì)JavaBean屬性進(jìn)行驗(yàn)證。通過(guò)使用JSR303,我們可以在不編寫繁瑣的驗(yàn)證邏輯代碼的情況下,實(shí)現(xiàn)對(duì)表單數(shù)據(jù)的驗(yàn)證和處理。JSR303使得驗(yàn)證過(guò)程更加簡(jiǎn)單和可讀,并且是一種廣泛應(yīng)用于Java Web開(kāi)發(fā)中的驗(yàn)證框架。
為什么要使用JSR303?
使用JSR303可以提供以下好處:
- 簡(jiǎn)化驗(yàn)證邏輯:通過(guò)使用JSR303的注解,我們可以直接在JavaBean屬性上添加驗(yàn)證規(guī)則,使得驗(yàn)證邏輯更加清晰和簡(jiǎn)潔。
- 提高可維護(hù)性:將驗(yàn)證規(guī)則與業(yè)務(wù)邏輯分離,使得驗(yàn)證規(guī)則可以獨(dú)立于業(yè)務(wù)邏輯進(jìn)行修改和擴(kuò)展,提高了代碼的可維護(hù)性。
- 提供統(tǒng)一驗(yàn)證框架:JSR303是Java標(biāo)準(zhǔn)規(guī)范,被廣泛應(yīng)用于Java Web框架中,使用JSR303可以使得不同的Web框架之間的驗(yàn)證方式保持一致,提高了協(xié)作的效率。
常用注解
在JSR303中,有許多常用的注解用于實(shí)現(xiàn)驗(yàn)證功能,包括:
- @NotNull:用于標(biāo)記屬性不能為空。
- @Size:用于指定屬性的長(zhǎng)度范圍。
- @Pattern:用于指定屬性的正則表達(dá)式驗(yàn)證規(guī)則。
- @Min:用于指定屬性的最小值。
- @Max:用于指定屬性的最大值。
其他還有很多注解,可以根據(jù)具體需求選擇合適的注解進(jìn)行使用。
快速入門JSR303
以下是使用JSR303進(jìn)行表單驗(yàn)證的快速入門示例:
實(shí)體類
package com.yuan.model;import lombok.ToString;import javax.validation.constraints.NotBlank;@ToString
public class Student {@NotBlank(message = "編號(hào)不能為空")private String sid;@NotBlank(message = "名字不能為空")private String sname;@NotBlank(message = "年齡不能為空")private String sage;@NotBlank(message = "性別不能為空")private String ssex;public Student(String sid, String sname, String sage, String ssex) {this.sid = sid;this.sname = sname;this.sage = sage;this.ssex = ssex;}public Student() {super();}public String getSid() {return sid;}public void setSid(String sid) {this.sid = sid;}public String getSname() {return sname;}public void setSname(String sname) {this.sname = sname;}public String getSage() {return sage;}public void setSage(String sage) {this.sage = sage;}public String getSsex() {return ssex;}public void setSsex(String ssex) {this.ssex = ssex;}
}
}
后臺(tái)校驗(yàn)
// 給數(shù)據(jù)添加服務(wù)端校驗(yàn)@RequestMapping("/valiAdd")public String valiAdd(@Validated Student student, BindingResult result, HttpServletRequest req){
// 如果服務(wù)端驗(yàn)證不通過(guò),有錯(cuò)誤if(result.hasErrors()){
// 服務(wù)端驗(yàn)證了實(shí)體類的多個(gè)屬性,多個(gè)屬性都沒(méi)有驗(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.studentBiz.insertSelective(student);return "redirect:list";}return "stu/edit";}
JSP頁(yè)面
<%@ page language="java" contentType="text/html; charset=UTF-8"pageEncoding="UTF-8"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
<html>
<head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8"><title></title>
</head>
<body>
<form action="${pageContext.request.contextPath }/${empty s ? 'student/valiAdd' : 'student/edit'}" method="post">學(xué)生編號(hào):<input type="text" name="sid" value="${s.sid }"><span style="color: red">${errorMap.sid}</span><br>學(xué)生姓名:<input type="text" name="sname" value="${s.sname }"><span style="color: red">${errorMap.sname}</span><br>學(xué)生年齡:<input type="text" name="sage" value="${s.sage }"><span style="color: red">${errorMap.sage}</span><br>學(xué)生性別:<input type="text" name="ssex" value="${s.ssex }"><span style="color: red">${errorMap.ssex}</span><br><input type="submit">
</form>
</body>
</html>
頁(yè)面效果
通過(guò)在JavaBean的屬性上添加注解,我們可以指定驗(yàn)證規(guī)則。在上述示例中,使用了注解表示該屬性不能為空,注解表示該屬性的長(zhǎng)度范圍是2到20之間,注解表示該屬性的值必須符合正則表達(dá)式"[a-zA-Z0-9]+"。在實(shí)際使用中,我們可以通過(guò)調(diào)用驗(yàn)證器來(lái)驗(yàn)證數(shù)據(jù)是否符合規(guī)則。@NotNull@Size@Pattern
攔截器
什么是攔截器
攔截器是Java Web開(kāi)發(fā)中常見(jiàn)的一種技術(shù),它允許在請(qǐng)求到達(dá)目標(biāo)資源之前或之后對(duì)請(qǐng)求進(jìn)行處理。攔截器可以攔截請(qǐng)求和響應(yīng),并在處理過(guò)程中對(duì)它們進(jìn)行修改和控制。攔截器在開(kāi)發(fā)過(guò)程中具有廣泛的應(yīng)用,用于實(shí)現(xiàn)身份驗(yàn)證、日志記錄、性能監(jiān)控等功能。
攔截器與過(guò)濾器
雖然攔截器和過(guò)濾器在功能上有一些相似之處,但它們?cè)趯?shí)現(xiàn)方式和應(yīng)用場(chǎng)景上有所不同。
- 過(guò)濾器是基于Servlet規(guī)范的,它通過(guò)在web.xml文件中配置,并作用于整個(gè)應(yīng)用或者特定的URL模式。過(guò)濾器可以在請(qǐng)求到達(dá)目標(biāo)資源之前或之后進(jìn)行處理,但其處理方式是基于Servlet API的。過(guò)濾器通常用于請(qǐng)求和響應(yīng)的預(yù)處理和后處理。
- 攔截器是基于Java反射機(jī)制的,它通常與特定的框架或技術(shù)相關(guān)聯(lián),比如Spring框架。攔截器可以更加細(xì)粒度地進(jìn)行控制,可以通過(guò)在配置文件或注解中添加攔截器的方式來(lái)指定攔截的目標(biāo)資源。
應(yīng)用場(chǎng)景
攔截器在Java Web開(kāi)發(fā)中具有廣泛的應(yīng)用場(chǎng)景,包括但不限于以下幾個(gè)方面:
- 身份驗(yàn)證和權(quán)限控制:攔截器可以用于驗(yàn)證用戶的身份,并對(duì)用戶的訪問(wèn)權(quán)限進(jìn)行控制,以確保只有具備相應(yīng)權(quán)限的用戶可以訪問(wèn)受限資源。
- 日志記錄:攔截器可以用于記錄請(qǐng)求和響應(yīng)的日志信息,包括請(qǐng)求參數(shù)、處理時(shí)間、返回結(jié)果等,便于后期的問(wèn)題排查和系統(tǒng)分析。
- 參數(shù)處理和轉(zhuǎn)換:攔截器可以在請(qǐng)求到達(dá)目標(biāo)資源之前對(duì)請(qǐng)求參數(shù)進(jìn)行處理和轉(zhuǎn)換,使得目標(biāo)資源能夠更加方便地獲取到需要的數(shù)據(jù)。
- 性能監(jiān)控:攔截器可以用于統(tǒng)計(jì)和監(jiān)控系統(tǒng)的性能指標(biāo),例如請(qǐng)求處理時(shí)間、訪問(wèn)頻率等,以便及時(shí)發(fā)現(xiàn)潛在的性能問(wèn)題。
快速入門攔截器
以下是使用攔截器進(jìn)行身份驗(yàn)證和權(quán)限控制的快速入門示例:
- 1.攔截器鏈
package com.yuan.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...");}
}
package com.yuan.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><!--2) 多攔截器(攔截器鏈)--><mvc:interceptor><!--這個(gè)是攔截所有的--><mvc:mapping path="/**"/><bean class="com.yuan.interceptor.OneInterceptor"/></mvc:interceptor><mvc:interceptor><!--這個(gè)是只攔截/studnt路徑下所有的--><mvc:mapping path="/student/**"/><bean class="com.yuan.interceptor.TwoInterceptor"/></mvc:interceptor></mvc:interceptors>
- 2.登錄
登錄攔截器
package com.yuan.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 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 {}
}
Login Web層
package com.yuan.web;import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpSession;@Controller
public class LoginController {@RequestMapping("/login")public String login(HttpServletRequest req){String uname = req.getParameter("uname");HttpSession session = req.getSession();if ("yh".equals(uname)){session.setAttribute("uname",uname);}return "redirect:/student/list";}@RequestMapping("/logout")public String logout(HttpServletRequest req){req.getSession().invalidate();return "redirect:/student/list";}
}
login.jsp
<%--Created by IntelliJ IDEA.User: yuanhDate: 2023/9/11Time: 18:38To change this template use File | Settings | File Templates.
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>Title</title>
</head>
<body>
<a href="/login?uname=yh">登錄</a>
</body>
</html>
配置攔截器
<mvc:interceptors><bean class="com.yuan.interceptor.LoginInterceptor"></bean></mvc:interceptors>
以我的代碼為例,如果登錄點(diǎn)擊進(jìn)去攜帶的參數(shù)不為空并且為yh就可以進(jìn)入主界面,如果不是就會(huì)被攔截一直在登錄界面
總結(jié)
本篇博客介紹了JSR303在這里插入代碼片
驗(yàn)證框架和攔截器技術(shù)在Java Web開(kāi)發(fā)中的應(yīng)用與實(shí)踐。通過(guò)使用JSR303,我們可以簡(jiǎn)化表單驗(yàn)證邏輯,并提高代碼的可維護(hù)性。攔截器則可以用于實(shí)現(xiàn)身份驗(yàn)證、日志記錄、性能監(jiān)控等功能,提升系統(tǒng)的安全性和可觀測(cè)性。通過(guò)深入掌握和靈活應(yīng)用JSR303和攔截器,我們可以更好地開(kāi)發(fā)出高質(zhì)量的Java Web應(yīng)用。
希望本篇博客能夠幫助你對(duì)JSR303和攔截器有更深入的理解,并能在實(shí)際項(xiàng)目中應(yīng)用它們來(lái)提升開(kāi)發(fā)效率和代碼質(zhì)量。