Java全栈学习笔记39

# 过滤器

也是和servlet一样,属于是web服务器的组件(应用程序)

实现Filter接口。

init,destory,doFilter

创建过滤器

/**

* @param request 封装请求

* @param response 封装响应

* @param filteChain 过滤器链

*/

@Override

public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain)throws IOException, ServletException {

//过滤器执行的方法

filterChain.doFilter(request, response);

}

装配filter

使用web.xml文件

<filter>

<filter-name>firstFilter</filter-name>

<filter-class>com.baor.filter.FirstFilter</filter-class>

</filter>

<filter-mapping>

<filter-name>firstFilter</filter-name>

<url-pattern>/*</url-pattern>

</filter-mapping>

/* 代表是过滤所有的请求。url-pattern可以配置多个

使用注解装配

@WebFilter

多个过滤器的执行顺序

通过web.xml配置的先后顺序,决定执行顺序

如果使用注解装配,默认是使用类的先后顺序决定过滤器的执行先后顺序

#监听器

通过实现不同的事件监听的接口,实现不同的监听器

ServletRequest HttpSession ServletContext

装配

web.xml

<listener>

<listener-class>com.baor.listener.RequestListener</listener-class>

</listener>

注解

@WebListener

@Override

public void requestDestroyed(ServletRequestEvent sre) {

System.out.println("请求结束");

}

@Override

public void requestInitialized(ServletRequestEvent sre) {

System.out.println("请求初始化");

}

/**

* 为request请求域中存储数据

*/

@Override

public void attributeAdded(ServletRequestAttributeEvent srae) {

System.out.println("请求域中存储数据:"+srae.getName()+":"+srae.getValue());

}

/**

* 移除数据

*/

@Override

public void attributeRemoved(ServletRequestAttributeEvent srae) {

System.out.println("移除数据:"+srae.getName()+":"+srae.getValue());

}

/**

* 替换数据

*/

@Override

public void attributeReplaced(ServletRequestAttributeEvent srae) {

System.out.println("新值:"+srae.getServletRequest().getAttribute(srae.getName()));

System.out.println("替换数据:"+srae.getName()+":"+srae.getValue());

}

@Override

public void sessionCreated(HttpSessionEvent se) {

System.out.println("session创建");

}

@Override

public void sessionDestroyed(HttpSessionEvent se) {

//TODO 登出

System.out.println("session销毁");

}

/*

* session中存储内容

*/

@Override

public void attributeAdded(HttpSessionBindingEvent se) {

System.out.println("session中添加内容:"+se.getName()+":"+se.getValue());

}

/*

* session中移除内容

*/

@Override

public void attributeRemoved(HttpSessionBindingEvent se) {

System.out.println("session中移除内容:"+se.getName()+":"+se.getValue());

}

/*

* session中替换内容

*/

@Override

public void attributeReplaced(HttpSessionBindingEvent se) {

System.out.println("新值:"+se.getSession().getAttribute(se.getName()));

System.out.println("session中替换内容:"+se.getName()+":"+se.getValue());

}

@Override

public void contextDestroyed(ServletContextEvent sce) {

System.out.println("ServletContext对象销毁");

}

@Override

public void contextInitialized(ServletContextEvent sce) {

int i = 1 / 1;

System.out.println("ServletContext初始化");

}

@Override

public void attributeAdded(ServletContextAttributeEvent scae) {

System.out.println("ServletContext中添加内容:"+scae.getName()+":"+scae.getValue());

}

@Override

public void attributeRemoved(ServletContextAttributeEvent scae) {

System.out.println("ServletContext中移除内容:"+scae.getName()+":"+scae.getValue());

}

@Override

public void attributeReplaced(ServletContextAttributeEvent scae) {

System.out.println("新值:"+scae.getServletContext().getAttribute(scae.getName()));

System.out.println("ServletContext中替换内容:"+scae.getName()+":"+scae.getValue());

}

# 案例

技术划分:前端(客户端)和后端(服务器端)

应用划分:前端(用户端)和后端(后台管理系统)

前端不存在用户访问控制。和用户相关的操作,需要获取用户信息。此时是在登录后,后端需要返回用户信息,前端(客户端)需要在某个地方(本地存储/cookie)保存用户信息,在用时取出即可

后台管理系统,需要用户访问限制,除登录功能外,其他功能没有登录状态一律不能访问。前端(客户端)登录后,后端返回一个类似令牌的内容,之后的操作需要在每次请求中携带令牌。后端(服务器端)验证是否存在令牌以及令牌的合理性,如果令牌不存在或者不合理,都不允许访问。

单点登录(sa-token,shiro,Spring-security)/免登录/顶掉下线...都是在用户端

前后端分离的开发模式

前端和后端不在同一服务下

Apache,nginx,serve...

外卖 ---> 后台管理系统-- --商家,配送员,总管理平台

跨域

当服务器请求发生在非同源策略中,就会产生跨域问题

非同源 -- 不同主机名或者不同端口号

在发送真正的请求之前,会先发起一个请求,该请求的方法OPTIONS(验证权限)

前端解决 --- jsonp

后端解决 --

resp.setHeader("Access-Control-Allow-Origin", "*");

允许的请求方法

resp.setHeader("Access-Control-Allow-Methods", "GET, POST, PUT, DELETE, OPTIONS");

允许的请求头

resp.setHeader("Access-Control-Allow-Headers", "Content-Type, Token , Authorization");

预检请求的有效期(秒)

resp.setHeader("Access-Control-Max-Age", "3600");

相关推荐
古法老登瞎折腾3 小时前
大数据智能运维实战(十一):运维 MCP 的工程化——权限、限流、审计与错误处理
java·大数据·运维·spring ai·mcp
zhangrelay3 小时前
新版|-|单片机原理与接口技术-2026持续改进优化-从MEGA2560-ESP32与Wokwi到ROS2-Lyrical与具身智能栈
笔记·单片机·嵌入式硬件·学习
智能运维指南4 小时前
研制过程“两张皮“怎么破:研制一体化支撑平台的定位、能力边界与落地前提
java·前端·人工智能·嘉为蓝鲸
Jimmy4 小时前
深夜突袭:我们的午夜战场
笔记·产品·电子书
yz_aiks5 小时前
Spring AI 2.1 ChatMemory 已过时用什么替代:迁移到 Session Memory 实战(JDBC 存储与会话压缩)
java·spring boot·大模型·ai agent·spring ai
金銀銅鐵5 小时前
[Java] 用 GUI 展示 EnumMap 增删键值对时的内部变化
java·后端·ai编程
学长毕设5 小时前
基于SpringBoot的上门洗车服务系统设计与实现
java·spring boot·后端
jason成都5 小时前
RTKLIB-Java 多基线联合RTK:FIX率从0%到91.5%的三层根因修复
java·gnss·rtklib·rtklib_java
鱼宵5 小时前
Stream 终端操作一次讲透:collect、count、reduce 怎么选
java·stream·终端操作
白山编程大哥5 小时前
Java 后端如何优雅地把 List 集合返回给前端
java·前端·list