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方法對使用者傳送的各種請求進行攔截或處理操作
publicclass 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);