1. 程式人生 > 實用技巧 >Filter的應用與專案批量刪除和角色許可權管理功能實現

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);