Java24:会话管理 过滤器 监听器

📅 2026/7/21 16:20:46
Java24:会话管理 过滤器 监听器
一 会话管理1.cookie是一种客户端会话技术cookie由服务端产生它是服务器存放在浏览器的一小份数据浏览器以后每次访问服务器的时候都会将这小份的数据带到服务器去。//创建cookie对象Cookie cookie1new Cookie(keya,valuea);Cookie cookie2new Cookie(keyb,valueb);//设置cookie的时效性单位为秒cookie1.setMaxAge(10);//设置访问路径cookie1.setPath(/servlet1);//把cookie对象返回客户端resp.addCookie(cookie1);resp.addCookie(cookie2);2. sessionHttpSession 是一种保留更多信息在服务端的一种技术服务器会为每个客户端开辟一块内存空 间即session对象客户端在发送请求时都可以使用自己的session这样服务端就可以通过session来记录某个客户端的状态了服务器在为客户端创建session时会同时将session对象的id即JSESSIONID以cookie的形式放入响应对象后端在创建完session后客户端会收到一个特殊的cookie叫做JSESSIONID客户端下一次请求时携带JSESSINID后端收到后根据JESSINID找到对应的session对象通过该机制服务端通过session 就可以存储一些专门针对某个客户端的信息了。session 也是域对象//创建session对象HttpSession session req.getSession();//设置session属性session.setAttribute(name,zhanasan);//获取sessionidString id session.getId();System.out.println(id);//判断session是否新建System.out.println(session.isNew());3.ServletContext应用域对象是ServletContext传递数据范围是本应用之内可以跨多个会话创建ServletContext对象getServletContext()三大域使用场景请求转发时请求域可以传递数据请求域内一般存放本次请求业务相关的数据如查询到的所有部门信息同一个会话内不用请求转发会话域可以传递数据会话域内一般放本次会话的客户端有关的数据如当前客户端登录的用户同一个app内不同的客户端应用域可以传递数据应用域内一般放本程序应用有关的数据 如Spring框架的IOC容器4.实例获取三大域属性 ServletA 设置三个域的属性ServletB获取三个域的属性通过变更访问路径验证三个域的范围WebServlet(/servletA) public class ServletA extends HttpServlet { Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 请求域 req.setAttribute(request,requestvalue); // 会话域 HttpSession session req.getSession(); String id session.getId(); System.out.println(session:id); session.setAttribute(session,sessionvalue); //应用域 ServletContext servletContext this.getServletContext(); servletContext.setAttribute(application,applicationvalue); //请求转发 req.getRequestDispatcher(/servletB).forward(req,resp); } }WebServlet(/servletB) public class ServletB extends HttpServlet { Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { // 获取请求域对象属性值 String requestvalue (String) req.getAttribute(request); System.out.println(request:requestvalue); // 获取会话域属性值 HttpSession session req.getSession(); String id session.getId(); System.out.println(session:id); String sessionvalue (String) session.getAttribute(session); System.out.println(session:sessionvalue); //应用域 ServletContext servletContext this.getServletContext(); servletContext.setAttribute(application:,applicationvalue); String applicationvalue (String) servletContext.getAttribute(application); System.out.println(application:applicationvalue); } }二过滤器1.定义过滤器 是JAVAEE技术规范之一作用目标资源的请求进行过滤的一套技术规范是java web项目中最为实用的技术之一。2.过滤器位置3.过滤器原理及实现》Filter接口定义了过滤器的开发规范所有的过滤器都要实现该接口》Filter的工作位置是项目中所有目标资源之前容器在创建HttpServletRequest和HttpServletResponse对象后会先调用Filter的doFilter方法》Filter的doFilter方法可以控制请求是否继续如果放行则请求继续如果拒绝则请求到此为止由过滤器本身做出响应》Filter 不仅可以对请求做出过滤也可以在目标资源做出响应前对响应再次进行处理》过滤器实现过滤需在web.xml 配置过滤资源路径或者通过注解实现WebFilter》web.xml配置方式filter filter-namefilter1/filter-name filter-classcom.cn.filter.Filter1/filter-class /filter filter-mapping filter-namefilter1/filter-name url-pattern/*/url-pattern /filter-mapping4.过滤器实现访问资源耗时统计WebFilter(/*) public class FilterTest implements Filter { private SimpleDateFormat simpleDateFormat new SimpleDateFormat(yyyy-MM-dd hh:mm:ss); Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { //请求父转子获取请求资源 HttpServletRequest httpServletRequest (HttpServletRequest) servletRequest; HttpServletResponse httpServletResponse (HttpServletResponse) servletResponse; StringBuffer requestURL httpServletRequest.getRequestURL(); String format simpleDateFormat.format(new Date()); String info在format访问资源requestURL; System.out.println(info); long t1 System.currentTimeMillis(); //放行过滤器 filterChain.doFilter(servletRequest,servletResponse); //统计访问资源耗时 long t2 System.currentTimeMillis(); System.out.println(info共耗时(t2-t1)毫秒); } }WebServlet(/servlet1) public class MyServlet extends HttpServlet { Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println(servlet。。。); resp.getWriter().write(hello); } }5.过滤器生命周期阶段 对应方法 执行时机 执行次数创建对象 构造器 web应用启用 1初始化方法 void initFilterConfig filterConfig 构造完毕 1过滤请求 void doFilter(三个参数) 每次请求 多次销毁 defalut void destroy() weby 应用关闭 16.过滤器链执行顺序一个web项目中 可以同时定义多个过滤器多个过滤器对同一个资源过滤时工作位置有先后整体形成一个工作链称之为过滤器链》过滤器链中的过滤器顺序由filter-mapping顺序决定》每个过滤器过滤的范围不同针对同一个资源来说过滤器链中的过滤器个数可能是不同的》如果某个Filter是使用ServletName进行匹配规则的配置那么这个Filter执行的优先级要更低过滤器执行顺序实现三个过滤器public class Filter1 implements Filter { Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println(dofilter1 before invoke); filterChain.doFilter(servletRequest,servletResponse); System.out.println(dofilter1 after invoke); } }public class Filter2 implements Filter { Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println(dofilter2 before invoke); filterChain.doFilter(servletRequest,servletResponse); System.out.println(dofilter2 after invoke); } }public class Filter3 implements Filter { Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { System.out.println(dofilter3 before invoke); filterChain.doFilter(servletRequest,servletResponse); System.out.println(dofilter3 after invoke); } }访问资源WebServlet(/servlet1) public class Servlet1 extends HttpServlet { Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println(servlet1); resp.getWriter().write(good!); } }过滤路径配置如果使用注解则按照过滤器类名排序filter filter-namefilter1/filter-name filter-classcom.cn.filter.Filter1/filter-class /filter filter-mapping filter-namefilter1/filter-name url-pattern/*/url-pattern /filter-mapping filter filter-namefilter2/filter-name filter-classcom.cn.filter.Filter2/filter-class /filter filter-mapping filter-namefilter2/filter-name url-pattern/*/url-pattern /filter-mapping filter filter-namefilter3/filter-name filter-classcom.cn.filter.Filter3/filter-class /filter filter-mapping filter-namefilter3/filter-name url-pattern/*/url-pattern /filter-mapping7.过滤器实现登录控制 实现浏览器在不登录的情况下不能直接访问资源ScheduleController 和loginsucess.htmlScheduleController代码WebServlet(/schedule/*) public class ScheduleController extends BaseController{ protected void add(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { System.out.println(add); } }loginsucess.html代码!DOCTYPE html html langen head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 titleDocument/title /head body h1登录成功请浏览你的日程吧/h1 /body /htmlSysUserController 修改后的代码WebServlet(/sysuser/*) public class SysUserController extends BaseController { private SysUserService userservice new SysUserServiceImpl(); protected void login(HttpServletRequest req, HttpServletResponse resp) throws Exception { //1获取请求参数 String username req.getParameter(username); String userPwd req.getParameter(pwd); //调用服务层处理 SysUser sysuer userservice.login(username); if(nullsysuer){ resp.sendRedirect(/loginusernameerror.html); }else if( !userPwd.equals(sysuer.getUserPwd())){ resp.sendRedirect(/loginpassworderror.html); }else{//登录成功后把用户信息存入session域 HttpSession session req.getSession(); session.setAttribute(sysuer,sysuer);resp.sendRedirect(/loginsucess.html); } } }LoginFilter过滤器代码WebFilter(urlPatterns {/schedule/*,/loginsucess.html}) public class LoginFilter implements Filter { Override public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException { HttpServletRequest httpservletRequest (HttpServletRequest) servletRequest; HttpServletResponse httpservletRespone (HttpServletResponse) servletResponse; HttpSession session httpservletRequest.getSession(); Object sysuer session.getAttribute(sysuer); if(sysuernull){ //未登录直接跳转登录界面 httpservletRespone.sendRedirect(/login.html); }else{ //登录成功直接放行 filterChain.doFilter(servletRequest,servletResponse); } } }三.监听器1. 定义专门用于对域对象身上发生的事件或状态改变进行监听和相应处理的对象》监听器时GOF设计模式中观察者模式的典型案例》观察者模式当被观察的对象发生某些改变时观察者自动采取对应的行动的一种设计模式》监听器使用的感受类似JS中的事件被观察的对象发生某些情况时自动触发代码的执行》监听器并不监听web项目的所有组件仅仅是对三大域对象做相关的事件监听2.监听器分类application域监听器ServletContextListener, ServletContextAttributeListenersession域监听器HttpSessionListener , HttpSessionAttributeListenerrquest域监听器ServletRequestListener,ServletRequestAttributeListener3.实例servlet代码WebServlet(/servlet1) public class Servlet1 extends HttpServlet { Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext ServletContext getServletContext(); ServletContext.setAttribute(keya,keyavalue); HttpSession session req.getSession(); session.setAttribute(k1,v1); } }WebServlet(/servlet2) public class Servlet2 extends HttpServlet { Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext ServletContext getServletContext(); ServletContext.setAttribute(keya,keyaXXXX); HttpSession session req.getSession(); session.setAttribute(k1,v11); } }WebServlet(/servlet3) public class Servlet3 extends HttpServlet { Override protected void service(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { ServletContext ServletContext getServletContext(); ServletContext.removeAttribute(keya); HttpSession session req.getSession(); session.removeAttribute(k1); } }监听器代码WebListener public class MyListener implements ServletContextListener, ServletContextAttributeListener { Override public void contextInitialized(ServletContextEvent sce) { ServletContext servletContext sce.getServletContext(); System.out.println(sce.hashCode()初始化了); } Override public void contextDestroyed(ServletContextEvent sce) { ServletContext servletContext sce.getServletContext(); System.out.println(sce.hashCode()销毁了); } Override public void attributeAdded(ServletContextAttributeEvent sce) { ServletContext servletContext sce.getServletContext(); String name sce.getName(); Object value sce.getValue(); System.out.println(sce.hashCode()新增属性name值为value); } Override public void attributeReplaced(ServletContextAttributeEvent sce) { ServletContext servletContext sce.getServletContext(); String name sce.getName(); Object value sce.getValue(); Object newvalue servletContext.getAttribute(name); System.out.println(sce.hashCode()修改属性name值为value新值newvalue); } Override public void attributeRemoved(ServletContextAttributeEvent sce) { ServletContext servletContext sce.getServletContext(); String name sce.getName(); servletContext.removeAttribute(name); System.out.println(sce.hashCode()删除属性name); } }四.Ajax1.简介AjaxAsynchronous JavaScript and XML(异步的JavaScript和XML)Ajax 不是新的编程语言而是一种使用现有标准的新方法Ajax 最大的优点是在不重新加载整个界面的情况下可以与服务器交换数据并更新部分网页内容Ajax 不需要任何浏览器插件但需要用户允许JavaScript在浏览器上执行XMLHttpRequest只是实现Ajax的一种方式2.实例实现用户注册用户名重复的提示功能并使用json格式返回给前端枚举类定义响应码和响应信息ResultCodeEnumpublic enum ResultCodeEnum { SUCESS(200,sucess), USERNAME_ERROR(501,username_error), PASSWORD_ERROR(502,password_error), NOTLOGIN(503,notlogin), NAMEDUSED(505,nameused); private Integer code; private String message; private ResultCodeEnum(Integer code,String message){ this.codecode; this.messagemessage; } public Integer getCode() { return code; } public String getMessage() { return message; } }响应结果的实体类定义ResultTpublic class ResultT { private Integer code; private String message; private T data; public Integer getCode() { return code; } public void setCode(Integer code) { this.code code; } public String getMessage() { return message; } public void setMessage(String message) { this.message message; } public T getData() { return data; } public void setData(T data) { this.data data; } public Result(){} protected static T ResultT build(T data){ ResultT result new ResultT(); if(data!null){ result.setData(data); } return result; } public static T ResultTbuild(T body,Integer code,String message){ ResultT resultbuild(body); result.setCode(code); result.setMessage(message); return result; } public static T ResultT build(T body , ResultCodeEnum resultCodeEnum){ ResultT resultbuild(body); result.setCode(resultCodeEnum.getCode()); result.setMessage(resultCodeEnum.getMessage()); return result; } public static T ResultT ok(T data){ ResultT resultbuild(data); return build(data,ResultCodeEnum.SUCESS); } }控制器新增方法SysUserControllerWebServlet(/sysuser/*) public class SysUserController extends BaseController {protected void checkusernameused(HttpServletRequest req, HttpServletResponse resp) throws Exception { String username req.getParameter(username); SysUser user userservice.findByName(username); Result resultResult.ok(null); if(user!null){ resultResult.build(null, ResultCodeEnum.NAMEDUSED); } //把对象转换为json格式 ObjectMapper objectMapper new ObjectMapper(); String info objectMapper.writeValueAsString(result); //返回信息,设置格式为json resp.setContentType(application/json;charsetutf-8); resp.getWriter().write(info ); } }前端register.html 修改的代码红色部分为Ajax实现的部分!DOCTYPE html html langen head meta charsetUTF-8 meta nameviewport contentwidthdevice-width, initial-scale1.0 titleDocument/title style span{ font-family: Gill Sans, Gill Sans MT, Calibri, Trebuchet MS, sans-serif; color: red; } /style script //校验用户名 function checkusername(){ var reg/^[a-zA-Z0-9]{6,10}$/ var usernameobj document.getElementById(user1) var uservalueusernameobj.value var usercheckreg.test(uservalue) var sp1 document.getElementById(sp1) if(!usercheck){ sp1.innerText用户名不正确 return false } //用户名登录正确校验是否被占用//1.创建对象 var request new XMLHttpRequest() //2.设置回调函数 request.onreadystatechangefunction (){ if(request.readyState4request.status200){ var info JSON.parse(request.responseText) if(info.code505){ sp1.innerText不可用 } } } // 3.设置访问路径 request.open(get,/sysuser/checkusernameused?usernameuservalue) //4.发送访问 request.send()sp1.innerTextOK return true } //校验密码 function checkpassword(){ var reg/^\d{6}$/ var pwdobj document.getElementById(pw1) var pwdvaluepwdobj.value var pwdcheckreg.test(pwdvalue) var sp2 document.getElementById(sp2) if(!pwdcheck){ sp2.innerText密码不正确 return false } sp2.innerTextOK return true } //校验确认密码 function checkconformpassword(){ var reg/^\d{6}$/ var pwdobj2 document.getElementById(pw2) var pwdvalue2pwdobj2.value var pwdcheck2reg.test(pwdvalue2) var sp3 document.getElementById(sp3) if(!pwdcheck2){ sp3.innerText密码格式不正确 return false } //获取密码输入并和确认密码比较是否相等 var pwdobj document.getElementById(pw1) var pwdvaluepwdobj.value if(pwdvalue2!pwdvalue){ sp3.innerText密码和确认密码不相等 return false } sp3.innerTextOK return true } //表单提交校验 function checkregister(){ var flag1checkpassword() var flag2checkpassword() var flag3checkconformpassword() return flag1flag2flag3 } /script /head body h1 登录管理系统/h1 form action/sysuser/register methodget onsubmitreturn checkregister() table cellspacing0px tr td用户名/td td input typetext nameusername iduser1 onblurcheckusername() span idsp1/spanbr /td /tr tr td密 码/td td input typepasswordnameuserpwd idpw1 onblurcheckpassword() span idsp2/spanbr /td /tr tr td确认密 码/td td input typepassword idpw2 onblurcheckconformpassword() span idsp3/spanbr /td /tr tr td colspan2 input typesubmit value注册 input typereset value重置 button a hreflogin.html登录/a /button /td /tr /table /form /body /html