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

相关推荐
雨中飘荡的记忆15 分钟前
大流量下库存扣减的数据库瓶颈:Redis分片缓存解决方案
java·redis·后端
心之语歌3 小时前
基于注解+拦截器的API动态路由实现方案
java·后端
华仔啊4 小时前
Stream 代码越写越难看?JDFrame 让 Java 逻辑回归优雅
java·后端
ray_liang4 小时前
用六边形架构与整洁架构对比是伪命题?
java·架构
Ray Liang5 小时前
用六边形架构与整洁架构对比是伪命题?
java·python·c#·架构设计
Java水解6 小时前
Java 中间件:Dubbo 服务降级(Mock 机制)
java·后端
SimonKing10 小时前
OpenCode AI辅助编程,不一样的编程思路,不写一行代码
java·后端·程序员
FastBean10 小时前
Jackson View Extension Spring Boot Starter
java·后端
Seven9711 小时前
剑指offer-79、最⻓不含重复字符的⼦字符串
java
皮皮林55120 小时前
Java性能调优黑科技!1行代码实现毫秒级耗时追踪,效率飙升300%!
java