- 一、过滤器和拦截器的区别
- 二、配置拦截器
- 一、实现访问以登录界面地址跳转到登录界面
- 1、在springmvc-servlet中,配置拦截器
- 2、在cn.smbms下,创建一个包,interceptor——再创建LoginInterceptor类,
- 3、起初,未登录的跳转界面地址,是
- 来到CommonController中,查看路径,将登录地址修改为
- 二、实现删除时的权限,只有管理员能操作,其他人无权访问
- 1、再实现此功能之前,先用mybatis实现删除功能和添加功能;
- 2、然后来开始拦截删除,判断权限
- 3、在interceptor包下创建deleteInterceptor类,进行删除拦截
- 4、新建一个401界面,先来到CommonController中,添加删除权限
- 5、在jsp包中创建一个401.jsp,
一、过滤器和拦截器的区别
https://blog.csdn.net/zxd1435513775/article/details/80556034
(1)、Filter需要在web.xml中配置,依赖于Servlet;
(2)、Interceptor需要在SpringMVC中配置,依赖于框架;
(3)、Filter的执行顺序在Interceptor之前,具体的流程见下图;
(4)、两者的本质区别:拦截器(Interceptor)是基于Java的反射机制,而过滤器(Filter)是基于函数回调。从灵活性上说拦截器功能更强大些,Filter能做的事情,都能做,而且可以在请求前,请求后执行,比较灵活。Filter主要是针对URL地址做一个编码的事情、过滤掉没用的参数、安全校验(比较泛的,比如登录不登录之类),太细的话,还是建议用interceptor。不过还是根据不同情况选择合适的。
二、配置拦截器
一、实现访问以登录界面地址跳转到登录界面
1、在springmvc-servlet中,配置拦截器
实现登录的时候,B页面粘贴A页面登录的地址,不能直接打开,而是被拦截,跳转到登录界面;
<!-- 配置拦截器,优化当前页退出系统,别的页面还能打开地址 只要是user下的地址都拦截掉 -->
<mvc:interceptors>
<mvc:interceptor>
<mvc:mapping path="/user/**"/>
<bean class="cn.smbms.interceptor.LoginInterceptor"></bean>
</mvc:interceptor>
</mvc:interceptors>
2、在cn.smbms下,创建一个包,interceptor——再创建LoginInterceptor类,
继承父类HandlerInterceptorAdapter。添加未实现的方法,preHandle;
package cn.smbms.interceptor;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import org.springframework.web.servlet.ModelAndView;
import org.springframework.web.servlet.handler.HandlerInterceptorAdapter;
import cn.smbms.tools.Constants;
//登录拦截器
public class LoginInterceptor extends HandlerInterceptorAdapter {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)
throws Exception {
System.out.println("----测试是否走到这----");
// 登录拦截,直接访问内部页面没有登录进行拦截跳转到登录页
//如何判断是否已经登录网页?就要判断session中的内容
HttpSession session = request.getSession();
if(session.getAttribute(Constants.USER_SESSION) == null ){
//未登录,要跳转到登录界面
response.sendRedirect(request.getContextPath()+"/common/login.html");
return false;
}
return true;
}
}
3、起初,未登录的跳转界面地址,是
来到CommonController中,查看路径,将登录地址修改为
二、实现删除时的权限,只有管理员能操作,其他人无权访问
1、再实现此功能之前,先用mybatis实现删除功能和添加功能;
找到UserDaoImpl中的deleteUserById方法,复制SQL语句,然后在UserMapper.xml中,写入删除条件,
<delete id="deleteUserById" parameterType="int">
delete from smbms_user where id=#{id}
</delete>
//添加功能一并实现
<insert id="add" parameterType="User">
insert into smbms_user(userCode,userName,userPassword,
gender,birthday,phone,address,userRole,createdBy,creationDate,idPicPath)
value(#{userCode},#{userName},#{userPassword},#{gender},#{birthday},
#{phone},#{address},#{userRole},#{createdBy},#{creationDate},#{idPicPath})
</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";
}