Servlet---登录和过滤器

登录

基本思路

正常的登录界面,需要键入用户名密码,用户名密码正确可以进入之后的操作;用户名密码错误则要重试。最后要有退出登录功能。
有关用户的信息不仅仅只用用户名和密码,还会有年龄,性别等一系列信息。
所以我们需要写一个用户servlet,一个登录界面和一个登录失败页面。其中用户userServlet需要能查找用户的其他信息,能跳转到登录和登录失败界面,可以用一个if实现。
在这里插入图片描述

代码

userServlet

@WebServlet("/user")
public class userServlet extends HttpServlet {
    @Override
    protected void service(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        req.setCharacterEncoding("UTF-8");

        String method = req.getParameter("method");
        if (method == null || method.equals("")){
            method = "login";
        }
        switch (method){
            case "login":
                login(req,resp);
                break;
            case "logout":
                logout(req,resp);
                break;
        }
    }

    private void logout(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        System.out.println("userServlet.logout");

        HttpSession httpSession = req.getSession();
        httpSession.invalidate();

        resp.sendRedirect(req.getContextPath() + "/login.jsp");
    }

    private void login(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        System.out.println("userServlet.login");

        String name = req.getParameter("name");
        int password = Integer.parseInt(req.getParameter("password"));
        Connection connection = null;
        PreparedStatement preparedStatement = null;
        ResultSet resultSet = null;
        User user = null;
        try {
            connection = JDBCUtil.getConnection();
            String sql = "SELECT id,age,gender,level FROM user WHERE name=? AND password=?";
            preparedStatement = connection.prepareStatement(sql);
            preparedStatement.setString(1,name);
            preparedStatement.setInt(2,password);
            resultSet = preparedStatement.executeQuery();
            while (resultSet.next()){
                int id = resultSet.getInt("id");
                int age = resultSet.getInt("age");
                String gender = resultSet.getString("gender");
                int level = resultSet.getInt("level");
                user = new User(id,name,password,age,gender,level);
            }
        } catch (SQLException throwables) {
            throwables.printStackTrace();
        }finally {
            JDBCUtil.close(connection,preparedStatement,resultSet);
        }
        if (user != null) { // 有这个用户登录成功
            HttpSession session = req.getSession();
            session.setAttribute("user", user);
            // /JavaWeb/
            resp.sendRedirect(req.getContextPath() + "/");
        } else { // 用户名或者密码错误,没有这个用户
            resp.sendRedirect(req.getContextPath() + "/fail.jsp");
        }
    }
}

登录界面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
<form action="<%=request.getContextPath()%>/user?method=login" method="post">
    用户名:<input type="text" name="name"/><br/>
    密码:<input type="password" name="password"/><br/>
    <input type="submit" value="登录"/>
</form>
</body>
</html>

登录失败界面

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>Title</title>
</head>
<body>
用户名或密码错误<br/>
<a href="<%=request.getContextPath()%>/login.jsp">重试</a>
</body>
</html>

过滤器

有了登录操作让我们更安全的访问界面进行操作,但是有重大bug,当我们不通过进入登录而直接访问所需界面地址是可以直接到达界面的,而每一个都加上登录method太过于繁杂,所以用过滤器。

为什么要用过滤器?
项目开发中,经常会用到重复代码的实现。
1、请求每个servlet都要设置编码
2、判断用户是否登录,只有登录了才有操作权限。

注意

1.

interface FilterChain 过滤链:
执行一个过滤器后执行下一个或者放行
放行:

doFilter(ServletRequest request, ServletResponse response)

2.

这一句很重要,当扫描到这一句时会意识到这是一个Filter,如果没有那么Filter会变成一个普通的类。所以,如果想Filter失去作用只需要注释掉这句。

@WebFilter(filterName = "login", urlPatterns = "/*")

3.

 public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) 

这里的request和response不同于req和resp,request和response是req和resp的父类,没有转发、重定向等方法,用到时需要强制转化,如:

 HttpServletRequest httpServletRequest = (HttpServletRequest) request;
 HttpServletResponse httpServletResponse = (HttpServletResponse) response;

4.

Filter的三个生命历程(init,doFilter,destroy)都要有。

代码

@WebFilter(filterName = "login", urlPatterns = "/*")
public class loginFilter implements Filter {
    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        System.out.println("loginFilter.init");
    }

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

        HttpServletRequest httpServletRequest = (HttpServletRequest) request;
        HttpServletResponse httpServletResponse = (HttpServletResponse) response;

        String servletPath = httpServletRequest.getServletPath();
        System.out.println("servletPath = " + servletPath);
        String method = httpServletRequest.getParameter("method");
        System.out.println("method = " + method);

        if (servletPath.equals("/login.jsp") ||
                (servletPath.equals("/user") && method.equals("login"))
                 || servletPath.equals("/fail.jsp")){
            chain.doFilter(request,response);
            return;
        }

        HttpSession httpSession = httpServletRequest.getSession();
        User user = (User) httpSession.getAttribute("user");
        System.out.println("user = " + user);

        if (user == null){
            httpServletResponse.sendRedirect(httpServletRequest.getContextPath() + "/login.jsp");
            return;
        }
        chain.doFilter(request,response);
    }

    @Override
    public void destroy() {
        System.out.println("loginFilter.destroy");
    }
}

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: javax.servlet-api 3.0.1是Java Servlet规范的一个实现,它是JavaEE的一部分,用于开发基于HTTP协议的Web应用程序。 javax.servlet-api 3.0.1提供了一系列的类和接口,用于处理HTTP请求和响应。它定义了Servlet和相关的API,包括Servlet容器、Session管理、过滤器、监听器等。开发人员可以使用这些API来编写Servlet,处理来自客户端的请求,并生成响应。 通过使用javax.servlet-api 3.0.1,开发人员可以创建具有动态功能的Web应用程序。例如,他们可以接收用户表单提交的数据,处理并返回结果。他们还可以访问HTTP请求的头部信息、请求参数、Cookie等,并根据需要执行相应的操作。 此外,javax.servlet-api 3.0.1还简化了Web应用程序的开发和部署。它提供了一套标准的API和规范,保证了Web应用程序的可移植性。无论是部署在任何支持Servlet规范的容器中,都可以保证Web应用程序的运行。 总结来说,javax.servlet-api 3.0.1是一个用于开发基于HTTP协议的Web应用程序的Java库。它提供了一套标准的API和规范,简化了Web应用程序的开发和部署,并且具有高度的可移植性和灵活性。 ### 回答2: javax.servlet-api 3.0.1 是 Java Servlet 规范的一个实现。Java ServletJavaEE(现在的 Jakarta EE)规范中的一部分,用于开发基于Java的Web应用程序。 javax.servlet-api 3.0.1 提供了一套类和接口,用于处理 HTTP 请求和响应。它定义了 Servlet 接口,开发人员可以通过继承该接口来创建自己的 ServletServlet 是在服务器上运行的 Java 类,用于处理客户端的请求,并生成响应。 javax.servlet-api 3.0.1 还定义了一些与会话管理、过滤器、监听器和错误处理等相关的类和接口。它使开发人员能够更方便地处理与 Web 应用程序相关的功能,如用户身份验证、页面重定向和会话跟踪等。 通过使用 javax.servlet-api 3.0.1,开发人员可以创建灵活、可扩展和安全的 Web 应用程序。它提供了可重用的组件,可以处理各种请求和响应,并能够与不同的服务器和容器进行集成。此外,它还提供了一些工具类和接口,用于管理 Web 应用程序的配置和部署。 总结来说,javax.servlet-api 3.0.1 是用于开发基于 Java 的 Web 应用程序的一个组件。它提供了处理 HTTP 请求和响应的类和接口,以及与会话管理、过滤器、监听器和错误处理等相关的功能。通过使用 javax.servlet-api 3.0.1,开发人员可以创建高效、可扩展和安全的 Web 应用程序。 ### 回答3: javax.servlet-api是用于Java Servlet规范的官方API。它提供了开发基于Java的Web应用程序所需的所有必要功能和接口。javax.servlet-api 3.0.1是javax.servlet-api的一个特定版本,它是该API的第3个大版本中的一个小更新。 javax.servlet-api 3.0.1包含了一系列的类和接口,用于处理HTTP请求和响应,以及管理会话、过滤器和监听器等Web应用程序开发的关键组件。 例如,它提供了HttpServletRequest和HttpServletResponse接口,以便开发人员能够读取和处理客户端发送的HTTP请求,并生成对客户端的HTTP响应。此外,它还提供了ServletContext接口,用于在应用程序级别共享数据和资源。 javax.servlet-api 3.0.1还引入了一些新特性,如Servlet 3.0的异步支持,允许开发人员在处理请求和生成响应时进行异步操作。这使得在处理大量请求时能够提供更好的性能和可伸缩性。 总之,javax.servlet-api 3.0.1是一个重要的Java Web开发工具,为开发人员提供了处理HTTP请求和响应、管理会话等关键功能的API。它是遵循Java Servlet规范的一部分,并且在Web应用程序开发中被广泛使用。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值