servlet实现简单的权限管理和敏感词过滤功能

前言

JavaEE课要求用servlet和过滤器实现权限管理和敏感词过滤功能,故有此文。
虽然早已知道了原理和用法,但是实际操作起来还是遇到了各种奇葩的情况。

一、如何实现权限管理

1.思路

当用户访问某个资源时,我们必须对其权限控制,所以得用到servlet中过滤器来对请求做一次预处理,判断该用户是否有权限访问该资源,如果有则放行;如果没有则返回拒绝访问的通知。

那么我们如何判断该用户是否有权限访问呢?
这就要求我们在用户登录的时候保存其登录状态。

可我们知道http请求是无状态的,即这次请求无法知道上一次请求的内容,那如何保存这个登录状态呢?

这就需要要用到Session/Cookie机制(这里我就不多介绍了,感兴趣的可以去百度,当然我在手把手教你用Java实现一套简单的鉴权服务(SpringBoot,SSM)(万字长文)这篇博文中说的很详细了,感兴趣的同学可以去看看)。

既然如此,那么我们在登录成功的时候就把用户的信息存入到服务器的session中,等用户下次访问的时候,我们就知道是哪位用户以及这位用户有没有权限访问了。

至此我们便实现了简单的权限控制。

但是这里有个地方需要注意,就是过滤器在拦截时需要排除一些路径,比如登录页面,比如静态资源。这个有很多方法,我采取的是我认为比较简单的方法,具体实现在下文。

2.代码实现

①登录页面




    
    后台管理-登陆
    
    
    
    
    
    
    
    
    


因为上面我并没有给出图片,css等静态资源,所以直接复制是没有我这里的效果的。

下面这样也是可以的,




    
    用户登录


用户名: 密码:

②登录Servlet类

具体验证的逻辑我这里就不放了。这里登录成功会将用户名存入session,并自动跳转首页。

package com.dreamchaser.loginTest.servlet;

import com.dreamchaser.loginTest.mapper.UserMapper;

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

public class LoginServlet extends HttpServlet {
    static UserMapper userMapper=UserMapper.getUserMapper();

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

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        String uname=req.getParameter("uname");
        String pwd=req.getParameter("pwd");
        ServletOutputStream outputStream = resp.getOutputStream();
        String result;
        if (pwd.equals(userMapper.getPwdByName(uname))){
            req.getSession().setAttribute("user",uname);
            resp.sendRedirect("/index.html");
        }else {
            //响应
            result="登录失败";
            outputStream.write(result.getBytes());
        }
    }
}

③UserFilter过滤器

因为该过滤器配置的路径是/*,即全部路径,但是我们不想拦截一些路径,比如登录页面,静态资源,所以我们在操作前进行一次判断,避免这些路径的处理。

注:innit方法会将配置中排除的路径读取过来,当然你也可以写在程序里

package com.dreamchaser.loginTest.filter;

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

public class UserFilter implements Filter {

    private List excludedUrls;

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
            throws IOException, ServletException {
        // 将req resp 转为子接口的类型
        HttpServletRequest request = (HttpServletRequest)req;
        HttpServletResponse response = (HttpServletResponse)resp;
        String path = request.getServletPath();

        if(!excludedUrls.contains(path)&&!(path.length()>8&&"/static/".equals(path.substring(0,8))))
        {
            if (request.getSession().getAttribute("user")==null){
               response.sendRedirect("/pages/login.html");
            }
        }
        chain.doFilter(req, resp);
    }

    @Override
    public void init(FilterConfig filterConfig) throws ServletException {
        String excludePattern = filterConfig.getInitParameter("excludedUrls");
        excludedUrls = Arrays.asList(excludePattern.split(","));
    }

    @Override
    public void destroy() {
    }
}

④web.xml配置项

init-param标签里存放的是排除在外的路径,这个是自己定义的。


    LoginServlet
    com.dreamchaser.loginTest.servlet.LoginServlet
  
  
    LoginServlet
    /login
  

  
    UserFilter
    com.dreamchaser.loginTest.filter.UserFilter
    
      excludedUrls
      /pages/login.html,/register.html,/login
    

  
  
    UserFilter
    /*
  

二、敏感词过滤

1.思路

利用过滤器提前对请求里要过滤的属性进行处理,但是因为没有setParameter方法(这是故意的,设计者就是不想让我们直接修改),所以我们为了存放过滤后的信息,可以把过滤后的信息放在attribute中,然后servlet直接获取即可。(当然也可以重写一个Request类,那个比较麻烦,感兴趣的自行百度)

2.代码实现

①敏感词过滤页




    
    Title


    
请输入你要说的垃圾话:

②WordServlet类

从attribute中获取过滤后的字符串后返回。

package com.dreamchaser.loginTest.servlet;

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

/**
 * 需要敏感词过滤的接口
 */
public class WordServlet extends HttpServlet {

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

    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        //因为servlet并没有setParameter方法(这是故意的),所以过滤后word无法通过getparameter来获取
        //所以一般有两种方法一种把它放在attribute里,一种重写Request类,不过这会很麻烦
        String word= String.valueOf(req.getAttribute("word"));
        ServletOutputStream outputStream = resp.getOutputStream();
        String result="词汇已净化,请放心食用:"+word;
        outputStream.write(result.getBytes());
    }
}

③WordFilter过滤器类

静态常量sensitiveWords中存放的是需要过滤的字符串,harmoniousWord是过滤后的词汇。
这里就是对需要过滤的借口提前进行处理,把敏感词换成注入“***”这样的字符串,然后存放在attribute中。

package com.dreamchaser.loginTest.filter;


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

/**
 * 敏感词过滤拦截器
 */
public class WordFilter implements Filter {
    static final String[] sensitiveWords={"敏感词1","脏话","骂人"};
    static final String harmoniousWord="***";

    @Override
    public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain) throws IOException, ServletException {
        req.setCharacterEncoding("utf-8");
        // 将req resp 转为子接口的类型
        HttpServletRequest request = (HttpServletRequest)req;
        HttpServletResponse response = (HttpServletResponse)resp;
        String word=req.getParameter("word");
        for (String s:sensitiveWords){
            word=word.replaceAll(s,harmoniousWord);
        }
        request.setAttribute("word",word);
        chain.doFilter(req, resp);
    }
}

web.xml配置项


    WordServlet
    com.dreamchaser.loginTest.servlet.WordServlet
  
  
    WordServlet
    /word
  

  
    WordFilter
    com.dreamchaser.loginTest.filter.WordFilter
  
  
    WordFilter
    /word
  

三、效果展示

1.未登录访问其他资源

自动跳转至登录页

servlet实现简单的权限管理和敏感词过滤功能_第1张图片

2.密码错误,登录失败

servlet实现简单的权限管理和敏感词过滤功能_第2张图片

3.密码正确,自动跳转首页

servlet实现简单的权限管理和敏感词过滤功能_第3张图片

4.刷新首页,不会跳转

servlet实现简单的权限管理和敏感词过滤功能_第4张图片

5.敏感词过滤

servlet实现简单的权限管理和敏感词过滤功能_第5张图片

处理后返回结果

servlet实现简单的权限管理和敏感词过滤功能_第6张图片

注:代码已开源至gitee,地址

到此这篇关于servlet实现简单的权限管理和敏感词过滤功能的文章就介绍到这了,更多相关servlet 权限管理和敏感词过滤内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

你可能感兴趣的:(servlet实现简单的权限管理和敏感词过滤功能)