Filter的应用与项目批量删除和角色权限管理功能实现

1、Filter过滤器简述与功能实现思路

(1)、filter功能:它使用户可以改变一个 request和修改一个response,Filter不是一个servlet,它不能产生一个response,它能够在一个request到达servlet之前预处理request,也可以在离开 servlet时处理response。换种说法,filter其实是一个”servlet chaining”(servlet 链)

   一个filter 包括:
   1. 在servlet被调用之前截获;
   2. 在servlet被调用之前检查servlet request;
   3. 根据需要修改request头和request数据;
   4. 根据需要修改response头和response数据;
   5. 在servlet被调用之后截获

(2)、功能实现思路:使用filter功能可以实现项目的非法登录拦截,即不进行正确的登录操作无法直接跳转到之后的操作页面;批量删除操作的实现可以提取出用户要删除的数据的ID,然后形成一个集合返回,最后在数据库中删掉这个集合中的信息即可;角色权限功能主要是给每个用户分配不同的权限功能,如管理员权限和普通成员权限等,也会涉及到数据库的操作。

2、Filter过滤器实现

①、定义登录Filter类继承Filter接口,通过重写doFilter方法对用户发送的各种请求进行拦截或处理操作

public class LoginFilter implements Filter {
    @Override
    public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
        //获取用户发送的请求
        HttpServletRequest request=(HttpServletRequest) servletRequest;
        HttpServletResponse response=(HttpServletResponse) servletResponse;
        //提取
        HttpSession session=request.getSession();
        User user=(User)session.getAttribute("user");

        String uri=request.getRequestURI();
        if (user==null&&uri.indexOf("login.do")==-1) {
            //没有进行登录操作时重定向到登录界面
            response.sendRedirect(request.getContextPath()+"../login.jsp");
        }else {
            //进行请求处理
            filterChain.doFilter(request,response);
        }

    }

②、在web.xml中添加过滤器

  <filter>
    <filter-name>loginFilter</filter-name>
    <filter-class>com.github.dragon.filter.LoginFilter</filter-class>
  </filter>
  <filter-mapping>
    <filter-name>loginFilter</filter-name>
<!--    拦截有do的请求-->
    <url-pattern>*.do</url-pattern>
  </filter-mapping>

3、批量删除功能的实现

①、在用户DAO和用户Service接口中添加按照用户ID进行批量删除的方法接口void deleteAll(@Param("ids")List<Integer> ids);

②、在UserMapper中添加数据库批量删除的语句

    <delete id="deleteAll" parameterType="list">
        delete from tb_user where id in
        <foreach collection="ids" item="id" open="(" close=")" separator=",">
            #{id}
        </foreach>
    </delete>

③、实现deleteAll接口方法

    @RequestMapping("deleteAll.do")
    public String deleteAll(String userList){
        String[] str=userList.split(",");
        List<Integer> ids=new ArrayList<>();
        for (String s:str){
            ids.add(Integer.parseInt(s));
        }
        userService.deleteAll(ids);
        return "redirect:findAll.do";
    }

4、角色权限管理功能的实现

①、创建用户角色实体UserRole:包含用户的ID与对应的角色ID信息,创建默认角色实体Role:包含不同的角色的信息与描述

②、新建角色DAO接口,创建三个方法接口

public interface RoleDao {
    List<Integer> findRoleIdByUserId(int userId);//查找roleID

    List<Role> findRoleByUserId(int idd);//查找对应角色信息

    void addRole(UserRole userRole);//添加角色信息
}

③、创建新的Service接口,其中方法与DAO接口的相同;并新建一个Impl类实现这些方法

@Service
public class RoleServiceImpl  implements RoleService {
    @Autowired
    private RoleDao roleDao;

    @Override
    public List<Integer> findRoleId(int userId) {
        return roleDao.findRoleIdByUserId(userId);
    }

    @Override
    public List<Role> findRoleByUserId(int id) {
        return roleDao.findRoleByUserId(id);
    }

    @Override
    public void add(List<Integer> ids, String userId) {
        for (int roleId:ids){
            UserRole userRole=new UserRole();
            userRole.setUserId(Integer.parseInt(userId));
            userRole.setRoleId(roleId);
            roleDao.addRole(userRole);
        }
    }
}

④、新建一个角色Mapper.xml存放对两个数据表(角色与用户角色)的操作

    <select id="findRoleIdByUserId" parameterType="int" resultType="int">
        select roleId from user_role where userId=#{userId}
    </select>
    <select id="findRoleByUserId" parameterType="int" resultType="role">
        select * from tb_role where id not in(select roleId from user_role where userId=#{id})
    </select>
    <insert id="addRole" parameterType="userRole">
        insert into user_role(userId,roleId) values (#{userId},#{roleId})
    </insert>

⑤、在Controller类中实现数据库的角色读取操作与在界面添加角色的操作

    @RequestMapping("toAddRole.do")
    public ModelAndView toAddRole(int id){
        List<Role> roleList=roleService.findRoleByUserId(id);
        ModelAndView mv=new ModelAndView();
        mv.addObject("roles",roleList);
        mv.addObject("id",id);
        mv.setViewName("user-role-add");
        return mv;
    }
    @RequestMapping("addRole.do")
    @ResponseBody
    public String add(String roleList,String userId){
        String[] strs =roleList.split(",");
        List<Integer> ids=new ArrayList<>();
        for (String s:strs) {
            ids.add(Integer.parseInt(s));
        }
        roleService.add(ids,userId);
        return "";
    }

⑥、修改登录方法,使用户在登录成功即保存到用户的角色信息

//写在登录成功的逻辑中
List<Integer> roleIds=roleService.findRoleId(id); //存储角色信息 session.setAttribute("roleIds",roleIds); session.setAttribute("user",user);

猜你喜欢

转载自www.cnblogs.com/dragon-wxl/p/13372318.html