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