过滤器

@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的常用属性

属性名类型描述
filterNameString指定过滤器的 name 属性,等价于 <filter-name>
valueString[]该属性等价于 urlPatterns 属性。但是两者不应该同时使用。
urlPatternsString[]指定一组过滤器的 URL 匹配模式。等价于 <url-pattern> 标签。
servletNamesString[]指定过滤器将应用于哪些 Servlet。取值是 @WebServlet 中的 name 属性的取值,或者是 web.xml 中 <servlet-name> 的取值。
dispatcherTypesDispatcherType指定过滤器的转发模式。具体取值包括:ASYNC、ERROR、FORWARD、INCLUDE、REQUEST。
initParamsWebInitParam[]指定一组过滤器初始化参数,等价于 <init-param> 标签。
asyncSupportedboolean声明过滤器是否支持异步操作模式,等价于 <async-supported> 标签。
descriptionString该过滤器的描述信息,等价于 <description> 标签。
displayNameString该过滤器的显示名,通常配合工具使用,等价于 <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对象的四种状态

    1. Session.setAttribute("a", value)将对象a 绑定到Session中
    2. Session.removeAttribute("a")将对象a从Session中 解绑(监听绑定和解绑 HttpSessionBindingListener)
    3. 钝化
    4. 活化(监听钝化活化 HttpSessionActivationListener)

绑定/解绑

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接口

Ajax

全局刷新:请求转发/重定向
异步刷新:只刷新需要修改的地方,而页面中的其他地方保持不变。(点赞)

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

参考链接:




扫一扫在手机打开当前页