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");

相关推荐
小陈phd4 分钟前
多模态大模型学习笔记(二)——机器学习十大经典算法:一张表看懂分类 / 回归 / 聚类 / 降维
学习·算法·机器学习
Sayuanni%37 分钟前
初阶_多线程1(线程含义与关键属性)
java
程序媛徐师姐8 分钟前
Java基于微信小程序的模拟考试系统,附源码+文档说明
java·微信小程序·java模拟考试系统小程序·模拟考试微信小程序·模拟考试系统小程序·模拟考试小程序·java模拟考试小程序
疯狂敲代码的老刘17 分钟前
JDK 1.6到25 全版本网盘合集 (Windows + Mac + Linux)
java·linux·windows·macos·jdk
夕除19 分钟前
js--15
java·jvm·spring
曾经的三心草24 分钟前
redis-9-集群
java·redis·mybatis
sun032229 分钟前
【架构基础】Spring中的PropertySourcesPlaceholderConfigurer介绍 (并非新知识,比较古老的一种使用方式)
java·spring·架构
学编程的闹钟30 分钟前
95【给图片添加跳转链接】
学习
chilavert31832 分钟前
技术演进中的开发沉思-356:重排序(中)
java·开发语言
毕设源码-邱学长32 分钟前
【开题答辩全过程】以 基于SSM的儿童福利院管理系统为例,包含答辩的问题和答案
java·eclipse