郑州个人做网站汉狮,wordpress文章相册模式,登陆wordpress忘记密码,大气一点的公司名字目录 引言JSR303什么是JSR303?为什么要使用JSR303?常用注解快速入门JSR303 拦截器什么是拦截器拦截器与过滤器应用场景快速入门拦截器 总结 引言
在Java Web开发过程中#xff0c;我们经常会遇到需要对输入数据进行验证和处理#xff0c;同时需要对请求进行拦截与控制的需… 目录 引言JSR303什么是JSR303?为什么要使用JSR303?常用注解快速入门JSR303 拦截器什么是拦截器拦截器与过滤器应用场景快速入门拦截器 总结 引言
在Java Web开发过程中我们经常会遇到需要对输入数据进行验证和处理同时需要对请求进行拦截与控制的需求。为了方便实现这些功能我们可以使用JSR303验证框架和拦截器技术。本篇博客将介绍JSR303和拦截器的基本概念并探讨它们在Java Web开发中的应用与实践。
JSR303
什么是JSR303?
JSR303是一项Java标准规范也被称为Bean Validation它提供了一组注解和API用于对JavaBean属性进行验证。通过使用JSR303我们可以在不编写繁琐的验证逻辑代码的情况下实现对表单数据的验证和处理。JSR303使得验证过程更加简单和可读并且是一种广泛应用于Java Web开发中的验证框架。
为什么要使用JSR303?
使用JSR303可以提供以下好处
简化验证逻辑通过使用JSR303的注解我们可以直接在JavaBean属性上添加验证规则使得验证逻辑更加清晰和简洁。提高可维护性将验证规则与业务逻辑分离使得验证规则可以独立于业务逻辑进行修改和扩展提高了代码的可维护性。提供统一验证框架JSR303是Java标准规范被广泛应用于Java Web框架中使用JSR303可以使得不同的Web框架之间的验证方式保持一致提高了协作的效率。
常用注解
在JSR303中有许多常用的注解用于实现验证功能包括
NotNull用于标记属性不能为空。Size用于指定属性的长度范围。Pattern用于指定属性的正则表达式验证规则。Min用于指定属性的最小值。Max用于指定属性的最大值。 其他还有很多注解可以根据具体需求选择合适的注解进行使用。
快速入门JSR303
以下是使用JSR303进行表单验证的快速入门示例
实体类
package com.yuan.model;import lombok.ToString;import javax.validation.constraints.NotBlank;ToString
public class Student {NotBlank(message 编号不能为空)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;}
}
}后台校验 // 给数据添加服务端校验RequestMapping(/valiAdd)public String valiAdd(Validated Student student, BindingResult result, HttpServletRequest req){
// 如果服务端验证不通过有错误if(result.hasErrors()){
// 服务端验证了实体类的多个属性多个属性都没有验证通过ListFieldError fieldErrors result.getFieldErrors();MapString,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.studentBiz.insertSelective(student);return redirect:list;}return stu/edit;}JSP页面
% page languagejava contentTypetext/html; charsetUTF-8pageEncodingUTF-8%
!DOCTYPE html PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN http://www.w3.org/TR/html4/loose.dtd
html
headmeta http-equivContent-Type contenttext/html; charsetUTF-8title/title
/head
body
form action${pageContext.request.contextPath }/${empty s ? student/valiAdd : student/edit} methodpost学生编号:input typetext namesid value${s.sid }span stylecolor: red${errorMap.sid}/spanbr学生姓名:input typetext namesname value${s.sname }span stylecolor: red${errorMap.sname}/spanbr学生年龄:input typetext namesage value${s.sage }span stylecolor: red${errorMap.sage}/spanbr学生性别:input typetext namessex value${s.ssex }span stylecolor: red${errorMap.ssex}/spanbrinput typesubmit
/form
/body
/html页面效果
通过在JavaBean的属性上添加注解我们可以指定验证规则。在上述示例中使用了注解表示该属性不能为空注解表示该属性的长度范围是2到20之间注解表示该属性的值必须符合正则表达式[a-zA-Z0-9]。在实际使用中我们可以通过调用验证器来验证数据是否符合规则。NotNullSizePattern
拦截器
什么是拦截器
拦截器是Java Web开发中常见的一种技术它允许在请求到达目标资源之前或之后对请求进行处理。拦截器可以拦截请求和响应并在处理过程中对它们进行修改和控制。拦截器在开发过程中具有广泛的应用用于实现身份验证、日志记录、性能监控等功能。
拦截器与过滤器
虽然拦截器和过滤器在功能上有一些相似之处但它们在实现方式和应用场景上有所不同。
过滤器是基于Servlet规范的它通过在web.xml文件中配置并作用于整个应用或者特定的URL模式。过滤器可以在请求到达目标资源之前或之后进行处理但其处理方式是基于Servlet API的。过滤器通常用于请求和响应的预处理和后处理。拦截器是基于Java反射机制的它通常与特定的框架或技术相关联比如Spring框架。拦截器可以更加细粒度地进行控制可以通过在配置文件或注解中添加拦截器的方式来指定拦截的目标资源。
应用场景
拦截器在Java Web开发中具有广泛的应用场景包括但不限于以下几个方面
身份验证和权限控制拦截器可以用于验证用户的身份并对用户的访问权限进行控制以确保只有具备相应权限的用户可以访问受限资源。日志记录拦截器可以用于记录请求和响应的日志信息包括请求参数、处理时间、返回结果等便于后期的问题排查和系统分析。参数处理和转换拦截器可以在请求到达目标资源之前对请求参数进行处理和转换使得目标资源能够更加方便地获取到需要的数据。性能监控拦截器可以用于统计和监控系统的性能指标例如请求处理时间、访问频率等以便及时发现潜在的性能问题。
快速入门拦截器
以下是使用拦截器进行身份验证和权限控制的快速入门示例
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!--这个是拦截所有的--mvc:mapping path/**/bean classcom.yuan.interceptor.OneInterceptor//mvc:interceptormvc:interceptor!--这个是只拦截/studnt路径下所有的--mvc:mapping path/student/**/bean classcom.yuan.interceptor.TwoInterceptor//mvc:interceptor/mvc:interceptors2.登录
登录拦截器
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 登录成功过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 contentTypetext/html;charsetUTF-8 languagejava %
html
headtitleTitle/title
/head
body
a href/login?unameyh登录/a
/body
/html
配置拦截器 mvc:interceptorsbean classcom.yuan.interceptor.LoginInterceptor/bean/mvc:interceptors
以我的代码为例如果登录点击进去携带的参数不为空并且为yh就可以进入主界面如果不是就会被拦截一直在登录界面
总结
本篇博客介绍了JSR303在这里插入代码片验证框架和拦截器技术在Java Web开发中的应用与实践。通过使用JSR303我们可以简化表单验证逻辑并提高代码的可维护性。拦截器则可以用于实现身份验证、日志记录、性能监控等功能提升系统的安全性和可观测性。通过深入掌握和灵活应用JSR303和拦截器我们可以更好地开发出高质量的Java Web应用。
希望本篇博客能够帮助你对JSR303和拦截器有更深入的理解并能在实际项目中应用它们来提升开发效率和代码质量。