JSP&Servlet(14)——使用Filter实现登录拦截和字符转化功能

说明

登录拦截即是登录权限控制:进入首页、登录页以及登录servlet时,不用验证权限;进入其它页面时,须验证是否登录,未登录则跳转到登录页。

字符转化即是实现对中文乱码的解决,将字符转化成UTF-8。

效果展示

账号是“张三”,密码是“123456”。

在未登录成功之前,是不能在地址栏中输入其他文件路径进入的。

代码结构

源码

java

CheckLoginFilter.java

如果未登录成功则进行拦截。

package filter;

import javax.servlet.*;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class CheckLoginFilter implements Filter {

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {

    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 将ServletRequest对象转换成HttpServletRequest对象
        HttpServletRequest req = (HttpServletRequest) servletRequest;
        // 将ServletResponse对象转换成HttpServletResponse对象
        HttpServletResponse resp = (HttpServletResponse) servletResponse;
        // 获取用户请求的URL
        String uri = req.getRequestURI();
        // 判断用户的请求没包含login.jsp页面并且session中的u值为空,则将flag标志设置为false,如果flag标志为false则跳转到登录页面,或者留给下一个Filter进行处理
        // flag是登录成功标志
        boolean flag = true;
        // req.getSession().getAttribute("u") == null获取保存在session中的登录状态,如果为null表示未登录,否则表示已经登录
        if (uri.indexOf("login") == -1 && req.getSession().getAttribute("u") == null) {
            flag = false;
        }
        // 对登录登录标志进行判断
        if (flag) {// 如果登录成功,则到下一个过滤器
            filterChain.doFilter(req, resp);
        } else {// 如果未登录,则跳转到登录页面进行登录
            resp.sendRedirect("login.jsp");
        }
    }

    @Override
    public void destroy() {

    }
}

EncodingFilter.java

将编码设置为UTF-8。

package filter;

import javax.servlet.*;
import java.io.IOException;

public class EncodingFilter implements Filter {
    private String encoding = null;
    private FilterConfig config;

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        this.config = filterConfig;
    }

    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        // 判断的encoding是否为null
        if (encoding == null) {
            // 如果为null,则采用FilterConfig的config对象读取编码,encoding编码在配置文件web.xml中定义
            encoding = config.getInitParameter("encoding");
        }
        if (encoding != null) {
            // 通过request对象将编码设置为encoding的值
            servletRequest.setCharacterEncoding(encoding);
            // response对象设置页面的类型和字符编码
            servletResponse.setContentType("text/html;charset=" + encoding);
        }
        // 将请求传到下一个过滤器处理
        filterChain.doFilter(servletRequest, servletResponse);
    }

    @Override
    public void destroy() {

    }
}

LoginServlet.java

处理登录,对登录状态进行判断及处理。

package servlet;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

public class LoginServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 获取前端的用户名
        String username = request.getParameter("username");
        // 获取前端的密码
        String password = request.getParameter("password");
        // 对用户名和密码进行验证
        if (username.equals("张三") && password.equals("123456")) {
            // 将登录成功这个状态保存到session中
            request.getSession().setAttribute("u", username);
            // 验证登录成功则跳转到index.jsp主页
            request.getRequestDispatcher("index.jsp").forward(request, response);
        } else {
            // 验证登录失败则跳转到login.jsp登录页面进行登录
            request.getRequestDispatcher("login.jsp").forward(request, response);
        }
    }

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

web

web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee"
         xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
         version="2.5">
    <!--欢迎页面-->
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <!--登录Servlet-->
    <servlet>
        <servlet-name>LoginServlet</servlet-name>
        <servlet-class>servlet.LoginServlet</servlet-class>
    </servlet>
    <servlet-mapping>
        <servlet-name>LoginServlet</servlet-name>
        <url-pattern>/loginServlet</url-pattern>
    </servlet-mapping>
    <!--过滤器-->
    <filter>
        <filter-name>CheckLogin</filter-name>
        <filter-class>filter.CheckLoginFilter</filter-class>
    </filter>
    <filter-mapping>
        <filter-name>CheckLogin</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <filter>
        <filter-name>EncodingFilter</filter-name>
        <filter-class>filter.EncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>EncodingFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

index.jsp

主页面。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>首页</title>
</head>
<body>
    <%=(String)session.getAttribute("u")%>
</body>
</html>

login.jsp

登录页面。

<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
    <title>登录</title>
</head>
<body>
<form action="loginServlet" method="post">
    用户名:<input type="text" name="username"><br>
    密码:<input type="password" name="password"><br>
    <input type="submit" value="登录">
    <input type="reset" value="重置">
</form>
</body>
</html>

 

如果对完整源码感兴趣。

可搜索微信公众号【Java实例程序】或者扫描下方二维码关注公众号获取更多。

注意:在公众号后台回复【CSDN201910082111】可获取本节源码。

  • 0
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Filter过滤器是Java Web中的一种组件,用于在请求到达Servlet之前或者响应离开Servlet之后对请求和响应进行预处理和后处理。Filter可以用于实现很多功能,例如登录验证、字符编码转换、日志记录等。下面是一个登录功能拦截的例子: 1.创建一个实现Filter接口的过滤器类,重写doFilter方法,在该方法中实现登录验证逻辑。 2.在web.xml文件中配置该过滤器,指定需要拦截的URL路径。 3.在登录页面的Servlet中,判断用户是否已经登录,如果已经登录则跳转到主页,否则跳转到登录页面。 4.在主页的Servlet中,判断用户是否已经登录,如果没有登录则跳转到登录页面。 下面是一个简单的登录功能拦截的例子: ``` public class LoginFilter implements Filter { @Override public void init(FilterConfig filterConfig) throws ServletException { } @Override public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { HttpServletRequest req = (HttpServletRequest) request; HttpServletResponse resp = (HttpServletResponse) response; HttpSession session = req.getSession(); String uri = req.getRequestURI(); if (uri.endsWith("login.jsp") || uri.endsWith("login.do")) { chain.doFilter(request, response); } else { String username = (String) session.getAttribute("username"); if (username == null) { resp.sendRedirect("login.jsp"); } else { chain.doFilter(request, response); } } } @Override public void destroy() { } } ``` 在web.xml文件中配置该过滤器: ``` <filter> <filter-name>LoginFilter</filter-name> <filter-class>com.example.LoginFilter</filter-class> </filter> <filter-mapping> <filter-name>LoginFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值