JavaWeb购物系统(八)购物系统权限验证(使用Filter过滤器拦截未登录用户非法访问)

拦截效果

非法请求拦截(Ajax形式和正常跳转形式)
在这里插入图片描述

功能

  1. 拦截非登陆用户的请求操作
  2. 拦截非登陆用户的Ajax操作

正文

(非Ajax)我们将未登录状态下的请求都视为非法访问。那我们是如何知道一个用户是否登录呢?
这里是将登录成功之后的用户信息存入session域中,Key为user。我们的Filter过滤器,通过requerst对象获取session域中的user,如果不为 NULLdoFilter放行。否则就请求转发到登录页面

LoginCheckFilter

package com.filter;

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

public class LoginCheckFilter implements Filter {
    private String excludedPages;
    private String[] excludedPageArray;
    @Override
    public void init(FilterConfig config) throws ServletException {
        excludedPages = config.getInitParameter("excludedPages");
        if (null != excludedPages && excludedPages.length() > 0) {
            excludedPageArray = excludedPages.split(",");
        }
        return;
    }
    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        boolean isExcludedPage = false;
        HttpSession session = ((HttpServletRequest) req).getSession();
        Object user = session.getAttribute("user");
        // 获取不过滤的列表
        for (String page : excludedPageArray) {
            if (((HttpServletRequest) req).getServletPath().equals(page)) {
                isExcludedPage = true;
                break;
            }
        }
        if (isExcludedPage) { //如果有不过滤的页面,放行
            chain.doFilter(req, resp);
        } else {
            if (user != null){
                chain.doFilter(req,resp);
            }else {
                ((HttpServletRequest)req).getRequestDispatcher("/login.jsp").forward(req,resp);
            }
        }

    }
    @Override
    public void destroy() {
    }
}

AjaxIllegalReqFilter

(Ajax)有关处理Ajax请求的非法操作,在此之前我们需要判断请求是否为Ajax请求。这个思路就是:Ajax请求都会携带一个标识Ajax的请求头信息,我们借此来判断是否为Ajax请求
关键代码:

 if (((HttpServletRequest) req).getHeader("x-requested-with")!=null && ((HttpServletRequest) req).getHeader("x-requested-with").equals("XMLHttpRequest")){
                isAjaxRequest = true;
            }

判断用户是否登录这一步是和非Ajax一样的。唯一不同的是,如果用户没有登录,这里采用的不是请求转发到登录页面,因为Ajax请求无法进行页面的请求转发。我们这里采用的是通过后端返回json字符串,前端进行页面的跳转。
相关代码:

// 拦截未登录用户添加购物车
if ("AjaxError" == data){
    window.location.href="/MyProject/login.jsp";
}
package com.filter;

import com.google.gson.Gson;

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

public class AjaxIllegalReqFilter implements Filter {
    private String excludedPages;
    private String[] excludedPageArray;
    @Override
    public void init(FilterConfig config) throws ServletException {
        excludedPages = config.getInitParameter("excludedPages");
        if (null != excludedPages && excludedPages.length() > 0) {
            excludedPageArray = excludedPages.split(",");
        }
        return;
    }

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
        boolean isExcludedPage = false;
        HttpServletRequest request = ((HttpServletRequest)req);
        HttpServletResponse response = ((HttpServletResponse)resp);
        boolean isAjaxRequest = false;
        // 获取不过滤的列表
        for (String page : excludedPageArray) {
            if (((HttpServletRequest) req).getServletPath().equals(page)) {
                isExcludedPage = true;
                break;
            }
        }

        if (isExcludedPage) { //如果有不需要过滤的页面,放行
            chain.doFilter(req, resp);
        } else {
            // Ajax请求非法登录处理
            if (((HttpServletRequest) req).getHeader("x-requested-with")!=null && ((HttpServletRequest) req).getHeader("x-requested-with").equals("XMLHttpRequest")){
                isAjaxRequest = true;
            }
            // 如果是Ajxa请求
            HttpSession session = request.getSession();
            Object user = session.getAttribute("user");
            if (isAjaxRequest && user==null){
                response.getWriter().write(new Gson().toJson("AjaxError"));
                return;
            }else {
                chain.doFilter(req, resp);
            }
        }
    }
    @Override
    public void destroy() {
    }
}

web.XMl

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
         version="4.0">
    <!--非法访问过滤器-->
    <filter>
        <filter-name>filter.LoginCheckFilter</filter-name>
        <filter-class>com.filter.LoginCheckFilter</filter-class>
        <!--过滤排除-->
        <init-param>
            <param-name>excludedPages</param-name>
            <param-value>/simpleImg,/index.jsp,/login.jsp,/login_new.jsp</param-value><!-- 匹配不做拦截的请求声明-->
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>filter.LoginCheckFilter</filter-name>
        <url-pattern>*.jsp</url-pattern>
    </filter-mapping>

    <!--Ajax过滤器-->
    <filter>
        <filter-name>AjaxIllegalReqFilter</filter-name>
        <filter-class>com.filter.AjaxIllegalReqFilter</filter-class>
        <!--过滤排除-->
        <init-param>
            <param-name>excludedPages</param-name>
            <param-value>/checkSecurityCode,/orderProcessServlet,/userProcessServlet</param-value><!-- 匹配不做拦截的请求声明-->
        </init-param>
    </filter>
    <filter-mapping>
        <filter-name>AjaxIllegalReqFilter</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</servlet-mapping>

过滤页面的排除(指定URL的排除)

到这里我们会发现,两个过滤器的url-pattern都是/*,即:拦截所有的Ajax请求非Ajax请求。所以这里我们需要对有些页面,进行过滤排除(对有些页面不进行过滤)。
思路:

  1. 我们在过滤器里边定义两个属性
private String excludedPages; // 存储读取到的排除页面URI
private String[] excludedPageArray; // 存储需要排除页面的URI集合
  1. 利用init()方法来读取web.xml配置文件的相关参数。将需要排除的URI都存进excludedPageArray数组
@Override
public void init(FilterConfig config) throws ServletException {
    excludedPages = config.getInitParameter("excludedPages");
    if (null != excludedPages && excludedPages.length() > 0) {
        excludedPageArray = excludedPages.split(",");
    }
    return;
}
  1. 对需要排除的页面/请求进行放行。
@Override
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws ServletException, IOException {
    boolean isExcludedPage = false;
    HttpSession session = ((HttpServletRequest) req).getSession();
    Object user = session.getAttribute("user");
    // 获取不过滤的列表
    for (String page : excludedPageArray) {
        if (((HttpServletRequest) req).getServletPath().equals(page)) {
            isExcludedPage = true;
            break;
        }
    }
    if (isExcludedPage) { //如果有不过滤的页面,放行
        chain.doFilter(req, resp);
    } else {
      // 需要处理的业务逻辑代码
    }

}
  1. 放行参数的设置

web.xml文件配置Filter的初始化参数中设置需要放行的URI。每个URI以 ,逗号间隔。

 <!--过滤排除-->
<init-param>
      <param-name>excludedPages</param-name>
      <param-value>/simpleImg,/index.jsp,/login.jsp,/login_new.jsp</param-value><!-- 匹配不做拦截的请求声明-->
</init-param>
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
引用中的代码展示了一个名为SysFilter的Java类,该类实现了Filter接口,用于进行登录拦截过滤器。该过滤器的作用主要是拦截用户访问网站或管理员中心的请求,并根据用户登录状态做出不同的响应。如果用户没有登录,则会将其重定向到错误页面;如果用户登录但不是管理员,则同样不能进入管理员中心。 引用中提到了过滤器的一些常见用途,其中包括处理请求字符集、控制网页资源的访问权限以及敏感词屏蔽等功能。 过滤器的工作流程一般包括三个步骤:初始化(init)、拦截请求并处理(doFilter)、销毁(destroy)。在初始化阶段,可以进行一些必要的配置操作。在拦截请求并处理的阶段,可以对请求进行必要的验证、修改或重定向等操作。在销毁阶段,可以进行一些资源的释放或清理操作。 要实现一个登录拦截过滤器,可以按照以下步骤进行: 1. 创建一个过滤器类,实现Filter接口,并完善其中的init、doFilter等方法。特别是在doFilter方法中,根据需要进行登录状态的判断和响应处理。 2. 如果使用注解的方式进行配置,可以在过滤器实现类的开头添加@WebFilter注解;如果使用web.xml进行配置,可以像配置Servlet一样进行配置。 3. 在过滤器中实现相应的登录拦截逻辑,根据用户登录状态进行不同的处理,如重定向到登录页面或错误页面。 这样,当用户访问需要登录才能访问的网页资源时,过滤器拦截请求并进行相应的登录拦截处理。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* [javaweb网站登录框架实现:使用Filter过滤器实现登录拦截+使用JavaScript实现登录限制等(分管理员和用户)](https://blog.csdn.net/Xmumu_/article/details/120919687)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] - *2* *3* [【JavaWeb】用过滤器实现字符集设置和登录拦截](https://blog.csdn.net/csdn_inside/article/details/89081938)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v92^chatsearchT3_1"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

艺术留白

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

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

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

打赏作者

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

抵扣说明:

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

余额充值