Servlet_Cookie&Filter

1.Cookie 和 Session:

        相同点:        都可以用来保存数据

        不同点:       

                Cookie的数据保存在浏览器端(客户端会话技术),有数据大小限制,相对不安全

                Session保存的数据在服务器端(服务器端会话技术),没有数据大小限制,数据安全

        会话:       一次会话中包含多次请求和响应

                一次会话,即浏览器第一次给服务器资源发送请求,此时会话建立,直到有一方断开为止

        功能: 在一次会话的范围内多次请求间,共享数据,如登录淘宝成功后,点击购物车,无需重复登录

2.Cookie:        作用:  存储少量的不太敏感的数据;不登录的情况下,完成服务器对客户端的身份识别

        Cookie的使用:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    /* 
     * 1. 创建Cookie对象,绑定数据 new Cookie(String name,String value)
     * 2. 发送Cookie对象到浏览器    response.addCookie(Cookie cookie)
     * 3. 获取Cookie,取数据    request.getCookies()
     */
    Cookie cookie = new Cookie("localhost","128.0.0.1");
    
    response.addCookie(cookie);// 可以创建多个Cookie对象,即多次调用addCookie方法

    // Cookie[] cookies = request.getCookies();// 通过 .getName() 和 .getValue() 获取数据
}

        cookie数据在浏览器中保存时间:

 @Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        /*
         * 1. 默认情况下,浏览器关闭后,Cookie中的数据被销毁
         * 
         * 2. 设置cookie在浏览器端的失效时间:    cookie对象.setMaxAge(时间);
         *     正数: 将Cookie数据写到磁盘文件中,并指定存活时间,时间到后,cookie文件自动失效
         *     负数: 默认值
         *     零:    删除cookie信息
         */
        Cookie cookie = new Cookie("localhost","128.0.0.1");
        
        cookie.setMaxAge(24 * 3600);// 单位秒
        response.addCookie(cookie);
}

        cookie存储中文数据:

@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    // 使用URL编码存储,URL解码解析

    // URL编码
    String str_value = URLEncoder.encode(value,"utf-8");

    // URL解码
    str_value = URLDecoder.decode(value,"utf-8");
}

3.Session:       

        获取对象:        request.GetSession();

        存取数据:        getAttribute(String name)        setAttribute(String name,Object value)

        :

                a.客户端关闭后,服务器不关闭,两次获取的session不同(如需相同,可以通过创建Cookie键为JSESSIONID,并延长cookie时间来实现)

                b.客户端不关闭,服务器关闭,两次获取的session不同

4.Json:

        导包:        

        JSONObject 和 JSONArray:

        /*
         * new JSONObject(参数):
         * 
         * 可以将 JavaBean/map集合 变成一个 json规范的数据
         */
        JSONObject jsonObject = new JSONObject();

        /*
         * new JSONArray(参数):
         * 
         * 如果是List<实体类>或List<Map<String,Object>>时,使用JSONArray将其变成json规范
         */
        JSONArray jsonArray = new JSONArray();

        json工具类:        fastjson                                

5.Filter:         过滤器:        当访问服务器的资源时,filter将请求拦截下来,完成一些业务操作

        基本使用:

                实现Fliter接口,并复写doFilter方法:

// @WebFilter("需要拦截的资源") // 使用注解就可以不用配置xml
public class _01_HelloFilter implements Filter {// 实现Filter接口

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
            ServletException {
        System.out.println("_01_HelloFilter start");

        // chain.doFilter(): 放行
        chain.doFilter(request, response);

        System.out.println("_01_HelloFilter end");
    }

    /**
     * 初始化数据
     * 
     * @see javax.servlet.Filter#init(javax.servlet.FilterConfig)
     */
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        // filterConfig可以获取xml中的全局参数和局部参数
    }

    /**
     * 销毁方法
     * 
     * @see javax.servlet.Filter#destroy()
     */
    @Override
    public void destroy() {

    }

}

                web.xml中进行注册:        注: /* 为拦截所有资源

                 注:       

                        Filter可以有多个,即在xml中注册多个,哪个filter的mapping先写,在访问同一过滤资源时就先执行哪个

        应用:

                设置字符编码:

    @Override
    public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException,
            ServletException {
        // 获取xml中的全局变量
        String encoding = request.getServletContext().getInitParameter("encoding");
        if (encoding == null || encoding.trim().equals("")) {
            encoding = "utf-8";// 设置utf-8编码
        }
        request.setCharacterEncoding(encoding);
        response.setCharacterEncoding(encoding);
        response.setContentType("text/html;charset=utf-8");
        chain.doFilter(request, response);
    }

                 检验用户是否登录:        (登录成功后将用户名存入session域中,后期通过filter来判断是否登录,如没有登录,不能访问其他网页,直接跳转到登录页面)

6. Listener:(监听器)        

        ServletContextListener:        (监听器之一)监听ServletContext对象的创建和销毁

// @WebListener    // 使用注解,就可以不用配置xml
public class ContextLoaderListener implements ServletContextListener {
    /**
     * 
     * ServletContext对象创建后会调用该方法
     * 
     * @see javax.servlet.ServletContextListener#contextInitialized(javax.servlet.ServletContextEvent)
     */
    @Override
    public void contextInitialized(ServletContextEvent sce) {
        // 通常在contextInitialized()方法中,我们会进行资源文件的加载
        // sce.getServletContext().getInitParameter("password");
    }

    /**
     * 
     * ServletContext对象被销毁之前会调用该方法
     * 
     * @see javax.servlet.ServletContextListener#contextDestroyed(javax.servlet.ServletContextEvent)
     */
    @Override
    public void contextDestroyed(ServletContextEvent sce) {

    }

}

 7.常见问题:

        500:        服务器内部排错

        404:        主要就是前后端路由的问题,肯定不一致

                先看地址栏 , 地址栏的url是否和你写的一样

                再看错误信息,会说明 哪个路径没有找到

        405:        说明 你当前是get请求,而 后端是doPost方法

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值