一、过滤器和拦截器的区别

https://blog.csdn.net/zxd1435513775/article/details/80556034
(1)、Filter需要在web.xml中配置,依赖于Servlet;
(2)、Interceptor需要在SpringMVC中配置,依赖于框架;
(3)、Filter的执行顺序在Interceptor之前,具体的流程见下图;
image.png
(4)、两者的本质区别:拦截器(Interceptor)是基于Java的反射机制,而过滤器(Filter)是基于函数回调。从灵活性上说拦截器功能更强大些,Filter能做的事情,都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用interceptor。不过还是根据不同情况选择合适的。

二、配置拦截器

一、实现访问以登录界面地址跳转到登录界面

1、在springmvc-servlet中,配置拦截器

实现登录的时候,B页面粘贴A页面登录的地址,不能直接打开,而是被拦截,跳转到登录界面;

  1. <!-- 配置拦截器,优化当前页退出系统,别的页面还能打开地址 只要是user下的地址都拦截掉 -->
  2. <mvc:interceptors>
  3. <mvc:interceptor>
  4. <mvc:mapping path="/user/**"/>
  5. <bean class="cn.smbms.interceptor.LoginInterceptor"></bean>
  6. </mvc:interceptor>
  7. </mvc:interceptors>

2、在cn.smbms下,创建一个包,interceptor——再创建LoginInterceptor类,

继承父类HandlerInterceptorAdapter。添加未实现的方法,preHandle;

  1. package cn.smbms.interceptor;
  2. import javax.servlet.http.HttpServletRequest;
  3. import javax.servlet.http.HttpServletResponse;
  4. import javax.servlet.http.HttpSession;
  5. import org.springframework.web.servlet.ModelAndView;
  6. import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
  7. import cn.smbms.tools.Constants;
  8. //登录拦截器
  9. public class LoginInterceptor extends HandlerInterceptorAdapter {
  10. @Override
  11. public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
  12. throws Exception {
  13. System.out.println("----测试是否走到这----");
  14. // 登录拦截,直接访问内部页面没有登录进行拦截跳转到登录页
  15. //如何判断是否已经登录网页?就要判断session中的内容
  16. HttpSession session = request.getSession();
  17. if(session.getAttribute(Constants.USER_SESSION) == null ){
  18. //未登录,要跳转到登录界面
  19. response.sendRedirect(request.getContextPath()+"/common/login.html");
  20. return false;
  21. }
  22. return true;
  23. }
  24. }

3、起初,未登录的跳转界面地址,是

image.png

来到CommonController中,查看路径,将登录地址修改为

image.png

二、实现删除时的权限,只有管理员能操作,其他人无权访问

1、再实现此功能之前,先用mybatis实现删除功能和添加功能;

找到UserDaoImpl中的deleteUserById方法,复制SQL语句,然后在UserMapper.xml中,写入删除条件,

  1. <delete id="deleteUserById" parameterType="int">
  2. delete from smbms_user where id=#{id}
  3. </delete>
  4. //添加功能一并实现
  5. <insert id="add" parameterType="User">
  6. insert into smbms_user(userCode,userName,userPassword,
  7. gender,birthday,phone,address,userRole,createdBy,creationDate,idPicPath)
  8. value(#{userCode},#{userName},#{userPassword},#{gender},#{birthday},
  9. #{phone},#{address},#{userRole},#{createdBy},#{creationDate},#{idPicPath})
  10. </insert>

然后抽接口

//删除
    public int deleteUserById(Integer id);
    //添加
    public int add(User user);

然后到UserServiceImpl中,找到deleteUserById方法,修改,找到add方法,也一并修改为mybatis模式

@Override
    public boolean deleteUserById(Integer delId) {
        // TODO Auto-generated method stub
//        Connection connection = null;
//        boolean flag = false;
//        try {
//            connection = BaseDao.getConnection();
//            if(userDao.deleteUserById(connection,delId) > 0)
//                flag = true;
//        } catch (Exception e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//        }finally{
//            BaseDao.closeResource(connection, null, null);
//        }
//        return flag;
        int i = userMapper.deleteUserById(delId);
        if(i>0){
            return true;
        }
        return false;
    }
@Override
    public boolean add(User user) {
//        // TODO Auto-generated method stub
//        
//        boolean flag = false;
//        Connection connection = null;
//        try {
//            connection = BaseDao.getConnection();
//            connection.setAutoCommit(false);//开启JDBC事务管理
//            int updateRows = userDao.add(connection,user);
//            connection.commit();
//            if(updateRows > 0){
//                flag = true;
//                System.out.println("add success!");
//            }else{
//                System.out.println("add failed!");
//            }
//            
//        } catch (Exception e) {
//            // TODO Auto-generated catch block
//            e.printStackTrace();
//            try {
//                System.out.println("rollback==================");
//                connection.rollback();
//            } catch (SQLException e1) {
//                // TODO Auto-generated catch block
//                e1.printStackTrace();
//            }
//        }finally{
//            //在service层进行connection连接的关闭
//            BaseDao.closeResource(connection, null, null);
//        }
//        return flag;
        //maybatis方式
        int i =userMapper.add(user);
        if(i>0){
            return true;
        }
        return false;
    }

至此,删除和添加功能都好用

2、然后来开始拦截删除,判断权限

也是在springmvc-servlet中,配置拦截器,

<!-- 配置拦截器,优化当前页退出系统,别的页面还能打开地址   只要是user下的地址都拦截掉 -->
      <mvc:interceptors>
         <mvc:interceptor>
             <mvc:mapping path="/user/**"/>
             <bean class="cn.smbms.interceptor.LoginInterceptor"></bean>
         </mvc:interceptor>
         <mvc:interceptor>
        //拦截到Controller中的deleteUser
             <mvc:mapping path="/user/deleteUser/**"/>
             <bean class="cn.smbms.interceptor.deleteInterceptor"></bean>
         </mvc:interceptor>
     </mvc:interceptors>

3、在interceptor包下创建deleteInterceptor类,进行删除拦截

package cn.smbms.interceptor;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;

import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;

import cn.smbms.pojo.User;
import cn.smbms.tools.Constants;

public class deleteInterceptor extends HandlerInterceptorAdapter {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
            throws Exception {    
        // 点击删除按钮时候,拦截,只允许管理员操作
        HttpSession session = request.getSession();
        User user = (User)session.getAttribute(Constants.USER_SESSION);
        if(user.getUserRole() == null || user.getUserRole() != 1){
            //没权限
            response.sendRedirect(request.getContextPath()+"/common/401.html");
            return false;
        }
        return true;
    }
}

4、新建一个401界面,先来到CommonController中,添加删除权限

//删除权限
        @RequestMapping("/401.html")
        public String deleteUser(){
            return "401";
        }

5、在jsp包中创建一个401.jsp,

image.png