过滤器
@WebFilter(urlPatterns = "/loginfolder/*")
public class filterUser implements Filter {
@Override
public void init(FilterConfig filterConfig) throws ServletException {
}
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
javax.servlet.http.HttpServletRequest req = (javax.servlet.http.HttpServletRequest) servletRequest;
javax.servlet.http.HttpSession session = req.getSession();
if (session.getAttribute("user") != null) {
// System.out.print(session.getAttribute("user"));
// 放行
filterChain.doFilter(servletRequest, servletResponse);
} else {
((javax.servlet.http.HttpServletResponse) servletResponse).sendRedirect("../index.jsp");
}
}
@Override
public void destroy() {
}
}
@WebFilter
注解
以下所有属性均为可选属性,但是 value、urlPatterns、servletNames 三者必需至少包含一个,且 value 和 urlPatterns 不能共存,如果同时指定,通常忽略 value 的取值。
@WebFilter
的常用属性
属性名 | 类型 | 描述 |
---|---|---|
filterName | String | 指定过滤器的 name 属性,等价于 <filter-name> |
value | String[] | 该属性等价于 urlPatterns 属性。但是两者不应该同时使用。 |
urlPatterns | String[] | 指定一组过滤器的 URL 匹配模式。等价于 <url-pattern> 标签。 |
servletNames | String[] | 指定过滤器将应用于哪些 Servlet。取值是 @WebServlet 中的 name 属性的取值,或者是 web.xml 中 <servlet-name> 的取值。 |
dispatcherTypes | DispatcherType | 指定过滤器的转发模式。具体取值包括:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST。 |
initParams | WebInitParam[] | 指定一组过滤器初始化参数,等价于 <init-param> 标签。 |
asyncSupported | boolean | 声明过滤器是否支持异步操作模式,等价于 <async-supported> 标签。 |
description | String | 该过滤器的描述信息,等价于 <description> 标签。 |
displayName | String | 该过滤器的显示名,通常配合工具使用,等价于 <display-name> 标签。 |
dispatcher
请求方式:
REQUEST:拦截HTTP请求 get post
FORWARD:只拦截通过请求转发方式的请求
INCLUDE:只拦截拦截通过 request.getRequestDispatcher("").include()、通过 <jsp:include page="..." />
此种方式发出的请求
ERROR:只拦截 <error-page>
发出的请求
过滤器链
可以配置多个过滤器,过滤器的先后顺序 是由 <filter-mapping>
的位置决定
监听器
public class OnlineListener implements HttpSessionAttributeListener{
//编写添加和删除属性方法
public void attributeAdded(HttpSessionBindingEvent e) {
UserList.addUser(String.valueOf(e.getValue()));
System.out.println("session(" + e.getSession().getId() + ")增加属性"
+ e.getName() + ",值为" + e.getValue());
}
public void attributeRemoved(HttpSessionBindingEvent e) {
UserList.removeUser(String.valueOf(e.getValue()));
System.out.println("session(" + e.getSession().getId() + ")移除属性"
+ e.getName() + ",值为" + e.getValue());
}
//编写更改属性方法
public void attributeReplaced(HttpSessionBindingEvent e) {
String oldValue=String.valueOf(e.getValue());
String newValue=
String.valueOf(e.getSession().
getAttribute(e.getName()));
UserList.removeUser(oldValue);
UserList.addUser(newValue);
System.out.println("session(" + e.getSession().getId() + ")属性"
+ e.getName() + "的值,由"+oldValue+"更改为" + newValue);
}
//编写操作监听方法,Http会话的创建监听 ,
public void sessionCreated(HttpSessionEvent e) {
System.out.println("创建新会话session("+e.getSession().getId()+")");
}
//Http会话的销毁监听
public void sessionDestroyed(HttpSessionEvent e) {
System.out.println("销毁会话session("+e.getSession().getId()+")");
}
//编写操作上下文方法,监听ServletContext创建
public void contextInitialized(ServletContextEvent e) {
System.out.println("ServletContext初始化......");
}
//监听ServletContext销毁
public void contextDestroyed(ServletContextEvent e) {
System.out.println("ServletContext被销毁......");
}
}
钝化/活化
钝化/序列化/持久化:将Session内存->硬盘
Session对象的四种状态
- Session.setAttribute("a", value)将对象a
绑定
到Session中 - Session.removeAttribute("a")将对象a从Session中
解绑
(监听绑定和解绑HttpSessionBindingListener
) - 钝化
- 活化(监听钝化活化
HttpSessionActivationListener
)
- Session.setAttribute("a", value)将对象a
绑定/解绑
package com.demo.listener;
import javax.servlet.annotation.WebListener;
import javax.servlet.http.HttpSessionBindingEvent;
import javax.servlet.http.HttpSessionBindingListener;
@WebListener
public class BeanListener implements HttpSessionBindingListener {
@Override
public void valueBound(HttpSessionBindingEvent event) {
// this表示a对象
System.out.println("绑定对象ID:" + event.getSession().getId());
}
@Override
public void valueUnbound(HttpSessionBindingEvent event) {
System.out.println("解绑对象ID:" + event.getSession().getId());
}
}
<%
BeanListener BL = new BeanListener();
session.setAttribute("a", BL);
%>
钝化/活化
配置 tomcat
安装目录 /conf/context.xml
<!-- 通过配置实现钝化和活化
className="org.apache.catalina.session.PersistentManager" 固定写法
maxIdleSwap(单位:秒): 最大空闲时间,超过这个时限还未使用session,则会自动钝化
FileStore:通过该类具体实现钝化操作
directory: 钝化所在路径 相对路径(tomcat目录所在路径/work/Catalina/localhost/项目名)
-->
<Manager className="org.apache.catalina.session.PersistentManager" maxIdleSwap="5">
<Store className="org.apache.catalina.session.FileStore" directory="lq"/>
</Manager>
@WebListener
public class Listener implements HttpSessionActivationListener {
@Override
public void sessionWillPassivate(HttpSessionEvent se) {
// 钝化之前
// 这个对象会随着Session对象钝化而钝化
System.out.println("钝化前:" + se.getSession().getId());
}
@Override
public void sessionDidActivate(HttpSessionEvent se) {
// 活化之后
System.out.println("活化后:" + se.getSession().getId());
}
}
- 钝化和活化本质就是序列化和反序列化,而序列化和反序列化需要实现
Serializable
接口
HttpSessionActivationListener只是负责在session钝化和活化的时候加以监听,钝化实际执行是通过context.xml中进行配置而进行的;活化则是在获取session中某个对象时,如果该对象在内存中不存在,则会尝试从之前钝化的文件中去获取。钝化和活化可以解决太多客户端请求服务器造成session对象大量创建占用过多内存的问题,session对象太多可以将session从内存钝化到磁盘中来减轻压力;也可以解决服务器关闭重启,session丢失的问题,钝化后重启就不怕session丢失了。
Ajax
AJAX = Asynchronous JavaScript and XML(异步的 JavaScript 和 XML)。
AJAX 不是新的编程语言,而是一种使用现有标准的新方法。
AJAX 最大的优点是在不重新加载整个页面的情况下,可以与服务器交换数据并更新部分网页内容。
AJAX 不需要任何浏览器插件,但需要用户允许JavaScript在浏览器上执行。
全局刷新:请求转发/重定向
异步刷新:只刷新需要修改的地方,而页面中的其他地方保持不变。(点赞)
JS实现
<script>
function register() {
var mobile = document.getElementById("mobile").value;
// 通过Ajax异步方式请求服务端
xmlHttpRequest = new XMLHttpRequest();
// 设置xmlHttpRequest对象的回调函数
xmlHttpRequest.onreadystatechange = callBack;
xmlHttpRequest.open("post", "MyServlet", true);
xmlHttpRequest.setRequestHeader("Content-type", "application/x-www-form-urlencoded");
xmlHttpRequest.send("mobile=" + mobile); //k=v
}
// 回调函数,接收返回值
function callBack() {
if (xmlHttpRequest.readyState == 4 && xmlHttpRequest.status == 200) {
var responseText = xmlHttpRequest.responseText;
if (responseText == "true") {
} else {
}
}
}
</script>
jQuery实现
$(function(){
//请求参数
var list = {};
//还可以使用$.post $.get
$.ajax({
//请求方式
type : "POST",
//请求的媒体类型
contentType: "application/json;charset=UTF-8",
//请求地址
url : "http://127.0.0.1/admin/list/",
//数据,json字符串
data : JSON.stringify(list),
//请求成功
success : function(result) {
console.log(result);
},
//请求失败,包含具体的错误信息
error : function(e){
console.log(e.status);
console.log(e.responseText);
}
});
});
参考链接:
- https://blog.csdn.net/wxwzy738/article/details/8615244
- https://www.jianshu.com/p/c03be582a1d0
- https://blog.csdn.net/xianhenyuan/article/details/92669817
版权属于:moluuser
本文链接:https://archive.moluuser.com/archives/44/
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。