cookie,session,Filter,监听器

JavaWeb

axios和ajax的区别:

axios是通过Promise实现对ajax技术的一种封装,就像jquery对ajax的封装一样,简单来说就是ajax技术实现了局部数据的刷新,axios实现了对ajax的封装,axios有的ajax都有,ajax有的axios不一定有,总结一句话就是axios是ajax,ajax不止axios。

axios实现天气转换

查看代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<!--
  在后台准备一个map集合,
  key:城市
  value:天气

  当点击搜索按钮,把文本框输入的城市发送到后台,在后台接收城市名称
  根据城市名称去map集合中获取对应的天气,再把天气返回给前台。
  展示到下方的span中。

  点击这5个超链,也可以获取对应的城市天气!
-->
<div id="app">
    <input  v-model="weather" type="text" @keyup.delete="del"
            @input="del" @keyup.enter="weas"><!-- 键盘删除,文本框改变 -->
    <input type="button" value="搜索" @click="weas"><br>
    <span v-for="(city,index) in hotCity">
        <!-- 阻止标签刷新 href="javascript:void(0)" -->
        <a href="" @click.prevent="weas1(city)">{{city}}</a>
    </span>
    <hr>
    <span v-show="isShow">{{weather}}今天的天气是{{message}} </span>
</div>

    <script src="../static/vue/vue2.js"></script>
    <script src="../static/axios/axios.min.js"></script>
    <script>
        const app = new Vue({
            el:"#app",
            data:{
                weather:"",
                hotCity:["北京","上海","广州","深圳","杭州"],
                message:"",
                isShow:false,
            },
            methods:{
                del(){
                    this.isShow = false;
                },
                weathers(){
                    if(this.weather != ""){
                        let ch = new XMLHttpRequest();
                        ch.open("GET","../weather.do?weather=" + this.weather);
                        ch.send(null);
                        ch.onreadystatechange = function (){
                            if (this.readyState == 4) {
                                console.log(this.responseText);
                                let responseText = this.responseText;
                                wea = responseText;
                            }
                        }
                    }
                },
                weas(){
                    // 外部的 this 代表 app 实例
                    // 内部的 this 代表 方法的调用者,对象
                    // 回调函数写法
                    //      正常匿名函数:this指向函数的调用者
                    //      箭头函数:this还是之前的this
                    //      只要写了function,this就会变化

                   /*
                   可以把之前的this存住
                   let _this = this;
                   axios.get("weather.do?name=" + this.weather)
                        .then(function (response){ // 回调函数
                            // this.message
                            // 可以用app对象
                            // app.message = response.data;
                            _this.message = response.data;
                    });       */
                    axios.get("weather.do?name=" + this.weather)
                        .then( (response) => { // 回调函数
                            this.message = response.data;
                            this.isShow = true;
                        });

                },
                weas1(weather){
                    // a 标签事件
                    this.weather = weather;
                    this.weas();
                },
            },
        });

    </script>
</body>
</html>
查看代码
 package ajax;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.HashMap;
import java.util.Map;

@WebServlet("/weather.do")
public class WeatherServlet extends HttpServlet {
    Map<String,String> map = new HashMap<>();

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        map.put("a","123");
        map.put("b","456");
        map.put("c","122");
        req.setCharacterEncoding("utf-8");

        String weather = req.getParameter("weather");
        PrintWriter out = resp.getWriter();

        resp.setCharacterEncoding("utf-8");
        resp.addHeader("content-type","text/html;charset=utf-8");
        for (Map.Entry<String, String> entry : map.entrySet()) {
            String mapKey = entry.getKey();
            if(mapKey.equals(weather)){
                out.write(map.get(mapKey));
                break;
            }
        }


    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

 

COOKIE

http 不能保存状态,如保存密码自动登录,自动登录什么时候失效

cookie:保存 http 状态,保存在客户端,浏览器上,登录信息以键值对形式保存,不安全

 

使用 cookie 步骤

1. 创建 cookie 对象

2. 设置最大时效

3. 把 cookie 放入 http 响应头中

@WebServlet("/cookie.do")
public class CookieServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取cookie
        Cookie[] cookies = req.getCookies();
        if(Objects.nonNull(cookies) && cookies.length > 0){
            // 有cookie
            for (Cookie cookie : cookies) {
                if(cookie.getValue().equals("admin")){
                    System.out.println(cookie.getName() + cookie.getValue());
                }
            }
        }else {
            System.out.println("没有发现cookie");
            String name = req.getParameter("name");
            String pass =  req.getParameter("pass");

            Cookie cookie = new Cookie(name,pass);
            /*
             设置cookie最大时效
             cookie.setMaxAge(10);
             把 cookie 放入 http 响应头中
            */
            resp.addCookie(cookie);
            resp.sendRedirect("success.html");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

 

SESSION

session:HttpSession  会话

创建session

@WebServlet(name = "SessionServlet",value = "/session.do")
public class SessionServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 获取 session
        // 会话
        HttpSession session = req.getSession();
        String username = req.getParameter("username");
        // 把 username 放到 session中
        session.setAttribute("username",username);
        resp.sendRedirect("success.html");

        // session.setMaxInactiveInterval(1000);设置过期时间

        // 令session销毁
        // session.invalidate();

        // 删除key值对应的属性
        session.removeAttribute("");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

session 中数据什么时候失效

  1. 过期           

  2. 关闭浏览器(并不能完全销毁session.JSESSIONID,根据JSESSIONID找到之前的session)

  3. 调用 session 销毁的方法

网站上安全退出原理是销毁 session 

 

过滤器:Filter

是 javaweb 的一个重要组件,可以对发送到 servlet 的请求进行拦截过滤,也可以对响应进行拦截

Filter 是实现了 Filter 接口的 java 类

Filter 需要在 web.xml中进行注册,也可以通过注解来注册

 

创建一个 Filter 

需要实现 Filter 接口

implements Filter

初始化

@Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // System.out.println("Filter init 初始化");
    }

再创建 Filter 对象,再 servlet 容器(tomcat)加载当前web应用(当前工程)被调用

只执行一次,当前 Filter 的初始化操作,Filter 和 Servlet 都是单例的

filterConfig 类似于 ServletConfig,获取初始化参数

 

过滤请求的方法

@Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        System.out.println("Filter doing..");
        // 放行请求
        String name = servletRequest.getParameter("name");
        if(Objects.equals(name,"a")){
            filterChain.doFilter(servletRequest,servletResponse);
            return;
        }
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpServletRequest  request = (HttpServletRequest) servletRequest;
        response.sendRedirect(request.getContextPath() + "/filter/test.html");
    }

真正Filter要处理的逻辑代码,每次拦截都会调用这个方法

ServletRequest:当请求来的时候,实例化的还是HttpServletRequest

ServletResponse:当请求来的时候,实例化的还是HttpServletResponse

FilterChain:过滤器链,一个项目中可以有多个过滤器,会形成一个链,当前过滤器,要把请求传给下一个过滤器

Filter执行顺序

xml文件<filter-mapping>的上下顺序有关

注解是文件名顺序

 

这里的请求响应参数,实际就是 HttpServletRequest 和 HttpServletResponse

由于形参声明的父类类型,发生了向上转型

ServletResponse 和 HttpServletResponse

 

由于子类对象调父类方式,随便调

父类对象想调子类方法,不行,除非再向下转型

说明sendRedirect是子类特有的方法

需要向下转型,但是有风险

只要地址栏不改变,request永远是同一个

 

销毁

@Override
    public void destroy() {
        // System.out.println("Filter 销毁");
    }

 

 案例:网站防止盗链

@WebFilter("/afternoon/vip.html")
public class LoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpSession session = request.getSession();
        Object card = session.getAttribute("card");
        //      如果从session中获取的数据为null,则说明盗链过来的,没有登录过
        if(Objects.isNull(card)){
            response.sendRedirect(request.getContextPath() + "/afternoon/main.html");
            return;
        }
//      如果从session中获取的数据不为null,则说明登录成功了,放行
        filterChain.doFilter(servletRequest,servletResponse);
    }
}
@WebServlet("/main.do")
public class MainServlet extends HttpServlet {

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String card = req.getParameter("card");
        if(Objects.equals(card,"80011234")){
//           如果登录成功,那我就把你的信息放入到session里
            req.getSession().setAttribute("card",card);
            resp.sendRedirect(req.getContextPath() + "/afternoon/vip.html");
        }else {
            resp.sendRedirect(req.getContextPath() + "/afternoon/main.html");
        }
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }
}

 

 字符编码集过滤器

@WebFilter("/*")
public class EncodingFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletResponse response = (HttpServletResponse)servletResponse;

        servletRequest.setCharacterEncoding("utf-8");
        servletResponse.setCharacterEncoding("utf-8");

        // 给response添加响应头,text/html,后台向前台输出字符串的时候
        // 当前台前后台输出是json格式,不需要设置这个
        response.addHeader("content-type","text/html;charset=utf-8");
        // 放行
        filterChain.doFilter(servletRequest,servletResponse);
    }
}

 

监听器(Listener)

专门用于对其他对象身上发生的事件或状态改变进行监听和相应的处理

分类:

1.监听域对象自身的创建和销毁

2.监听域对象中属性的增加和删除

3.监听绑定到session中某个对象状态的事件监听

java(ee)三大件

  • servlet
  • filter
  • listener
public class HelloSessionListener implements HttpSessionActivationListener {
    /*
       钝化
       向磁盘中写入session对象
     */
    @Override
    public void sessionWillPassivate(HttpSessionEvent se) {
        HttpSessionActivationListener.super.sessionWillPassivate(se);
    }

    /*
       活化
       从磁盘中读取session对象
     */
    @Override
    public void sessionDidActivate(HttpSessionEvent se) {
        HttpSessionActivationListener.super.sessionDidActivate(se);
    }
}
public class HelloListener implements HttpSessionListener, ServletRequestListener, ServletContextListener {
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        ServletContextListener.super.contextInitialized(sce);
    }

    @Override
    public void contextDestroyed(ServletContextEvent sce) {
        ServletContextListener.super.contextDestroyed(sce);
    }

    @Override
    public void requestDestroyed(ServletRequestEvent sre) {
        ServletRequestListener.super.requestDestroyed(sre);
    }

    @Override
    public void requestInitialized(ServletRequestEvent sre) {
        ServletRequestListener.super.requestInitialized(sre);
    }

    @Override
    public void sessionCreated(HttpSessionEvent se) {
        HttpSessionListener.super.sessionCreated(se);
    }

    @Override
    public void sessionDestroyed(HttpSessionEvent se) {
        HttpSessionListener.super.sessionDestroyed(se);
    }
}
@WebListener()
public class HelloAttributeListener implements ServletContextAttributeListener, ServletRequestAttributeListener {
    @Override
    public void attributeAdded(ServletContextAttributeEvent scae) {
        ServletContextAttributeListener.super.attributeAdded(scae);
    }

    @Override
    public void attributeRemoved(ServletContextAttributeEvent scae) {
        ServletContextAttributeListener.super.attributeRemoved(scae);
    }

    @Override
    public void attributeReplaced(ServletContextAttributeEvent scae) {
        ServletContextAttributeListener.super.attributeReplaced(scae);
    }

    @Override
    public void attributeAdded(ServletRequestAttributeEvent srae) {
        ServletRequestAttributeListener.super.attributeAdded(srae);
    }

    @Override
    public void attributeRemoved(ServletRequestAttributeEvent srae) {
        ServletRequestAttributeListener.super.attributeRemoved(srae);
    }

    @Override
    public void attributeReplaced(ServletRequestAttributeEvent srae) {
        ServletRequestAttributeListener.super.attributeReplaced(srae);
    }
}

 

posted @ 2022-09-02 18:30  一只神秘的猫  阅读(46)  评论(0)    收藏  举报