Filter和ServletContext和Listener

目录

Filter案例

解决全站乱码问题

登录权限校验

ServletContext对象

Listener(监听器)


Filter案例

解决全站乱码问题

我们每次访问每个servlet都要书写处理请求和响应乱码的代码,这样代码十分冗余,所以我们可以在过滤中

@WebFilter("/*")
public class EncodeFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        //your code..
        //解决请求乱码
        request.setCharacterEncoding("utf-8");
        //解决响应乱码
        response.setContentType("text/html;charset=utf-8");
       
        //放行
        filterChain.doFilter(request,response);
    }

    @Override
    public void destroy() {

    }
}
@WebServlet("/servletDemo1")
public class servletDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        String username = request.getParameter("username");
        System.out.println(username);
        response.getWriter().print("哈哈哈");
    }

    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        doGet(request, response);
    }
}
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
<form action="/servletDemo1" method="post">
    <input type="text" name="username">
    <input type="submit" value="提交">
</form>
</body>
</html>

登录权限校验

步骤

        1.访问hhh.html这个页面时必须先要登录,不登录不能访问,使用过滤器代码书写代码让其跳转到登录页面login.html

         2.登录loginServlet中获取用户名和密码,存到user对象中,然后存在session中(不关闭服务器,这个session就一直在服务器里面),最后重定向到hhh.html

        3. 使用一个过滤器对hhh.html进行拦截,先从session中获取用户信息,如果没有登录,获取的是null,就跳转到登录页面,如果不为null,说明登录成功,放行

 hhh.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Title</title>
</head>
<body>
    <h1>这就是终极文件</h1>
</body>
</html>

login.html

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>登录</title>
</head>
<body>
<form action="/loginServlet" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="pwd"><br>
    <input type="submit" value="提交">
</form>
</body>
</html>

loginServlet

@WebServlet("/loginServlet")
public class loginServlet extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取请求参数
        String username = request.getParameter("username");
        String pwd = request.getParameter("pwd");
        User user = new User();
        user.setUsername(username);
        user.setPwd(pwd);
        //这里在实际开发中,应该调用业务层的方法,与数据库交互
        //获取session对象
        HttpSession session = request.getSession();

        session.setAttribute("u",user);

        //登陆成功,就跳转到hhh.html
        response.sendRedirect("/hhh.html");
    }

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

loginFilter过滤器,过滤hhh.html


@WebFilter("/hhh.html")
public class loginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        HttpServletRequest request = (HttpServletRequest) servletRequest;
        HttpServletResponse response = (HttpServletResponse) servletResponse;
        //your code..
        //从session中获取对象
        HttpSession session = request.getSession();
        User u = (User) session.getAttribute("u");
        if(u==null){
            //没有登录
            //跳转到登录页面
            response.sendRedirect("/login.html");
        }else{
            //放行
            filterChain.doFilter(request,response);
        }

    }

    @Override
    public void destroy() {

    }
}

先登录

在显示页面

ServletContext对象

可以共享数据的对象

1.request:只能在一次请求一次响应中进行数据共享-->请求转发

2.session:只能在一次会话过程中,可以有多次请求和响应

3.ServletContext:只要项目存在就可以共享数据,多次会话,多次请求多次响应都可以共享数据,操作整个项目的配置文件

范围大小:

ServletContext>session>request

ServletContext属于接口,在tomcat启动的时候tomcat创建门面类(ServletContext的子类)

我们可以在Servlet类中直接获取ServletContext对象;getServletContext()属于父类GenericServlet中的方法

@WebServlet("/servletContextDemo1")
public class servletContextDemo1 extends HttpServlet {
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取ServletContext对象
        ServletContext servletContext = getServletContext();
        //获取指定文件的MIME类型
        String mimeType = servletContext.getMimeType("demo1.html");//相对于webapp的路径
        System.out.println("mimeType="+mimeType);//mimeType=text/html
        //获取指定文件的真实路径
        String realPath = servletContext.getRealPath("demo1.html");
        System.out.println("realPath="+realPath);
        //realPath=D:\java code\web6_filter_listener\target\web6_filter_listener-1.0-SNAPSHOT\demo1.html
    }

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

 

Listener(监听器)

说明:
         javaweb的监听器就是监听ServletContext HttpServletRequest HttpSession这三个对象的创建和销毁,同时监听是哪个对象数据的变化,就是监听属性的变化:setAttibute(),removeAttribute()

1.ServletContext是tomcat启动创建,关闭tomcat销毁

2.HttpServlet是浏览器第一次访问执行request.getSession()创建,销毁时间 1)30min 2)执行invalidate()

3.HttpServletRequest时浏览器第一次访问Servlet创建,浏览器收到服务器的响应就销毁

//配置监听器
@WebListener
public class conTextListerner implements ServletContextListener {//实现接口
    //当ServletContext创建(启动tomcat)时执行该方法
    @Override
    public void contextInitialized(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext创建");
    }
    //当ServletContext(关闭tomcat)销毁时执行该方法
    @Override
    public void contextDestroyed(ServletContextEvent servletContextEvent) {
        System.out.println("ServletContext销毁");
    }
}

 不使用注解可以在web.xml中配置

<!--    配置监听器-->
    <listener>
        <listener-class>com.hhh.listener.conTextListerner</listener-class>
    </listener>

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

落落落sss

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值